diff --git a/.github/actions/build-chainlink-image/action.yml b/.github/actions/build-chainlink-image/action.yml
index d5839cc79bf..644c109ab24 100644
--- a/.github/actions/build-chainlink-image/action.yml
+++ b/.github/actions/build-chainlink-image/action.yml
@@ -25,7 +25,7 @@ runs:
steps:
- name: Check if image exists
id: check-image
- uses: smartcontractkit/chainlink-github-actions/docker/image-exists@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/docker/image-exists@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
repository: chainlink
tag: ${{ inputs.git_commit_sha }}${{ inputs.tag_suffix }}
@@ -33,7 +33,7 @@ runs:
AWS_ROLE_TO_ASSUME: ${{ inputs.AWS_ROLE_TO_ASSUME }}
- name: Build Image
if: steps.check-image.outputs.exists == 'false'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-image@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-image@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
cl_repo: smartcontractkit/chainlink
cl_ref: ${{ inputs.git_commit_sha }}
diff --git a/.github/actions/build-test-image/action.yml b/.github/actions/build-test-image/action.yml
index 1cd1dd8b939..0c48c43b772 100644
--- a/.github/actions/build-test-image/action.yml
+++ b/.github/actions/build-test-image/action.yml
@@ -34,7 +34,7 @@ runs:
# Base Test Image Logic
- name: Get CTF Version
id: version
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/mod-version@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/mod-version@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
go-project-path: ./integration-tests
module-name: github.com/smartcontractkit/chainlink-testing-framework
@@ -71,7 +71,7 @@ runs:
- name: Check if test base image exists
if: steps.version.outputs.is_semantic == 'false'
id: check-base-image
- uses: smartcontractkit/chainlink-github-actions/docker/image-exists@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/docker/image-exists@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
repository: ${{ inputs.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ inputs.QA_AWS_REGION }}.amazonaws.com/test-base-image
tag: ${{ steps.long_sha.outputs.long_sha }}
@@ -79,7 +79,7 @@ runs:
AWS_ROLE_TO_ASSUME: ${{ inputs.QA_AWS_ROLE_TO_ASSUME }}
- name: Build Base Image
if: steps.version.outputs.is_semantic == 'false' && steps.check-base-image.outputs.exists == 'false'
- uses: smartcontractkit/chainlink-github-actions/docker/build-push@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/docker/build-push@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
env:
BASE_IMAGE_NAME: ${{ inputs.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ inputs.QA_AWS_REGION }}.amazonaws.com/test-base-image:${{ steps.long_sha.outputs.long_sha }}
with:
@@ -92,7 +92,7 @@ runs:
# Test Runner Logic
- name: Check if image exists
id: check-image
- uses: smartcontractkit/chainlink-github-actions/docker/image-exists@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/docker/image-exists@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
repository: ${{ inputs.repository }}
tag: ${{ inputs.tag }}
@@ -100,7 +100,7 @@ runs:
AWS_ROLE_TO_ASSUME: ${{ inputs.QA_AWS_ROLE_TO_ASSUME }}
- name: Build and Publish Test Runner
if: steps.check-image.outputs.exists == 'false'
- uses: smartcontractkit/chainlink-github-actions/docker/build-push@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/docker/build-push@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
tags: |
${{ inputs.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ inputs.QA_AWS_REGION }}.amazonaws.com/${{ inputs.repository }}:${{ inputs.tag }}
diff --git a/.github/actions/version-file-bump/action.yml b/.github/actions/version-file-bump/action.yml
index 20832174003..241b0f5a78c 100644
--- a/.github/actions/version-file-bump/action.yml
+++ b/.github/actions/version-file-bump/action.yml
@@ -31,7 +31,7 @@ runs:
current_version=$(head -n1 ./VERSION)
echo "current_version=${current_version}" | tee -a "$GITHUB_OUTPUT"
- name: Compare semantic versions
- uses: smartcontractkit/chainlink-github-actions/semver-compare@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/semver-compare@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
id: compare
with:
version1: ${{ steps.get-current-version.outputs.current_version }}
diff --git a/.github/workflows/automation-benchmark-tests.yml b/.github/workflows/automation-benchmark-tests.yml
index 985209405e1..70725511883 100644
--- a/.github/workflows/automation-benchmark-tests.yml
+++ b/.github/workflows/automation-benchmark-tests.yml
@@ -66,7 +66,7 @@ jobs:
QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
suites: benchmark load/automationv2_1 chaos reorg
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
env:
DETACH_RUNNER: true
TEST_SUITE: benchmark
@@ -89,9 +89,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Automation Benchmark Test
continue-on-error: true
diff --git a/.github/workflows/automation-load-tests.yml b/.github/workflows/automation-load-tests.yml
index 320409e8e72..ad68e470a4d 100644
--- a/.github/workflows/automation-load-tests.yml
+++ b/.github/workflows/automation-load-tests.yml
@@ -82,7 +82,7 @@ jobs:
QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
suites: benchmark load/automationv2_1 chaos reorg
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
env:
RR_CPU: 4000m
RR_MEM: 4Gi
@@ -107,9 +107,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Automation Load Test
continue-on-error: true
diff --git a/.github/workflows/automation-nightly-tests.yml b/.github/workflows/automation-nightly-tests.yml
index c5e7b108d85..5fb8a8f87d1 100644
--- a/.github/workflows/automation-nightly-tests.yml
+++ b/.github/workflows/automation-nightly-tests.yml
@@ -21,10 +21,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Chainlink Image
continue-on-error: true
- name: Checkout the repo
@@ -81,7 +82,7 @@ jobs:
upgradeImage: ${{ env.CHAINLINK_IMAGE }}
upgradeVersion: ${{ github.sha }}
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
env:
TEST_SUITE: ${{ matrix.tests.suite }}
with:
@@ -108,10 +109,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Automation ${{ matrix.tests.name }} Test
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}'
continue-on-error: true
diff --git a/.github/workflows/automation-ondemand-tests.yml b/.github/workflows/automation-ondemand-tests.yml
index a8fcde6e226..a996399b93d 100644
--- a/.github/workflows/automation-ondemand-tests.yml
+++ b/.github/workflows/automation-ondemand-tests.yml
@@ -46,10 +46,11 @@ jobs:
- name: Collect Metrics
if: inputs.chainlinkImage == ''
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Chainlink Image ${{ matrix.image.name }}
continue-on-error: true
- name: Checkout the repo
@@ -59,7 +60,7 @@ jobs:
- name: Check if image exists
if: inputs.chainlinkImage == ''
id: check-image
- uses: smartcontractkit/chainlink-github-actions/docker/image-exists@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/docker/image-exists@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
repository: chainlink
tag: ${{ github.sha }}${{ matrix.image.tag-suffix }}
@@ -67,7 +68,7 @@ jobs:
AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
- name: Build Image
if: steps.check-image.outputs.exists == 'false' && inputs.chainlinkImage == ''
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-image@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-image@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
cl_repo: smartcontractkit/chainlink
cl_ref: ${{ github.sha }}
@@ -91,10 +92,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Test Image
continue-on-error: true
- name: Checkout the repo
@@ -223,7 +225,7 @@ jobs:
echo ::add-mask::$BASE64_CONFIG_OVERRIDE
echo "BASE64_CONFIG_OVERRIDE=$BASE64_CONFIG_OVERRIDE" >> $GITHUB_ENV
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
env:
TEST_SUITE: ${{ matrix.tests.suite }}
with:
@@ -250,10 +252,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Automation On Demand ${{ matrix.tests.name }} Test
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}'
continue-on-error: true
diff --git a/.github/workflows/build-publish-develop.yml b/.github/workflows/build-publish-develop.yml
index b8859722378..48cc5df80f3 100644
--- a/.github/workflows/build-publish-develop.yml
+++ b/.github/workflows/build-publish-develop.yml
@@ -58,9 +58,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: push-chainlink-develop ${{ matrix.image.name }}
continue-on-error: true
diff --git a/.github/workflows/build-publish-pr.yml b/.github/workflows/build-publish-pr.yml
index 25ffa394551..a093f86d3de 100644
--- a/.github/workflows/build-publish-pr.yml
+++ b/.github/workflows/build-publish-pr.yml
@@ -32,7 +32,7 @@ jobs:
- name: Check if image exists
id: check-image
- uses: smartcontractkit/chainlink-github-actions/docker/image-exists@912bed7e07a1df4d06ea53a031e9773bb65dc7bd # v2.3.0
+ uses: smartcontractkit/chainlink-github-actions/docker/image-exists@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
repository: ${{ env.ECR_IMAGE_NAME}}
tag: sha-${{ env.GIT_SHORT_SHA }}
@@ -101,9 +101,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: build-publish-untrusted
continue-on-error: true
diff --git a/.github/workflows/build-publish.yml b/.github/workflows/build-publish.yml
index de33663d88d..123ecb5f83f 100644
--- a/.github/workflows/build-publish.yml
+++ b/.github/workflows/build-publish.yml
@@ -53,9 +53,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: build-sign-publish-chainlink
continue-on-error: true
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 6282e2168d8..c4983bfac06 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -23,9 +23,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: build-chainlink
continue-on-error: true
diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml
index c7ca0b880c2..c9f1b3626b5 100644
--- a/.github/workflows/changelog.yml
+++ b/.github/workflows/changelog.yml
@@ -31,9 +31,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Changelog checker
continue-on-error: true
diff --git a/.github/workflows/ci-core.yml b/.github/workflows/ci-core.yml
index 06841454682..78d655d4cd8 100644
--- a/.github/workflows/ci-core.yml
+++ b/.github/workflows/ci-core.yml
@@ -76,6 +76,9 @@ jobs:
pushd $(go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-feeds)
go install ./cmd/chainlink-feeds
popd
+ pushd $(go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-data-streams)
+ go install ./mercury/cmd/chainlink-mercury
+ popd
pushd $(go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-solana)
go install ./pkg/solana/cmd/chainlink-solana
popd
@@ -95,7 +98,7 @@ jobs:
run: ./tools/bin/${{ matrix.cmd }} ./...
- name: Print Filtered Test Results
if: ${{ failure() && matrix.cmd == 'go_core_tests' }}
- uses: smartcontractkit/chainlink-github-actions/go/go-test-results-parsing@a052942591aaa12716eb9835b490d812a77d0831 # v2.3.1
+ uses: smartcontractkit/chainlink-github-actions/go/go-test-results-parsing@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
results-file: ./output.txt
output-file: ./output-short.txt
@@ -128,10 +131,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Core Tests (${{ matrix.cmd }})
test-results-file: '{"testType":"go","filePath":"./output.txt"}'
continue-on-error: true
@@ -228,10 +232,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: SonarQube Scan
continue-on-error: true
@@ -255,6 +260,8 @@ jobs:
uses: ./.github/actions/setup-go
with:
only-modules: "true"
+ - name: Install protoc-gen-go-wsrpc
+ run: curl https://github.com/smartcontractkit/wsrpc/raw/main/cmd/protoc-gen-go-wsrpc/protoc-gen-go-wsrpc --output $HOME/go/bin/protoc-gen-go-wsrpc && chmod +x $HOME/go/bin/protoc-gen-go-wsrpc
- name: Setup NodeJS
uses: ./.github/actions/setup-nodejs
- run: make generate # generate install go deps
@@ -266,9 +273,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Clean Go Tidy & Generate
continue-on-error: true
diff --git a/.github/workflows/ci-scripts.yml b/.github/workflows/ci-scripts.yml
index dd46dfd7799..11bd53ef995 100644
--- a/.github/workflows/ci-scripts.yml
+++ b/.github/workflows/ci-scripts.yml
@@ -37,9 +37,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: test-scripts
continue-on-error: true
diff --git a/.github/workflows/client-compatibility-tests.yml b/.github/workflows/client-compatibility-tests.yml
index a96ace1b5a2..4d895cbfc5b 100644
--- a/.github/workflows/client-compatibility-tests.yml
+++ b/.github/workflows/client-compatibility-tests.yml
@@ -25,10 +25,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Chainlink Image
continue-on-error: true
- name: Checkout the repo
@@ -56,10 +57,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Tests Binary
continue-on-error: true
- name: Checkout the repo
@@ -67,7 +69,7 @@ jobs:
with:
ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }}
- name: Build Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-tests@bce4caa154b1e0e652d042788e14c8870832acd2 # v2.3.0
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_download_vendor_packages_command: cd ./integration-tests && go mod download
token: ${{ secrets.GITHUB_TOKEN }}
@@ -222,7 +224,7 @@ jobs:
echo "BASE64_CONFIG_OVERRIDE=$BASE64_CONFIG_OVERRIDE" >> $GITHUB_ENV
touch .root_dir
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@912bed7e07a1df4d06ea53a031e9773bb65dc7bd # v2.3.0
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout ${{ matrix.timeout }} -test.run ${{ matrix.test }}
binary_name: tests
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 788cf81ad8d..faf35dc7a40 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -45,9 +45,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Analyze ${{ matrix.language }}
continue-on-error: true
diff --git a/.github/workflows/delete-deployments.yml b/.github/workflows/delete-deployments.yml
index dc3c17852b1..6c2aa8482f1 100644
--- a/.github/workflows/delete-deployments.yml
+++ b/.github/workflows/delete-deployments.yml
@@ -24,9 +24,10 @@ jobs:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Clean up integration environment deployments
continue-on-error: true
diff --git a/.github/workflows/dependency-check.yml b/.github/workflows/dependency-check.yml
index 0143042abd9..1ad3c50b351 100644
--- a/.github/workflows/dependency-check.yml
+++ b/.github/workflows/dependency-check.yml
@@ -47,9 +47,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Go
continue-on-error: true
diff --git a/.github/workflows/goreleaser-build-publish-develop.yml b/.github/workflows/goreleaser-build-publish-develop.yml
index ce4d8fa773c..5d4041bbc47 100644
--- a/.github/workflows/goreleaser-build-publish-develop.yml
+++ b/.github/workflows/goreleaser-build-publish-develop.yml
@@ -39,10 +39,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: push-chainlink-develop-goreleaser
continue-on-error: true
diff --git a/.github/workflows/integration-chaos-tests.yml b/.github/workflows/integration-chaos-tests.yml
index d4549793404..8f9e9b030ec 100644
--- a/.github/workflows/integration-chaos-tests.yml
+++ b/.github/workflows/integration-chaos-tests.yml
@@ -29,7 +29,7 @@ jobs:
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Check if image exists
id: check-image
- uses: smartcontractkit/chainlink-github-actions/docker/image-exists@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/docker/image-exists@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
repository: chainlink
tag: ${{ github.sha }}
@@ -37,7 +37,7 @@ jobs:
AWS_ROLE_TO_ASSUME: ${{ secrets.QA_AWS_ROLE_TO_ASSUME }}
- name: Build Image
if: steps.check-image.outputs.exists == 'false'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-image@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-image@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
cl_repo: smartcontractkit/chainlink
cl_ref: ${{ github.sha }}
@@ -52,10 +52,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Chainlink Image
continue-on-error: true
@@ -78,10 +79,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Test Runner Image
continue-on-error: true
@@ -98,10 +100,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: EVM Pods Chaos Tests
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}'
continue-on-error: true
@@ -126,7 +129,7 @@ jobs:
echo ::add-mask::$BASE64_CONFIG_OVERRIDE
echo "BASE64_CONFIG_OVERRIDE=$BASE64_CONFIG_OVERRIDE" >> $GITHUB_ENV
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd integration-tests && go test -timeout 1h -count=1 -json -test.parallel 11 ./chaos 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
diff --git a/.github/workflows/integration-tests-publish.yml b/.github/workflows/integration-tests-publish.yml
index 176947a092d..79f5013044e 100644
--- a/.github/workflows/integration-tests-publish.yml
+++ b/.github/workflows/integration-tests-publish.yml
@@ -22,10 +22,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Publish Integration Test Image
continue-on-error: true
- name: Checkout the repo
@@ -75,10 +76,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Chainlink Image ${{ matrix.image.name }}
continue-on-error: true
- name: Checkout the repo
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index e8e9c8904d0..1edb3f003db 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -45,7 +45,7 @@ jobs:
echo "should-enforce=$SHOULD_ENFORCE" >> $GITHUB_OUTPUT
- name: Enforce CTF Version
if: steps.condition-check.outputs.should-enforce == 'true'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/mod-version@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/mod-version@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
go-project-path: ./integration-tests
module-name: github.com/smartcontractkit/chainlink-testing-framework
@@ -68,13 +68,15 @@ jobs:
- '.github/workflows/integration-tests.yml'
- '**/*Dockerfile'
- 'core/**/config/**/*.toml'
+ - 'integration-tests/**/*.toml'
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Check Paths That Require Tests To Run
continue-on-error: true
outputs:
@@ -87,7 +89,7 @@ jobs:
- name: Checkout the repo
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
- name: Setup Go
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/setup-go@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/setup-go@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_download_vendor_packages_command: cd ./integration-tests && go mod download
go_mod_path: ./integration-tests/go.mod
@@ -131,10 +133,11 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Chainlink Image ${{ matrix.image.name }}
continue-on-error: true
- name: Checkout the repo
@@ -166,10 +169,11 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Test Image
continue-on-error: true
- name: Checkout the repo
@@ -298,7 +302,7 @@ jobs:
## Run this step when changes that require tests to be run are made
- name: Run Tests
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd ./integration-tests && go test -timeout 30m -count=1 -json -test.parallel=${{ matrix.product.nodes }} ${{ steps.build-go-test-command.outputs.run_command }} 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
@@ -316,7 +320,7 @@ jobs:
QA_KUBECONFIG: ""
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
eth-smoke-tests-matrix-log-poller:
if: ${{ !(contains(join(github.event.pull_request.labels.*.name, ' '), 'skip-smoke-tests') || github.event_name == 'workflow_dispatch') }}
@@ -343,10 +347,11 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.src == 'true'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: ETH Smoke Tests ${{ matrix.product.name }}
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}'
continue-on-error: true
@@ -383,7 +388,7 @@ jobs:
## Run this step when changes that require tests to be run are made
- name: Run Tests
if: needs.changes.outputs.src == 'true'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd ./integration-tests && go test -timeout 30m -count=1 -json -test.parallel=${{ matrix.product.nodes }} ${{ steps.build-go-test-command.outputs.run_command }} 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
@@ -450,11 +455,11 @@ jobs:
os: ubuntu-latest
pyroscope_env: ci-smoke-vrf-evm-simulated
- name: vrfv2
- nodes: 3
+ nodes: 4
os: ubuntu-latest
pyroscope_env: ci-smoke-vrf2-evm-simulated
- name: vrfv2plus
- nodes: 3
+ nodes: 4
os: ubuntu-latest
pyroscope_env: ci-smoke-vrf2plus-evm-simulated
- name: forwarder_ocr
@@ -471,10 +476,11 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: ETH Smoke Tests ${{ matrix.product.name }}${{ matrix.product.tag_suffix }}
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}'
continue-on-error: true
@@ -563,7 +569,7 @@ jobs:
## Run this step when changes that require tests to be run are made
- name: Run Tests
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd ./integration-tests && go test -timeout 30m -count=1 -json -test.parallel=${{ matrix.product.nodes }} ${{ steps.build-go-test-command.outputs.run_command }} 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
@@ -583,7 +589,7 @@ jobs:
# Run this step when changes that do not need the test to run are made
- name: Run Setup
if: needs.changes.outputs.src == 'false'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/setup-run-tests-environment@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/setup-run-tests-environment@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_download_vendor_packages_command: cd ./integration-tests && go mod download
go_mod_path: ./integration-tests/go.mod
@@ -608,7 +614,7 @@ jobs:
path: ./integration-tests/smoke/traces/trace-data.json
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: ./integration-tests/smoke/
@@ -628,10 +634,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: ETH Smoke Tests
matrix-aggregator-status: ${{ needs.eth-smoke-tests-matrix.result }}
continue-on-error: true
@@ -656,10 +663,11 @@ jobs:
- name: Collect Metrics
if: ${{ github.event_name == 'pull_request' }}
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Clean up integration environment deployments
continue-on-error: true
@@ -677,7 +685,7 @@ jobs:
with:
ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }}
- name: Run Setup
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/setup-go@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/setup-go@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_download_vendor_packages_command: |
cd ./integration-tests
@@ -733,7 +741,7 @@ jobs:
upgradeImage: ${{ env.UPGRADE_IMAGE }}
upgradeVersion: ${{ env.UPGRADE_VERSION }}
- name: Run Migration Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd ./integration-tests && go test -timeout 30m -count=1 -json ./migration 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
@@ -759,10 +767,11 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Version Migration Tests
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}'
continue-on-error: true
@@ -845,7 +854,7 @@ jobs:
steps:
- name: Check if image exists
id: check-image
- uses: smartcontractkit/chainlink-github-actions/docker/image-exists@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/docker/image-exists@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
repository: chainlink-solana-tests
tag: ${{ needs.get_solana_sha.outputs.sha }}
@@ -877,10 +886,11 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Solana Build Artifacts
continue-on-error: true
- name: Checkout the solana repo
@@ -918,10 +928,11 @@ jobs:
- name: Collect Metrics
if: (needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch') && needs.solana-test-image-exists.outputs.exists == 'false'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Solana Build Test Image
continue-on-error: true
- name: Checkout the repo
@@ -969,10 +980,11 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Solana Smoke Tests
test-results-file: '{"testType":"go","filePath":"/tmp/gotest.log"}'
continue-on-error: true
@@ -983,7 +995,7 @@ jobs:
ref: ${{ needs.get_solana_sha.outputs.sha }}
- name: Run Setup
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/setup-run-tests-environment@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/setup-run-tests-environment@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
go_mod_path: ./integration-tests/go.mod
cache_restore_only: true
@@ -1010,9 +1022,22 @@ jobs:
# Remove the created container
docker rm "$CONTAINER_ID"
+ - name: Generate config overrides
+ run: | # https://github.com/smartcontractkit/chainlink-testing-framework/blob/main/config/README.md
+ cat << EOF > config.toml
+ [ChainlinkImage]
+ image="${{ env.CHAINLINK_IMAGE }}"
+ version="${{ github.sha }}"
+ EOF
+ # shellcheck disable=SC2002
+ BASE64_CONFIG_OVERRIDE=$(cat config.toml | base64 -w 0)
+ # shellcheck disable=SC2086
+ echo ::add-mask::$BASE64_CONFIG_OVERRIDE
+ # shellcheck disable=SC2086
+ echo "BASE64_CONFIG_OVERRIDE=$BASE64_CONFIG_OVERRIDE" >> $GITHUB_ENV
- name: Run Tests
if: needs.changes.outputs.src == 'true' || github.event_name == 'workflow_dispatch'
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: export ENV_JOB_IMAGE=${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-solana-tests:${{ needs.get_solana_sha.outputs.sha }} && make test_smoke
cl_repo: ${{ env.CHAINLINK_IMAGE }}
diff --git a/.github/workflows/lint-gh-workflows.yml b/.github/workflows/lint-gh-workflows.yml
index f1a3cc20803..1d546905a76 100644
--- a/.github/workflows/lint-gh-workflows.yml
+++ b/.github/workflows/lint-gh-workflows.yml
@@ -13,9 +13,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Validate Github Action Workflows
continue-on-error: true
diff --git a/.github/workflows/live-testnet-tests.yml b/.github/workflows/live-testnet-tests.yml
index 45207fad3ce..1d273788eee 100644
--- a/.github/workflows/live-testnet-tests.yml
+++ b/.github/workflows/live-testnet-tests.yml
@@ -47,10 +47,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Chainlink Image
continue-on-error: true
- name: Checkout the repo
@@ -78,10 +79,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Build Tests Binary
continue-on-error: true
- name: Checkout the repo
@@ -89,7 +91,7 @@ jobs:
with:
ref: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha }}
- name: Build Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-tests@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/build-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_download_vendor_packages_command: cd ./integration-tests && go mod download
token: ${{ secrets.GITHUB_TOKEN }}
@@ -115,7 +117,7 @@ jobs:
id-token: write
contents: read
runs-on: ubuntu-latest
- needs: [sepolia-smoke-tests, optimism-sepolia-smoke-tests, arbitrum-sepolia-smoke-tests, base-sepolia-smoke-tests, polygon-mumbai-smoke-tests, avalanche-fuji-smoke-tests, fantom-testnet-smoke-tests, celo-alfajores-smoke-tests, linea-goerli-smoke-tests]
+ needs: [sepolia-smoke-tests, optimism-sepolia-smoke-tests, arbitrum-sepolia-smoke-tests, base-sepolia-smoke-tests, polygon-mumbai-smoke-tests, avalanche-fuji-smoke-tests, fantom-testnet-smoke-tests, celo-alfajores-smoke-tests, linea-goerli-smoke-tests, bsc-testnet-smoke-tests]
steps:
- name: Debug Result
run: echo ${{ join(needs.*.result, ',') }}
@@ -176,7 +178,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- network: [Sepolia, Optimism Sepolia, Arbitrum Sepolia, Base Sepolia, Polygon Mumbai, Avalanche Fuji, Fantom Testnet, Celo Alfajores, Linea Goerli]
+ network: [Sepolia, Optimism Sepolia, Arbitrum Sepolia, Base Sepolia, Polygon Mumbai, Avalanche Fuji, Fantom Testnet, Celo Alfajores, Linea Goerli, BSC Testnet]
steps:
- name: Checkout the repo
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1
@@ -246,7 +248,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -264,13 +266,11 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
- bsc-testnet-tests:
- # TODO: BSC RPCs are all in a bad state right now, so we're skipping these tests until they're fixed
- if: false
+ bsc-testnet-smoke-tests:
environment: integration
permissions:
checks: write
@@ -320,7 +320,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -338,7 +338,7 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
@@ -392,7 +392,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -410,7 +410,7 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
@@ -464,7 +464,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -482,7 +482,7 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
@@ -532,7 +532,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -550,7 +550,7 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
@@ -604,7 +604,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -622,7 +622,7 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
@@ -676,7 +676,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -694,7 +694,7 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
@@ -748,7 +748,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -766,7 +766,7 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
@@ -816,7 +816,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -834,12 +834,11 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
scroll-sepolia-smoke-tests:
- # TODO: Disabled until bug TT-767 is fixed
if: false
environment: integration
permissions:
@@ -886,7 +885,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -904,7 +903,7 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
@@ -954,7 +953,7 @@ jobs:
with:
name: tests
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests-binary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: ./tests -test.timeout 30m -test.count=1 -test.parallel=1 -test.run ${{ matrix.test }}
binary_name: tests
@@ -972,6 +971,6 @@ jobs:
QA_KUBECONFIG: ${{ secrets.QA_KUBECONFIG }}
- name: Print failed test summary
if: always()
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@ea889b3133bd7f16ab19ba4ba130de5d9162c669 # v2.3.4
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/show-test-summary@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_directory: "./"
diff --git a/.github/workflows/nightlyfuzz.yml b/.github/workflows/nightlyfuzz.yml
new file mode 100644
index 00000000000..7becbe73de5
--- /dev/null
+++ b/.github/workflows/nightlyfuzz.yml
@@ -0,0 +1,53 @@
+name: 'nightly/tag fuzz'
+on:
+ schedule:
+ # Note: The schedule event can be delayed during periods of high
+ # loads of GitHub Actions workflow runs. High load times include
+ # the start of every hour. To decrease the chance of delay,
+ # schedule your workflow to run at a different time of the hour.
+ - cron: "25 0 * * *" # at 25 past midnight every day
+ push:
+ tags:
+ - '*'
+ workflow_dispatch: null
+jobs:
+ fuzzrun:
+ name: "run native fuzzers"
+ runs-on: "ubuntu20.04-4cores-16GB"
+ steps:
+ - name: "Checkout"
+ uses: "actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11" # v4.1.1
+ - name: "Setup go"
+ uses: "actions/setup-go@0c52d547c9bc32b1aa3301fd7a9cb496313a4491" # v5.0.0
+ with:
+ go-version-file: 'go.mod'
+ cache: true
+ cache-dependency-path: 'go.sum'
+ - name: "Get corpus directory"
+ id: "get-corpus-dir"
+ run: echo "corpus_dir=$(go env GOCACHE)/fuzz" >> $GITHUB_OUTPUT
+ shell: "bash"
+ - name: "Restore corpus"
+ uses: "actions/cache/restore@13aacd865c20de90d75de3b17ebe84f7a17d57d2" # v4.0.0
+ id: "restore-corpus"
+ with:
+ path: "${{ steps.get-corpus-dir.outputs.corpus_dir }}"
+ # We need to ensure uniqueness of the key, as saving to a key more than once will fail (see Save corpus step).
+ # We never expect a cache hit with the key but we do expect a hit with the restore-keys prefix that is going
+ # to match the latest cache that has that prefix.
+ key: "nightlyfuzz-corpus-${{ github.run_id }}-${{ github.run_attempt }}"
+ restore-keys: "nightlyfuzz-corpus-"
+ - name: "Run native fuzzers"
+ # Fuzz for 1 hour
+ run: "cd fuzz && ./fuzz_all_native.py --seconds 3600"
+ - name: "Print failing testcases"
+ if: failure()
+ run: find . -type f|fgrep '/testdata/fuzz/'|while read f; do echo $f; cat $f; done
+ - name: "Save corpus"
+ uses: "actions/cache/save@13aacd865c20de90d75de3b17ebe84f7a17d57d2" # v4.0.0
+ # We save also on failure, so that we can keep the valuable corpus generated that led to finding a crash.
+ # If the corpus gets clobbered for any reason, we can remove the offending cache from the Github UI.
+ if: always()
+ with:
+ path: "${{ steps.get-corpus-dir.outputs.corpus_dir }}"
+ key: "${{ steps.restore-corpus.outputs.cache-primary-key }}"
\ No newline at end of file
diff --git a/.github/workflows/on-demand-ocr-soak-test.yml b/.github/workflows/on-demand-ocr-soak-test.yml
index b02e44db117..81f38ba0293 100644
--- a/.github/workflows/on-demand-ocr-soak-test.yml
+++ b/.github/workflows/on-demand-ocr-soak-test.yml
@@ -32,10 +32,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: ${{ inputs.network }} OCR Soak Test
continue-on-error: true
- name: Checkout the repo
@@ -71,7 +72,7 @@ jobs:
QA_AWS_REGION: ${{ secrets.QA_AWS_REGION }}
QA_AWS_ACCOUNT_NUMBER: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
env:
DETACH_RUNNER: true
TEST_SUITE: soak
diff --git a/.github/workflows/on-demand-vrfv2-eth2-clients-test.yml b/.github/workflows/on-demand-vrfv2-eth2-clients-test.yml
index de53b493a5f..865f59b5179 100644
--- a/.github/workflows/on-demand-vrfv2-eth2-clients-test.yml
+++ b/.github/workflows/on-demand-vrfv2-eth2-clients-test.yml
@@ -46,7 +46,7 @@ jobs:
echo "### Execution client used" >>$GITHUB_STEP_SUMMARY
echo "\`${{ env.ETH2_EL_CLIENT }}\`" >>$GITHUB_STEP_SUMMARY
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@7d541cbbca52d45b8a718257af86d9cf49774d1f # v2.2.15
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd ./integration-tests && go test -timeout 30m -count=1 -json -run TestVRFv2Basic ./smoke/vrfv2_test.go 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
diff --git a/.github/workflows/on-demand-vrfv2-performance-test.yml b/.github/workflows/on-demand-vrfv2-performance-test.yml
index 7fd0d2b83b1..5887d8ec9a2 100644
--- a/.github/workflows/on-demand-vrfv2-performance-test.yml
+++ b/.github/workflows/on-demand-vrfv2-performance-test.yml
@@ -37,10 +37,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: ${{ inputs.network }} VRFV2 Performance Test
continue-on-error: true
- name: Checkout code
@@ -66,7 +67,7 @@ jobs:
echo "### Networks on which test was run" >>$GITHUB_STEP_SUMMARY
echo "\`${{ env.NETWORKS }}\`" >>$GITHUB_STEP_SUMMARY
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@7d541cbbca52d45b8a718257af86d9cf49774d1f # v2.2.15
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd ./integration-tests && go test -v -count=1 -timeout 24h -run TestVRFV2Performance/vrfv2_performance_test ./load/vrfv2
test_download_vendor_packages_command: cd ./integration-tests && go mod download
diff --git a/.github/workflows/on-demand-vrfv2plus-eth2-clients-test.yml b/.github/workflows/on-demand-vrfv2plus-eth2-clients-test.yml
index 1772730075e..228f0cdc5ff 100644
--- a/.github/workflows/on-demand-vrfv2plus-eth2-clients-test.yml
+++ b/.github/workflows/on-demand-vrfv2plus-eth2-clients-test.yml
@@ -46,7 +46,7 @@ jobs:
echo "### Execution client used" >>$GITHUB_STEP_SUMMARY
echo "\`${{ env.ETH2_EL_CLIENT }}\`" >>$GITHUB_STEP_SUMMARY
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@7d541cbbca52d45b8a718257af86d9cf49774d1f # v2.2.15
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd ./integration-tests && go test -timeout 30m -count=1 -json -run ^TestVRFv2Plus$/^Link_Billing$ ./smoke/vrfv2plus_test.go 2>&1 | tee /tmp/gotest.log | gotestfmt
test_download_vendor_packages_command: cd ./integration-tests && go mod download
diff --git a/.github/workflows/on-demand-vrfv2plus-performance-test.yml b/.github/workflows/on-demand-vrfv2plus-performance-test.yml
index 858eecff761..36a75704895 100644
--- a/.github/workflows/on-demand-vrfv2plus-performance-test.yml
+++ b/.github/workflows/on-demand-vrfv2plus-performance-test.yml
@@ -38,10 +38,11 @@ jobs:
steps:
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: ${{ inputs.network }} VRFV2 Plus Performance Test
continue-on-error: true
- name: Checkout code
@@ -67,7 +68,7 @@ jobs:
echo "### Networks on which test was run" >>$GITHUB_STEP_SUMMARY
echo "\`${{ env.NETWORKS }}\`" >>$GITHUB_STEP_SUMMARY
- name: Run Tests
- uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@e865e376b8c2d594028c8d645dd6c47169b72974 # v2.2.16
+ uses: smartcontractkit/chainlink-github-actions/chainlink-testing-framework/run-tests@92e0f299a87522c2a37bfc4686c4d8a96dc9d28b # v2.3.5
with:
test_command_to_run: cd ./integration-tests && go test -v -count=1 -timeout 24h -run TestVRFV2PlusPerformance/vrfv2plus_performance_test ./load/vrfv2plus
test_download_vendor_packages_command: cd ./integration-tests && go mod download
diff --git a/.github/workflows/operator-ui-cd.yml b/.github/workflows/operator-ui-cd.yml
index bd589da728f..d2d6d96471c 100644
--- a/.github/workflows/operator-ui-cd.yml
+++ b/.github/workflows/operator-ui-cd.yml
@@ -50,9 +50,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Update Version
continue-on-error: true
diff --git a/.github/workflows/pr-labels.yml b/.github/workflows/pr-labels.yml
index 66ef95434cf..8ab5e4982fb 100644
--- a/.github/workflows/pr-labels.yml
+++ b/.github/workflows/pr-labels.yml
@@ -35,15 +35,15 @@ jobs:
_Use these subdomains to access the CRIB environment. They are prefixes to the internal base domain._
- - crib-chain-${prNumber}-node1.
- - crib-chain-${prNumber}-node2.
- - crib-chain-${prNumber}-node3.
- - crib-chain-${prNumber}-node4.
- - crib-chain-${prNumber}-node5.
- - crib-chain-${prNumber}-node6.
- - crib-chain-${prNumber}-geth-http.
- - crib-chain-${prNumber}-geth-ws.
- - crib-chain-${prNumber}-mockserver.
+ - crib-chainlink-${prNumber}-node1.
+ - crib-chainlink-${prNumber}-node2.
+ - crib-chainlink-${prNumber}-node3.
+ - crib-chainlink-${prNumber}-node4.
+ - crib-chainlink-${prNumber}-node5.
+ - crib-chainlink-${prNumber}-node6.
+ - crib-chainlink-${prNumber}-geth-http.
+ - crib-chainlink-${prNumber}-geth-ws.
+ - crib-chainlink-${prNumber}-mockserver.
`;
await github.rest.issues.createComment({
diff --git a/.github/workflows/readme.yml b/.github/workflows/readme.yml
index 585bed41c6a..54fa3d7e43d 100644
--- a/.github/workflows/readme.yml
+++ b/.github/workflows/readme.yml
@@ -31,9 +31,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Readme checker
continue-on-error: true
\ No newline at end of file
diff --git a/.github/workflows/sigscanner.yml b/.github/workflows/sigscanner.yml
index de34766d2c8..c245380c237 100644
--- a/.github/workflows/sigscanner.yml
+++ b/.github/workflows/sigscanner.yml
@@ -26,9 +26,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: sigscanner-check
continue-on-error: true
diff --git a/.github/workflows/solidity-foundry.yml b/.github/workflows/solidity-foundry.yml
index 447018eb62e..128209e931c 100644
--- a/.github/workflows/solidity-foundry.yml
+++ b/.github/workflows/solidity-foundry.yml
@@ -91,9 +91,10 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.changes == 'true'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Foundry Tests ${{ matrix.product }}
continue-on-error: true
diff --git a/.github/workflows/solidity-hardhat.yml b/.github/workflows/solidity-hardhat.yml
index 8c878b8e71f..bbb092f6a13 100644
--- a/.github/workflows/solidity-hardhat.yml
+++ b/.github/workflows/solidity-hardhat.yml
@@ -48,10 +48,11 @@ jobs:
config: ./contracts/ci.json
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Split Solidity Tests
continue-on-error: true
@@ -90,10 +91,11 @@ jobs:
path: ./contracts/coverage-${{ matrix.split.idx }}.json
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Solidity Coverage ${{ matrix.split.id }}
continue-on-error: true
@@ -145,10 +147,11 @@ jobs:
run: pnpm test -- $SPLIT
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Solidity ${{ matrix.split.id }}
continue-on-error: true
@@ -170,9 +173,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Solidity
continue-on-error: true
\ No newline at end of file
diff --git a/.github/workflows/solidity.yml b/.github/workflows/solidity.yml
index 90429a8c526..6995a00d880 100644
--- a/.github/workflows/solidity.yml
+++ b/.github/workflows/solidity.yml
@@ -56,10 +56,11 @@ jobs:
run: pnpm prepublishOnly
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Prepublish Test
continue-on-error: true
@@ -100,10 +101,11 @@ jobs:
run: gh pr comment -b 'Go solidity wrappers are out-of-date, regenerate them via the `make wrappers-all` command'
- name: Collect Metrics
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Native Compilation
continue-on-error: true
@@ -131,10 +133,11 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.changes == 'true'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Lint
continue-on-error: true
@@ -157,9 +160,10 @@ jobs:
- name: Collect Metrics
if: needs.changes.outputs.changes == 'true'
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Prettier Formatting
continue-on-error: true
diff --git a/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml b/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml
index d27acceca68..afdcfa156c2 100644
--- a/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml
+++ b/.github/workflows/sync-develop-from-smartcontractkit-chainlink.yml
@@ -30,9 +30,10 @@ jobs:
- name: Collect Metrics
if: always()
id: collect-gha-metrics
- uses: smartcontractkit/push-gha-metrics-action@d1618b772a97fd87e6505de97b872ee0b1f1729a # v2.0.2
+ uses: smartcontractkit/push-gha-metrics-action@0281b09807758be1dcc41651e44e62b353808c47 # v2.1.0
with:
- basic-auth: ${{ secrets.GRAFANA_CLOUD_BASIC_AUTH }}
- hostname: ${{ secrets.GRAFANA_CLOUD_HOST }}
+ org-id: ${{ secrets.GRAFANA_INTERNAL_TENANT_ID }}
+ basic-auth: ${{ secrets.GRAFANA_INTERNAL_BASIC_AUTH }}
+ hostname: ${{ secrets.GRAFANA_INTERNAL_HOST }}
this-job-name: Sync
continue-on-error: true
diff --git a/.golangci.yml b/.golangci.yml
index 3672692f599..71468b4975f 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -71,7 +71,7 @@ linters-settings:
- name: identical-branches
- name: get-return
# - name: flag-parameter
- # - name: early-return
+ - name: early-return
- name: defer
- name: constant-logical-expr
# - name: confusing-naming
diff --git a/.tool-versions b/.tool-versions
index 2ec4cde8ad1..dc5f761daf3 100644
--- a/.tool-versions
+++ b/.tool-versions
@@ -5,3 +5,4 @@ postgres 13.3
helm 3.10.3
zig 0.11.0
golangci-lint 1.55.2
+protoc 25.1
diff --git a/CODEOWNERS b/CODEOWNERS
index 83505b0ed8c..74a7208cc0a 100644
--- a/CODEOWNERS
+++ b/CODEOWNERS
@@ -2,37 +2,29 @@
# 1. Per Github docs: "Order is important; the last matching pattern takes the most precedence."
# Please define less specific codeowner paths before more specific codeowner paths in order for the more specific rule to have priority
-# Misc
-/core/store @samsondav @jmank88
-/core/chains @samsondav
-/core/logger @jmank88
-/core/internal @samsondav @jmank88
+# Core
+/core @smartcontractkit/foundations
# Chains
/common @smartcontractkit/integrations
-/core/chains/evm @samsondav @prashantkumar1982
-/core/chains/evm/headtracker @pinebit @samsondav @prashantkumar1982
-/core/chains/evm/client @samsondav @prashantkumar1982
-/core/chains/evm/log @jmank88 @prashantkumar1982 @connorwstein
-/core/chains/evm/logpoller @reductionista @connorwstein
-/core/chains/cosmos @archseer @cfal
+/core/chains/ @smartcontractkit/integrations
# Services
-/core/services/cron @samsondav
-/core/services/directrequest @connorwstein @samsondav
-/core/services/feeds @jkongie
-/core/services/fluxmonitorv2 @jkongie @PiotrTrzpil @connorwstein
-/core/services/health @samsondav
-/core/services/job @connorwstein
-/core/services/keystore @RyanRHall
-/core/services/ocr* @connorwstein @samsondav
-/core/services/ocr2 @jmank88 @krehermann
-/core/services/periodicbackup @PiotrTrzpil @samsondav
-/core/services/pg @samsondav
-/core/services/pipeline @connorwstein @prashantkumar1982
-/core/services/synchronization
-/core/services/telemetry
-/core/services/relay/evm/mercury @samsondav @sdrug @martin-cll
+/core/services/directrequest @smartcontractkit/keepers
+/core/services/feeds @smartcontractkit/FMS
+
+# To be deprecated in Chainlink V3
+/core/services/fluxmonitorv2 @smartcontractkit/foundations
+/core/services/job @smartcontractkit/ccip
+/core/services/keystore @smartcontractkit/keepers
+/core/services/ocr* @smartcontractkit/foundations
+/core/services/periodicbackup @smartcontractkit/foundations
+/core/services/pg @smartcontractkit/foundations @samsondav
+/core/services/pipeline @smartcontractkit/foundations @smartcontractkit/integrations
+/core/services/telemetry @smartcontractkit/realtime
+/core/services/relay/evm/mercury @smartcontractkit/mercury-team
+/core/services/webhook @smartcontractkit/foundations @smartcontractkit/integrations
+/core/services/llo @smartcontractkit/mercury-team
# VRF-related services
/core/services/vrf @smartcontractkit/vrf-team
@@ -48,27 +40,16 @@
/core/services/keeper @smartcontractkit/keepers
/core/services/ocr2/plugins/ocr2keeper @smartcontractkit/keepers
-/core/services/webhook @samsondav
-
# Chainlink Functions
core/services/functions @smartcontractkit/functions
core/services/ocr2/plugins/functions @smartcontractkit/functions
-core/services/s4 @pinebit @bolekk
-core/service/ocr2/plugins/s4 @pinebit @bolekk
-core/services/ocr2/plugins/threshold @KuphJr @bolekk
-core/services/relay/evm/functions.go @bolekk @justinkaseman @KuphJr
-core/services/relay/evm/functions @bolekk @justinkaseman @KuphJr
+core/services/s4 @smartcontractkit/functions
+core/service/ocr2/plugins/s4 @smartcontractkit/functions
+core/services/ocr2/plugins/threshold @smartcontractkit/functions
+core/services/relay/evm/functions @smartcontractkit/functions
+core/services/relay/evm/functions @smartcontractkit/functions
core/scripts/functions @smartcontractkit/functions
-core/scripts/gateway @bolekk @pinebit
-
-# API
-/core/web @jkongie
-
-# CLI
-/core/cmd @jkongie @jmank88 @samsondav
-
-# UI
-/operator-ui/ @DeividasK @jkongie
+core/scripts/gateway @smartcontractkit/functions
# Contracts
/contracts/ @RensR
@@ -78,23 +59,21 @@ core/scripts/gateway @bolekk @pinebit
# This could give some false positives, so afterwards we match on the project directories
# to ensure the entire directory is always owned by the correct team.
-/contracts/**/*shared* @RensR
/contracts/**/*keeper* @smartcontractkit/keepers
/contracts/**/*upkeep* @smartcontractkit/keepers
/contracts/**/*automation* @smartcontractkit/keepers
/contracts/**/*functions* @smartcontractkit/functions
-/contracts/**/*llo-feeds* @austinborn @Fletch153
+/contracts/**/*llo-feeds* @smartcontrackit/mercury-team
/contracts/**/*vrf* @smartcontractkit/vrf-team
-/contracts/**/*l2ep* @simsonraj
-/contracts/**/*operatorforwarder* @essamhassan
+/contracts/**/*l2ep* @smartcontractkit/integrations
/contracts/src/v0.8/automation @smartcontractkit/keepers
/contracts/src/v0.8/functions @smartcontractkit/functions
# TODO: interfaces folder, folder should be removed and files moved to the correct folders
-/contracts/src/v0.8/l2ep @simsonraj
-/contracts/src/v0.8/llo-feeds @austinborn @Fletch153
+/contracts/src/v0.8/l2ep @chris-de-leon-cll
+/contracts/src/v0.8/llo-feeds @smartcontractkit/mercury-team
# TODO: mocks folder, folder should be removed and files moved to the correct folders
-/contracts/src/v0.8/operatorforwarder @essamhassan
+/contracts/src/v0.8/operatorforwarder @smartcontractkit/foundations
/contracts/src/v0.8/shared @RensR
# TODO: tests folder, folder should be removed and files moved to the correct folders
# TODO: transmission folder, owner should be found
@@ -112,10 +91,7 @@ core/scripts/gateway @bolekk @pinebit
/integration-tests/**/*automation* @smartcontractkit/keepers
# CI/CD
-/.github/** @chainchad @javuto @jkongie @jmank88 @samsondav
-/.github/workflows/integration-tests.yml @smartcontractkit/test-tooling-team
-/.github/workflows/integration-chaos-tests.yml @smartcontractkit/test-tooling-team
-/.github/workflows/integration-tests-publish.yml @smartcontractkit/test-tooling-team
+/.github/** @smartcontractkit/releng @smartcontractkit/test-tooling-team
/.github/workflows/performance-tests.yml @smartcontractkit/test-tooling-team
/.github/workflows/automation-ondemand-tests.yml @smartcontractkit/keepers
/.github/workflows/automation-benchmark-tests.yml @smartcontractkit/keepers
@@ -138,9 +114,5 @@ flake.nix @smartcontractkit/prodsec-public
flake.lock @smartcontractkit/prodsec-public
# Config
-./core/config @samsondav @jmank88
-./docs/CONFIG.md @samsondav @jmank88 @dwightjl
-./internal/config/docs.toml @samsondav @jmank88 @dwightjl
-
-# LOOP Plugins
-/plugins @jmank88 @krehermann
+./docs/CONFIG.md @smartcontractkit/foundations @smartcontractkit/devrel
+./internal/config/docs.toml @smartcontractkit/foundations @smartcontractkit/devrel
diff --git a/GNUmakefile b/GNUmakefile
index 549a7222a82..eab8a73b954 100644
--- a/GNUmakefile
+++ b/GNUmakefile
@@ -83,7 +83,7 @@ abigen: ## Build & install abigen.
./tools/bin/build_abigen
.PHONY: generate
-generate: abigen codecgen mockery ## Execute all go:generate commands.
+generate: abigen codecgen mockery protoc ## Execute all go:generate commands.
go generate -x ./...
.PHONY: testscripts
@@ -119,6 +119,11 @@ mockery: $(mockery) ## Install mockery.
codecgen: $(codecgen) ## Install codecgen
go install github.com/ugorji/go/codec/codecgen@v1.2.10
+.PHONY: protoc
+protoc: ## Install protoc
+ core/scripts/install-protoc.sh 25.1 /
+ go install google.golang.org/protobuf/cmd/protoc-gen-go@`go list -m -json google.golang.org/protobuf | jq -r .Version`
+
.PHONY: telemetry-protobuf
telemetry-protobuf: $(telemetry-protobuf) ## Generate telemetry protocol buffers.
protoc \
diff --git a/charts/chainlink-cluster/README.md b/charts/chainlink-cluster/README.md
index 3deb37794a6..7f2736034a7 100644
--- a/charts/chainlink-cluster/README.md
+++ b/charts/chainlink-cluster/README.md
@@ -5,6 +5,7 @@ Install `kubefwd` (no nixpkg for it yet, planned)
```
brew install txn2/tap/kubefwd
```
+If you want to build images you need [docker](https://docs.docker.com/engine/install/) service running
Enter the shell (from the root project dir)
```
@@ -18,17 +19,33 @@ We are using [devspace](https://www.devspace.sh/docs/getting-started/installatio
Configure the cluster, see `deployments.app.helm.values` and [values.yaml](./values.yaml) comments for more details
-Enter the shell and deploy
+Configure your `cluster` setup (one time setup, internal usage only)
+```
+export DEVSPACE_IMAGE="..."
+cd charts/chainlink-cluster
+./setup.sh ${my-personal-namespace-name-crib}
+```
+
+Build and deploy current commit
```
-# set your unique namespace if it's a new cluster
-devspace use namespace cl-cluster
devspace deploy
```
+
If you don't need a build use
```
devspace deploy --skip-build
```
+To deploy particular commit (must be in registry) use
+```
+devspace deploy --skip-build ${short_sha_of_image}
+```
+
+Forward ports to check UI or run tests
+```
+devspace run connect ${my-personal-namespace-name-crib}
+```
+
Connect to your environment, by replacing container with label `node-1` with your local repository files
```
devspace dev -p node
diff --git a/charts/chainlink-cluster/connect.toml b/charts/chainlink-cluster/connect.toml
index 1f49b5a6e37..9560be53adc 100644
--- a/charts/chainlink-cluster/connect.toml
+++ b/charts/chainlink-cluster/connect.toml
@@ -2,7 +2,7 @@ namespace = "cl-cluster"
network_name = "geth"
network_chain_id = 1337
network_private_key = "ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80"
-network_ws_url = "ws://geth:8546"
+network_ws_url = "ws://geth-1337:8546"
network_http_url = "http://geth:8544"
cl_nodes_num = 6
cl_node_url_template = "http://app-node-%d:6688"
diff --git a/charts/chainlink-cluster/devspace.yaml b/charts/chainlink-cluster/devspace.yaml
index 0157ce7451c..f7808085505 100644
--- a/charts/chainlink-cluster/devspace.yaml
+++ b/charts/chainlink-cluster/devspace.yaml
@@ -4,34 +4,91 @@ name: chainlink
vars:
NS_TTL: 72h
DEVSPACE_IMAGE:
+ noCache: true
+ source: env
+ # This is the base domain in AWS Route 53 that our ingress subdomains will use.
+ DEVSPACE_INGRESS_BASE_DOMAIN:
+ source: env
+ # This is the ARN of the AWS ACM certificate that will be used for the ingress.
+ DEVSPACE_INGRESS_CERT_ARN:
+ source: env
+ # This is a comma separated list of CIDR blocks that will be allowed to access the ingress.
+ DEVSPACE_INGRESS_CIDRS:
source: env
# This is a list of `pipelines` that DevSpace can execute (you can define your own)
pipelines:
- # create_deployments --all can be used to apply manifests again
- # This is the pipeline for the main command: `devspace dev` (or `devspace run-pipeline dev`)
dev:
run: |-
run_dependencies --all # 1. Deploy any projects this project needs (see "dependencies")
ensure_pull_secrets --all # 2. Ensure pull secrets
start_dev app # 3. Start dev mode "app" (see "dev" section)
- # You can run this pipeline via `devspace deploy` (or `devspace run-pipeline deploy`)
deploy:
run: |-
- run_dependencies --all
- ensure_pull_secrets --all
+ set -o pipefail
+ echo "Removing .devspace cache!"
+ rm -rf .devspace/ || true
+ registry_id=$(echo "$DEVSPACE_IMAGE" | cut -d'.' -f1)
+
+ # Login into registry
+ echo "Authorizing into ECR registry"
+ aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin ${registry_id}.dkr.ecr.us-west-2.amazonaws.com
+
+ run_dependencies --all
+ ensure_pull_secrets --all
build_images ---var DOCKER_DEFAULT_PLATFORM=linux/amd64 --all -t $(git rev-parse --short HEAD)
kubectl annotate namespace ${DEVSPACE_NAMESPACE} janitor/ttl=${NS_TTL} || true
kubectl label namespace/${DEVSPACE_NAMESPACE} network=crib || true
- create_deployments --all
+ if [ -n "$1" ]; then
+ echo "Deploying tag $1"
+ tag=$1
+ image=${DEVSPACE_IMAGE}:$tag
+ else
+ echo "Deploying current commit tag: $(git rev-parse --short HEAD)"
+ tag=$(git rev-parse --short HEAD)
+ image=${DEVSPACE_IMAGE}:$tag
+ fi
+
+ echo "Checking tag: $tag"
+ repository_name="chainlink-devspace"
+ desired_tag=$tag
+
+ # Check if the desired tag is present in the repository
+ image_list=$(aws ecr list-images --repository-name "$repository_name")
+ tag_exists=$(echo "$image_list" | jq -e '.imageIds[] | select(.imageTag == "'"${desired_tag}"'")' >/dev/null && echo true || echo false)
+
+ # Check the value of the tag_exists variable
+ if [ "$tag_exists" = "true" ]; then
+ echo "Image tag '$tag' found."
+ else
+ echo "Image tag '$tag' not found. Please build the image using 'devspace deploy'"
+ exit 1
+ fi
+ create_deployments app \
+ --set=helm.values.chainlink.nodes[0].image=$image \
+ --set=helm.values.chainlink.nodes[1].image=$image \
+ --set=helm.values.chainlink.nodes[2].image=$image \
+ --set=helm.values.chainlink.nodes[3].image=$image \
+ --set=helm.values.chainlink.nodes[4].image=$image \
+ --set=helm.values.chainlink.nodes[5].image=$image
echo "Namespace ${DEVSPACE_NAMESPACE} will be deleted in ${NS_TTL}"
+
+ echo
+ echo "############################################"
+ echo "Ingress Domains"
+ echo "############################################"
+ ingress_names="node1 node2 node3 node4 node5 node6 geth-1337-http geth-1337-ws geth-2337-http geth-2337-ws"
+ for ingress in ${ingress_names}; do
+ echo "https://${DEVSPACE_NAMESPACE}-${ingress}.${DEVSPACE_INGRESS_BASE_DOMAIN}"
+ done
+
purge:
run: |-
kubectl delete ns ${DEVSPACE_NAMESPACE}
commands:
connect: |-
- sudo kubefwd svc -n ${DEVSPACE_NAMESPACE}
+ sudo kubefwd svc -n $1
images:
app:
@@ -64,7 +121,7 @@ deployments:
path: .
# for simplicity, we define all the values here
# they can be defined the same way in values.yml
- # devspace merging this "values" and "values.yml" before deploy
+ # devspace merges these "values" with the "values.yaml" before deploy
values:
podSecurityContext:
fsGroup: 999
@@ -83,7 +140,6 @@ deployments:
nodes:
- name: node-1
image: ${DEVSPACE_IMAGE}
- version: latest
# default resources are 300m/1Gi
# first node need more resources to build faster inside container
# at least 2Gi of memory is required otherwise build will fail (OOM)
@@ -128,19 +184,14 @@ deployments:
# overridesToml: |
- name: node-2
image: ${DEVSPACE_IMAGE}
- version: latest
- name: node-3
image: ${DEVSPACE_IMAGE}
- version: latest
- name: node-4
image: ${DEVSPACE_IMAGE}
- version: latest
- name: node-5
image: ${DEVSPACE_IMAGE}
- version: latest
- name: node-6
image: ${DEVSPACE_IMAGE}
- version: latest
# each CL node have a dedicated PostgreSQL 11.15
# use StatefulSet by setting:
@@ -179,7 +230,9 @@ deployments:
version: v1.12.0
wsrpc-port: 8546
httprpc-port: 8544
- networkid: 1337
+ chains:
+ - networkId: 1337
+ - networkId: 2337
blocktime: 1
resources:
requests:
@@ -231,23 +284,134 @@ deployments:
limits:
cpu: 1
memory: 512Mi
- affinity: { }
- tolerations: [ ]
- nodeSelector: { }
+ affinity: {}
+ tolerations: []
+ nodeSelector: {}
ingress:
enabled: false
className: ""
- hosts: [ ]
- tls: [ ]
- annotations: { }
+ hosts: []
+ tls: []
+ annotations: {}
service:
type: NodePort
port: 8080
-
# monitoring.coreos.com/v1 PodMonitor for each node
prometheusMonitor: true
+ networkPolicy:
+ ingress:
+ # Should be a comma separated list of CIDR blocks. To include
+ # AWS ALB private CIDRs and optionally other custom CIDRs.
+ # Example format: 10.0.0.0/16,192.168.0.1/24
+ allowCustomCidrs: ${DEVSPACE_INGRESS_CIDRS}
+ # These ingresses create AWS ALB resources and Route 53 Records.
+ ingress:
+ enabled: true
+ annotation_certificate_arn: ${DEVSPACE_INGRESS_CERT_ARN}
+ annotation_group_name: ${DEVSPACE_NAMESPACE}
+ hosts:
+ - host: ${DEVSPACE_NAMESPACE}-node1.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: app-node-1
+ port:
+ number: 6688
+ - host: ${DEVSPACE_NAMESPACE}-node2.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: app-node-2
+ port:
+ number: 6688
+ - host: ${DEVSPACE_NAMESPACE}-node3.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: app-node-3
+ port:
+ number: 6688
+ - host: ${DEVSPACE_NAMESPACE}-node4.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: app-node-4
+ port:
+ number: 6688
+ - host: ${DEVSPACE_NAMESPACE}-node5.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: app-node-5
+ port:
+ number: 6688
+ - host: ${DEVSPACE_NAMESPACE}-node6.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: app-node-6
+ port:
+ number: 6688
+ - host: ${DEVSPACE_NAMESPACE}-geth-1337-http.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: geth-1337
+ port:
+ number: 8544
+ - host: ${DEVSPACE_NAMESPACE}-geth-1337-ws.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: geth-1337
+ port:
+ number: 8546
+ - host: ${DEVSPACE_NAMESPACE}-geth-2337-http.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: geth-2337
+ port:
+ number: 8544
+ - host: ${DEVSPACE_NAMESPACE}-geth-2337-ws.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: geth-2337
+ port:
+ number: 8546
+ - host: ${DEVSPACE_NAMESPACE}-mockserver.${DEVSPACE_INGRESS_BASE_DOMAIN}
+ http:
+ paths:
+ - path: /
+ backend:
+ service:
+ name: mockserver
+ port:
+ number: 1080
+
# deployment placement, standard helm stuff
podAnnotations:
nodeSelector:
@@ -314,10 +478,10 @@ dev:
ssh:
enabled: true
proxyCommands:
-# TODO: access issues
-# - command: devspace
-# - command: kubectl
-# - command: helm
+ # TODO: access issues
+ # - command: devspace
+ # - command: kubectl
+ # - command: helm
- gitCredentials: true
ports:
- port: "2345"
diff --git a/charts/chainlink-cluster/devspace_start.sh b/charts/chainlink-cluster/devspace_start.sh
index cebf9e346e2..368b5dd9384 100755
--- a/charts/chainlink-cluster/devspace_start.sh
+++ b/charts/chainlink-cluster/devspace_start.sh
@@ -7,9 +7,9 @@ COLOR_RESET="\033[0m"
# Print useful output for user
echo -e "${COLOR_BLUE}
- %########%
- %###########% ____ _____
- %#########% | _ \ ___ __ __ / ___/ ____ ____ ____ ___
+ %########%
+ %###########% ____ _____
+ %#########% | _ \ ___ __ __ / ___/ ____ ____ ____ ___
%#########% | | | | / _ \\\\\ \ / / \___ \ | _ \ / _ | / __// _ \\
%#############% | |_| |( __/ \ V / ____) )| |_) )( (_| |( (__( __/
%#############% |____/ \___| \_/ \____/ | __/ \__,_| \___\\\\\___|
diff --git a/charts/chainlink-cluster/go.mod b/charts/chainlink-cluster/go.mod
index ae67574aa06..14471683b2a 100644
--- a/charts/chainlink-cluster/go.mod
+++ b/charts/chainlink-cluster/go.mod
@@ -176,7 +176,7 @@ replace (
github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
// until merged upstream: https://github.com/hashicorp/go-plugin/pull/257
- github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306
+ github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16
// until merged upstream: https://github.com/mwitkow/grpc-proxy/pull/69
github.com/mwitkow/grpc-proxy => github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f
diff --git a/charts/chainlink-cluster/setup.sh b/charts/chainlink-cluster/setup.sh
new file mode 100755
index 00000000000..536bef57c75
--- /dev/null
+++ b/charts/chainlink-cluster/setup.sh
@@ -0,0 +1,37 @@
+#!/usr/bin/env bash
+
+set -e
+user_home="$HOME"
+file_path="$user_home/.aws/config"
+image=""
+registry_id=$(echo "$DEVSPACE_IMAGE" | cut -d'.' -f1)
+
+if grep -q "staging-crib" "$file_path"; then
+ echo "Staging AWS config is already applied, role is 'staging-crib'"
+else
+ cat <> "$file_path"
+[profile staging-crib]
+region=us-west-2
+sso_start_url=https://smartcontract.awsapps.com/start
+sso_region=us-west-2
+sso_account_id=${registry_id}
+sso_role_name=CRIB-ECR-Power
+EOF
+ echo "~/.aws/config modified, added 'staging-crib"
+fi
+
+# Login through SSO
+aws sso login --profile staging-crib
+# Update kubeconfig and switch context
+export AWS_PROFILE=staging-crib
+aws eks update-kubeconfig --name main-stage-cluster --alias main-stage-cluster-crib --profile staging-crib
+
+# Check if the Docker daemon is running
+if docker info > /dev/null 2>&1; then
+ echo "Docker daemon is running, authorizing registry"
+else
+ echo "Docker daemon is not running, exiting"
+ exit 1
+fi
+aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin ${registry_id}.dkr.ecr.us-west-2.amazonaws.com
+devspace use namespace $1
diff --git a/charts/chainlink-cluster/templates/chainlink-cm.yaml b/charts/chainlink-cluster/templates/chainlink-cm.yaml
index b33e29df4b5..25deb475af2 100644
--- a/charts/chainlink-cluster/templates/chainlink-cm.yaml
+++ b/charts/chainlink-cluster/templates/chainlink-cm.yaml
@@ -40,15 +40,20 @@ data:
AnnounceAddresses = ['0.0.0.0:6690']
DeltaDial = '500ms'
DeltaReconcile = '5s'
+ {{- range $chainCfg := $.Values.geth.chains }}
[[EVM]]
- ChainID = '1337'
+ ChainID = {{ $chainCfg.networkId | quote }}
MinContractPayment = '0'
AutoCreateKey = true
FinalityDepth = 1
+ {{- if (hasKey $chainCfg "customEVMConfigToml") }}
+ {{- $chainCfg.customEVMConfigToml | nindent 4 }}
+ {{- end }}
[[EVM.Nodes]]
- Name = 'node-0'
- WSURL = 'ws://geth:8546'
- HTTPURL = 'http://geth:8544'
+ Name = 'node-{{ $chainCfg.networkId }}'
+ WSURL = 'ws://geth-{{ $chainCfg.networkId }}:8546'
+ HTTPURL = 'http://geth-{{ $chainCfg.networkId }}:8544'
+ {{- end }}
[WebServer.TLS]
HTTPSPort = 0
{{ end }}
diff --git a/charts/chainlink-cluster/templates/chainlink-db-networkpolicy.yaml b/charts/chainlink-cluster/templates/chainlink-db-networkpolicy.yaml
index e5d029b7865..5f7e7706ced 100644
--- a/charts/chainlink-cluster/templates/chainlink-db-networkpolicy.yaml
+++ b/charts/chainlink-cluster/templates/chainlink-db-networkpolicy.yaml
@@ -1,3 +1,4 @@
+{{- if .Values.networkPolicies.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
@@ -21,3 +22,4 @@ spec:
ports:
- protocol: TCP
port: 5432
+{{- end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/chainlink-node-networkpolicy.yaml b/charts/chainlink-cluster/templates/chainlink-node-networkpolicy.yaml
index 321bc531626..e63759a994f 100644
--- a/charts/chainlink-cluster/templates/chainlink-node-networkpolicy.yaml
+++ b/charts/chainlink-cluster/templates/chainlink-node-networkpolicy.yaml
@@ -1,3 +1,4 @@
+{{- if .Values.networkPolicies.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
@@ -17,3 +18,4 @@ spec:
- podSelector:
matchLabels:
app: runner
+{{- end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/geth-config-map.yaml b/charts/chainlink-cluster/templates/geth-config-map.yaml
index 022d9f2ea61..0d9abb042e3 100644
--- a/charts/chainlink-cluster/templates/geth-config-map.yaml
+++ b/charts/chainlink-cluster/templates/geth-config-map.yaml
@@ -1,11 +1,12 @@
{{ if (hasKey .Values "geth") }}
+{{- range $cfg := .Values.geth.chains }}
apiVersion: v1
kind: ConfigMap
metadata:
labels:
- app: geth-cm
- release: {{ .Release.Name }}
- name: geth-cm
+ app: geth-{{ $cfg.networkId }}-cm
+ release: {{ $.Release.Name }}
+ name: geth-{{ $cfg.networkId }}-cm
data:
key1: |
{"address":"f39fd6e51aad88f6f4ce6ab8827279cfffb92266","crypto":{"cipher":"aes-128-ctr","ciphertext":"c36afd6e60b82d6844530bd6ab44dbc3b85a53e826c3a7f6fc6a75ce38c1e4c6","cipherparams":{"iv":"f69d2bb8cd0cb6274535656553b61806"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"80d5f5e38ba175b6b89acfc8ea62a6f163970504af301292377ff7baafedab53"},"mac":"f2ecec2c4d05aacc10eba5235354c2fcc3776824f81ec6de98022f704efbf065"},"id":"e5c124e9-e280-4b10-a27b-d7f3e516b408","version":3}
@@ -50,17 +51,18 @@ data:
password.txt: |
init.sh: |
#!/bin/bash
- if [ ! -d /app/.ethereum/keystore ]; then
- echo "/app/.ethereum/keystore not found, running 'geth init'..."
- geth init /app/ethconfig/genesis.json
+ if [ ! -d /chain/chain-data/keystore ]; then
+ echo "/chain/chain-data/keystore not found, running 'geth init'..."
+ geth init --datadir /chain/chain-data/ /chain/genesis.json
echo "...done!"
+ cp /chain/config/key* /chain/chain-data/keystore
fi
- geth "$@"
+ cd /chain/chain-data && geth "$@"
genesis.json: |
{
"config": {
- "chainId": {{ .Values.geth.networkId }},
+ "chainId": {{ $cfg.networkId }},
"homesteadBlock": 0,
"eip150Block": 0,
"eip155Block": 0,
@@ -72,14 +74,18 @@ data:
"istanbulBlock": 0,
"muirGlacierBlock": 0,
"berlinBlock": 0,
- "londonBlock": 0
+ "londonBlock": 0,
+ "clique": {
+ "period": 2,
+ "epoch": 30000
+ }
},
"nonce": "0x0000000000000042",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"difficulty": "1",
"coinbase": "0x3333333333333333333333333333333333333333",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
- "extraData": "0x",
+ "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000f39fd6e51aad88f6f4ce6ab8827279cfffb922660000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"gasLimit": "8000000000",
"alloc": {
"0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": {
@@ -144,4 +150,6 @@ data:
}
}
}
- {{ end }}
\ No newline at end of file
+---
+{{- end }}
+{{ end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/geth-deployment.yaml b/charts/chainlink-cluster/templates/geth-deployment.yaml
index abc7853d978..c78f0851038 100644
--- a/charts/chainlink-cluster/templates/geth-deployment.yaml
+++ b/charts/chainlink-cluster/templates/geth-deployment.yaml
@@ -1,35 +1,38 @@
{{ if (hasKey .Values "geth") }}
+{{- range $cfg := .Values.geth.chains }}
apiVersion: apps/v1
kind: Deployment
metadata:
- name: geth
+ name: geth-{{ $cfg.networkId }}
spec:
selector:
matchLabels:
app: geth
+ release: {{ $.Release.Name }}
+ instance: geth-{{ $cfg.networkId }}
# Used for testing.
# havoc-component-group and havoc-network-group are used by "havoc" chaos testing tool
havoc-component-group: "blockchain"
havoc-network-group: "blockchain"
- release: {{ .Release.Name }}
template:
metadata:
labels:
app: geth
+ instance: geth-{{ $cfg.networkId }}
+ release: {{ $.Release.Name }}
# Used for testing.
# havoc-component-group and havoc-network-group are used by "havoc" chaos testing tool
havoc-component-group: "blockchain"
havoc-network-group: "blockchain"
- release: {{ .Release.Name }}
annotations:
- {{- range $key, $value := .Values.podAnnotations }}
+ {{- range $key, $value := $.Values.podAnnotations }}
{{ $key }}: {{ $value | quote }}
{{- end }}
spec:
volumes:
- name: configmap-volume
configMap:
- name: geth-cm
+ name: geth-{{ $cfg.networkId }}-cm
- name: devchain-volume
emptyDir: {}
securityContext:
@@ -38,43 +41,32 @@ spec:
- name: geth-network
securityContext:
{{- toYaml $.Values.geth.securityContext | nindent 12 }}
- image: "{{ default "ethereum/client-go" .Values.geth.image }}:{{ default "stable" .Values.geth.version }}"
- command: [ "sh", "/app/init.sh" ]
+ image: "{{ default "ethereum/client-go" $.Values.geth.image }}:{{ default "stable" $.Values.geth.version }}"
+ command: [ "sh", "/chain/init.sh" ]
volumeMounts:
- name: devchain-volume
- mountPath: /app/.ethereum/devchain
+ mountPath: /chain/chain-data
- name : configmap-volume
- mountPath: /app/init.sh
+ mountPath: /chain/genesis.json
+ subPath: genesis.json
+ - name : configmap-volume
+ mountPath: /chain/init.sh
subPath: init.sh
- name: configmap-volume
- mountPath: /app/config
- - name: configmap-volume
- mountPath: /app/.ethereum/devchain/keystore/key1
- subPath: key1
- - name: configmap-volume
- mountPath: /app/.ethereum/devchain/keystore/key2
- subPath: key2
- - name: configmap-volume
- mountPath: /app/.ethereum/devchain/keystore/key3
- subPath: key3
+ mountPath: /chain/config
args:
- - '--dev'
- '--password'
- - '/app/config/password.txt'
+ - '/chain/config/password.txt'
- '--datadir'
- - '/app/.ethereum/devchain'
+ - '/chain/chain-data/'
- '--unlock'
- '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'
- - '--unlock'
- - '0x70997970C51812dc3A010C7d01b50e0d17dc79C8'
- - '--unlock'
- - '0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC'
- '--mine'
- '--miner.etherbase'
- '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'
- '--ipcdisable'
- '--http.api'
- - 'admin,debug,web3,eth,txpool,personal,miner,net'
+ - 'admin,debug,clique,eth,miner,net,personal,txpool,web3'
- '--http'
- '--http.vhosts'
- '*'
@@ -95,11 +87,11 @@ spec:
- '--http.corsdomain'
- '*'
- '--vmdebug'
- - '--networkid={{ .Values.geth.networkid }}'
+ - '--networkid={{ $cfg.networkId }}'
- '--rpc.txfeecap'
- '0'
- '--dev.period'
- - '{{ .Values.geth.blocktime }}'
+ - '{{ $.Values.geth.blocktime }}'
- '--miner.gasprice'
- '10000000000'
ports:
@@ -107,26 +99,28 @@ spec:
containerPort: 8544
- name: ws-rpc
containerPort: 8546
- {{ if (hasKey .Values.geth "resources") }}
+ {{ if (hasKey $.Values.geth "resources") }}
resources:
requests:
- memory: {{ default "1024Mi" .Values.geth.resources.requests.memory }}
- cpu: {{ default "1000m" .Values.geth.resources.requests.cpu }}
+ memory: {{ default "1024Mi" $.Values.geth.resources.requests.memory }}
+ cpu: {{ default "1000m" $.Values.geth.resources.requests.cpu }}
limits:
- memory: {{ default "1024Mi" .Values.geth.resources.limits.memory }}
- cpu: {{ default "1000m" .Values.geth.resources.limits.cpu }}
+ memory: {{ default "1024Mi" $.Values.geth.resources.limits.memory }}
+ cpu: {{ default "1000m" $.Values.geth.resources.limits.cpu }}
{{ else }}
{{ end }}
-{{- with .Values.nodeSelector }}
+{{- with $.Values.nodeSelector }}
nodeSelector:
{{ toYaml . | indent 8 }}
{{- end }}
-{{- with .Values.affinity }}
+{{- with $.Values.affinity }}
affinity:
{{ toYaml . | indent 8 }}
{{- end }}
-{{- with .Values.tolerations }}
+{{- with $.Values.tolerations }}
tolerations:
{{ toYaml . | indent 8 }}
{{- end }}
-{{ end }}
+---
+{{- end }}
+{{ end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/geth-networkpolicy.yaml b/charts/chainlink-cluster/templates/geth-networkpolicy.yaml
index 5be59136251..025d6184501 100644
--- a/charts/chainlink-cluster/templates/geth-networkpolicy.yaml
+++ b/charts/chainlink-cluster/templates/geth-networkpolicy.yaml
@@ -1,3 +1,4 @@
+{{- if .Values.networkPolicies.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
@@ -23,3 +24,4 @@ spec:
port: 8544
- protocol: TCP
port: 8546
+{{- end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/geth-service.yaml b/charts/chainlink-cluster/templates/geth-service.yaml
index cdae0c4bdf0..3016c53048f 100644
--- a/charts/chainlink-cluster/templates/geth-service.yaml
+++ b/charts/chainlink-cluster/templates/geth-service.yaml
@@ -1,12 +1,13 @@
{{ if (hasKey .Values "geth") }}
+{{- range $cfg := .Values.geth.chains }}
apiVersion: v1
kind: Service
metadata:
- name: geth
+ name: geth-{{ $cfg.networkId }}
spec:
selector:
- app: geth
- release: {{ .Release.Name }}
+ instance: geth-{{ $cfg.networkId }}
+ release: {{ $.Release.Name }}
ports:
- name: ws-rpc
port: {{ default "8546" $.Values.geth.wsrpc_port}}
@@ -15,4 +16,6 @@ spec:
port: {{ default "8544" $.Values.geth.httprpc_port}}
targetPort: http-rpc
type: ClusterIP
+---
+{{- end }}
{{ end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/ingress.yaml b/charts/chainlink-cluster/templates/ingress.yaml
index f7d9791155b..e84de6eae69 100644
--- a/charts/chainlink-cluster/templates/ingress.yaml
+++ b/charts/chainlink-cluster/templates/ingress.yaml
@@ -30,7 +30,7 @@ spec:
http:
paths:
{{- range .http.paths }}
- - path: /
+ - path: "/*"
pathType: ImplementationSpecific
backend:
service:
diff --git a/charts/chainlink-cluster/templates/mockserver-networkpolicy.yaml b/charts/chainlink-cluster/templates/mockserver-networkpolicy.yaml
index 074b1ab089a..6ac4f658e37 100644
--- a/charts/chainlink-cluster/templates/mockserver-networkpolicy.yaml
+++ b/charts/chainlink-cluster/templates/mockserver-networkpolicy.yaml
@@ -1,3 +1,4 @@
+{{- if .Values.networkPolicies.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
@@ -21,3 +22,4 @@ spec:
ports:
- protocol: TCP
port: 1080
+{{- end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/networkpolicy-default.yaml b/charts/chainlink-cluster/templates/networkpolicy-default.yaml
index f2d9416cf15..a2cc23ed7f9 100644
--- a/charts/chainlink-cluster/templates/networkpolicy-default.yaml
+++ b/charts/chainlink-cluster/templates/networkpolicy-default.yaml
@@ -1,3 +1,4 @@
+{{- if .Values.networkPolicies.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
@@ -39,3 +40,4 @@ spec:
port: 53
- protocol: UDP
port: 53
+{{- end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/runner-networkpolicy.yaml b/charts/chainlink-cluster/templates/runner-networkpolicy.yaml
index 2bb6ac98625..b75a2ffa772 100644
--- a/charts/chainlink-cluster/templates/runner-networkpolicy.yaml
+++ b/charts/chainlink-cluster/templates/runner-networkpolicy.yaml
@@ -1,3 +1,4 @@
+{{- if .Values.networkPolicies.enabled }}
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
@@ -17,3 +18,4 @@ spec:
- podSelector:
matchLabels:
app: runner
+{{- end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/values.yaml b/charts/chainlink-cluster/values.yaml
index 24914a40a91..fefb819cf2f 100644
--- a/charts/chainlink-cluster/values.yaml
+++ b/charts/chainlink-cluster/values.yaml
@@ -121,8 +121,19 @@ geth:
version: v1.12.0
wsrpc-port: 8546
httprpc-port: 8544
- networkid: 1337
blocktime: 1
+ chains:
+ - networkId: 1337
+ # use to inject custom configuration for each chain, e.g. GasEstimator
+ # - customEVMConfigToml: |
+ # [EVM.GasEstimator]
+ # PriceMax = '200 gwei'
+ # LimitDefault = 6000000
+ # FeeCapDefault = '200 gwei'
+ # [EVM.GasEstimator.BlockHistory]
+ # BlockHistorySize = 200
+ # EIP1559FeeCapBufferBlocks = 0
+ - networkId: 2337
resources:
requests:
cpu: 1
@@ -284,6 +295,9 @@ nodeSelector:
tolerations:
affinity:
+networkPolicies:
+ enabled: true
+
# Configure the default network policy.
networkPolicyDefault:
ingress:
diff --git a/common/client/mock_rpc_test.go b/common/client/mock_rpc_test.go
index d87a02d47c1..72c6eb19029 100644
--- a/common/client/mock_rpc_test.go
+++ b/common/client/mock_rpc_test.go
@@ -426,6 +426,36 @@ func (_m *mockRPC[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS
return r0, r1
}
+// PendingCallContract provides a mock function with given fields: ctx, msg
+func (_m *mockRPC[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD]) PendingCallContract(ctx context.Context, msg interface{}) ([]byte, error) {
+ ret := _m.Called(ctx, msg)
+
+ if len(ret) == 0 {
+ panic("no return value specified for PendingCallContract")
+ }
+
+ var r0 []byte
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, interface{}) ([]byte, error)); ok {
+ return rf(ctx, msg)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, interface{}) []byte); ok {
+ r0 = rf(ctx, msg)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).([]byte)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, interface{}) error); ok {
+ r1 = rf(ctx, msg)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
// PendingSequenceAt provides a mock function with given fields: ctx, addr
func (_m *mockRPC[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD]) PendingSequenceAt(ctx context.Context, addr ADDR) (SEQ, error) {
ret := _m.Called(ctx, addr)
diff --git a/common/client/models.go b/common/client/models.go
index bd974f901fc..d0cf42a3844 100644
--- a/common/client/models.go
+++ b/common/client/models.go
@@ -18,8 +18,15 @@ const (
InsufficientFunds // Tx was rejected due to insufficient funds.
ExceedsMaxFee // Attempt's fee was higher than the node's limit and got rejected.
FeeOutOfValidRange // This error is returned when we use a fee price suggested from an RPC, but the network rejects the attempt due to an invalid range(mostly used by L2 chains). Retry by requesting a new suggested fee price.
+ sendTxReturnCodeLen // tracks the number of errors. Must always be last
)
+// sendTxSevereErrors - error codes which signal that transaction would never be accepted in its current form by the node
+var sendTxSevereErrors = []SendTxReturnCode{Fatal, Underpriced, Unsupported, ExceedsMaxFee, FeeOutOfValidRange, Unknown}
+
+// sendTxSuccessfulCodes - error codes which signal that transaction was accepted by the node
+var sendTxSuccessfulCodes = []SendTxReturnCode{Successful, TransactionAlreadyKnown}
+
type NodeTier int
const (
diff --git a/common/client/multi_node.go b/common/client/multi_node.go
index 7d55784e68f..ae9b3afd0d4 100644
--- a/common/client/multi_node.go
+++ b/common/client/multi_node.go
@@ -3,7 +3,9 @@ package client
import (
"context"
"fmt"
+ "math"
"math/big"
+ "slices"
"sync"
"time"
@@ -26,6 +28,11 @@ var (
Name: "multi_node_states",
Help: "The number of RPC nodes currently in the given state for the given chain",
}, []string{"network", "chainId", "state"})
+ // PromMultiNodeInvariantViolations reports violation of our assumptions
+ PromMultiNodeInvariantViolations = promauto.NewCounterVec(prometheus.CounterOpts{
+ Name: "multi_node_invariant_violations",
+ Help: "The number of invariant violations",
+ }, []string{"network", "chainId", "invariant"})
ErroringNodeError = fmt.Errorf("no live nodes available")
)
@@ -94,6 +101,7 @@ type multiNode[
leaseTicker *time.Ticker
chainFamily string
reportInterval time.Duration
+ sendTxSoftTimeout time.Duration // defines max waiting time from first response til responses evaluation
activeMu sync.RWMutex
activeNode Node[CHAIN_ID, HEAD, RPC_CLIENT]
@@ -101,7 +109,7 @@ type multiNode[
chStop services.StopChan
wg sync.WaitGroup
- sendOnlyErrorParser func(err error) SendTxReturnCode
+ classifySendTxError func(tx TX, err error) SendTxReturnCode
}
func NewMultiNode[
@@ -127,13 +135,16 @@ func NewMultiNode[
chainID CHAIN_ID,
chainType config.ChainType,
chainFamily string,
- sendOnlyErrorParser func(err error) SendTxReturnCode,
+ classifySendTxError func(tx TX, err error) SendTxReturnCode,
+ sendTxSoftTimeout time.Duration,
) MultiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT] {
nodeSelector := newNodeSelector(selectionMode, nodes)
-
// Prometheus' default interval is 15s, set this to under 7.5s to avoid
// aliasing (see: https://en.wikipedia.org/wiki/Nyquist_frequency)
const reportInterval = 6500 * time.Millisecond
+ if sendTxSoftTimeout == 0 {
+ sendTxSoftTimeout = QueryTimeout / 2
+ }
c := &multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]{
nodes: nodes,
sendonlys: sendonlys,
@@ -146,8 +157,9 @@ func NewMultiNode[
chStop: make(services.StopChan),
leaseDuration: leaseDuration,
chainFamily: chainFamily,
- sendOnlyErrorParser: sendOnlyErrorParser,
+ classifySendTxError: classifySendTxError,
reportInterval: reportInterval,
+ sendTxSoftTimeout: sendTxSoftTimeout,
}
c.lggr.Debugf("The MultiNode is configured to use NodeSelectionMode: %s", selectionMode)
@@ -394,6 +406,10 @@ func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OP
// main node is used at the end for the return value
continue
}
+
+ if n.State() != nodeStateAlive {
+ continue
+ }
// Parallel call made to all other nodes with ignored return value
wg.Add(1)
go func(n SendOnlyNode[CHAIN_ID, RPC_CLIENT]) {
@@ -449,6 +465,17 @@ func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OP
return n.RPC().CallContract(ctx, attempt, blockNumber)
}
+func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]) PendingCallContract(
+ ctx context.Context,
+ attempt interface{},
+) (rpcErr []byte, extractErr error) {
+ n, err := c.selectNode()
+ if err != nil {
+ return rpcErr, err
+ }
+ return n.RPC().PendingCallContract(ctx, attempt)
+}
+
// ChainID makes a direct RPC call. In most cases it should be better to use the configured chain id instead by
// calling ConfiguredChainID.
func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]) ChainID(ctx context.Context) (id CHAIN_ID, err error) {
@@ -545,45 +572,200 @@ func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OP
return n.RPC().SendEmptyTransaction(ctx, newTxAttempt, seq, gasLimit, fee, fromAddress)
}
-func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]) SendTransaction(ctx context.Context, tx TX) error {
- main, nodeError := c.selectNode()
- var all []SendOnlyNode[CHAIN_ID, RPC_CLIENT]
- for _, n := range c.nodes {
- all = append(all, n)
+type sendTxResult struct {
+ Err error
+ ResultCode SendTxReturnCode
+}
+
+func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]) broadcastTxAsync(ctx context.Context,
+ n SendOnlyNode[CHAIN_ID, RPC_CLIENT], tx TX) sendTxResult {
+ txErr := n.RPC().SendTransaction(ctx, tx)
+ c.lggr.Debugw("Node sent transaction", "name", n.String(), "tx", tx, "err", txErr)
+ resultCode := c.classifySendTxError(tx, txErr)
+ if !slices.Contains(sendTxSuccessfulCodes, resultCode) {
+ c.lggr.Warnw("RPC returned error", "name", n.String(), "tx", tx, "err", txErr)
}
- all = append(all, c.sendonlys...)
- for _, n := range all {
- if n == main {
- // main node is used at the end for the return value
- continue
+
+ return sendTxResult{Err: txErr, ResultCode: resultCode}
+}
+
+// collectTxResults - refer to SendTransaction comment for implementation details,
+func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]) collectTxResults(ctx context.Context, tx TX, healthyNodesNum int, txResults <-chan sendTxResult) error {
+ if healthyNodesNum == 0 {
+ return ErroringNodeError
+ }
+ // combine context and stop channel to ensure we stop, when signal received
+ ctx, cancel := c.chStop.Ctx(ctx)
+ defer cancel()
+ requiredResults := int(math.Ceil(float64(healthyNodesNum) * sendTxQuorum))
+ errorsByCode := map[SendTxReturnCode][]error{}
+ var softTimeoutChan <-chan time.Time
+ var resultsCount int
+loop:
+ for {
+ select {
+ case <-ctx.Done():
+ c.lggr.Debugw("Failed to collect of the results before context was done", "tx", tx, "errorsByCode", errorsByCode)
+ return ctx.Err()
+ case result := <-txResults:
+ errorsByCode[result.ResultCode] = append(errorsByCode[result.ResultCode], result.Err)
+ resultsCount++
+ if slices.Contains(sendTxSuccessfulCodes, result.ResultCode) || resultsCount >= requiredResults {
+ break loop
+ }
+ case <-softTimeoutChan:
+ c.lggr.Debugw("Send Tx soft timeout expired - returning responses we've collected so far", "tx", tx, "resultsCount", resultsCount, "requiredResults", requiredResults)
+ break loop
}
- // Parallel send to all other nodes with ignored return value
- // Async - we do not want to block the main thread with secondary nodes
- // in case they are unreliable/slow.
- // It is purely a "best effort" send.
- // Resource is not unbounded because the default context has a timeout.
- ok := c.IfNotStopped(func() {
- // Must wrap inside IfNotStopped to avoid waitgroup racing with Close
+
+ if softTimeoutChan == nil {
+ tm := time.NewTimer(c.sendTxSoftTimeout)
+ softTimeoutChan = tm.C
+ // we are fine with stopping timer at the end of function
+ //nolint
+ defer tm.Stop()
+ }
+ }
+
+ // ignore critical error as it's reported in reportSendTxAnomalies
+ result, _ := aggregateTxResults(errorsByCode)
+ return result
+
+}
+
+func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]) reportSendTxAnomalies(tx TX, txResults <-chan sendTxResult) {
+ defer c.wg.Done()
+ resultsByCode := map[SendTxReturnCode][]error{}
+ // txResults eventually will be closed
+ for txResult := range txResults {
+ resultsByCode[txResult.ResultCode] = append(resultsByCode[txResult.ResultCode], txResult.Err)
+ }
+
+ _, criticalErr := aggregateTxResults(resultsByCode)
+ if criticalErr != nil {
+ c.lggr.Criticalw("observed invariant violation on SendTransaction", "tx", tx, "resultsByCode", resultsByCode, "err", criticalErr)
+ c.SvcErrBuffer.Append(criticalErr)
+ PromMultiNodeInvariantViolations.WithLabelValues(c.chainFamily, c.chainID.String(), criticalErr.Error()).Inc()
+ }
+}
+
+func aggregateTxResults(resultsByCode map[SendTxReturnCode][]error) (txResult error, err error) {
+ severeErrors, hasSevereErrors := findFirstIn(resultsByCode, sendTxSevereErrors)
+ successResults, hasSuccess := findFirstIn(resultsByCode, sendTxSuccessfulCodes)
+ if hasSuccess {
+ // We assume that primary node would never report false positive txResult for a transaction.
+ // Thus, if such case occurs it's probably due to misconfiguration or a bug and requires manual intervention.
+ if hasSevereErrors {
+ const errMsg = "found contradictions in nodes replies on SendTransaction: got success and severe error"
+ // return success, since at least 1 node has accepted our broadcasted Tx, and thus it can now be included onchain
+ return successResults[0], fmt.Errorf(errMsg)
+ }
+
+ // other errors are temporary - we are safe to return success
+ return successResults[0], nil
+ }
+
+ if hasSevereErrors {
+ return severeErrors[0], nil
+ }
+
+ // return temporary error
+ for _, result := range resultsByCode {
+ return result[0], nil
+ }
+
+ err = fmt.Errorf("expected at least one response on SendTransaction")
+ return err, err
+}
+
+const sendTxQuorum = 0.7
+
+// SendTransaction - broadcasts transaction to all the send-only and primary nodes regardless of their health.
+// A returned nil or error does not guarantee that the transaction will or won't be included. Additional checks must be
+// performed to determine the final state.
+//
+// Send-only nodes' results are ignored as they tend to return false-positive responses. Broadcast to them is necessary
+// to speed up the propagation of TX in the network.
+//
+// Handling of primary nodes' results consists of collection and aggregation.
+// In the collection step, we gather as many results as possible while minimizing waiting time. This operation succeeds
+// on one of the following conditions:
+// * Received at least one success
+// * Received at least one result and `sendTxSoftTimeout` expired
+// * Received results from the sufficient number of nodes defined by sendTxQuorum.
+// The aggregation is based on the following conditions:
+// * If there is at least one success - returns success
+// * If there is at least one terminal error - returns terminal error
+// * If there is both success and terminal error - returns success and reports invariant violation
+// * Otherwise, returns any (effectively random) of the errors.
+func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]) SendTransaction(ctx context.Context, tx TX) error {
+ if len(c.nodes) == 0 {
+ return ErroringNodeError
+ }
+
+ healthyNodesNum := 0
+ txResults := make(chan sendTxResult, len(c.nodes))
+ // Must wrap inside IfNotStopped to avoid waitgroup racing with Close
+ ok := c.IfNotStopped(func() {
+ // fire-n-forget, as sendOnlyNodes can not be trusted with result reporting
+ for _, n := range c.sendonlys {
+ if n.State() != nodeStateAlive {
+ continue
+ }
c.wg.Add(1)
go func(n SendOnlyNode[CHAIN_ID, RPC_CLIENT]) {
defer c.wg.Done()
+ c.broadcastTxAsync(ctx, n, tx)
+ }(n)
+ }
- txErr := n.RPC().SendTransaction(ctx, tx)
- c.lggr.Debugw("Sendonly node sent transaction", "name", n.String(), "tx", tx, "err", txErr)
- sendOnlyError := c.sendOnlyErrorParser(txErr)
- if sendOnlyError != Successful {
- c.lggr.Warnw("RPC returned error", "name", n.String(), "tx", tx, "err", txErr)
- }
+ var primaryBroadcastWg sync.WaitGroup
+ txResultsToReport := make(chan sendTxResult, len(c.nodes))
+ for _, n := range c.nodes {
+ if n.State() != nodeStateAlive {
+ continue
+ }
+
+ healthyNodesNum++
+ primaryBroadcastWg.Add(1)
+ go func(n SendOnlyNode[CHAIN_ID, RPC_CLIENT]) {
+ defer primaryBroadcastWg.Done()
+ result := c.broadcastTxAsync(ctx, n, tx)
+ // both channels are sufficiently buffered, so we won't be locked
+ txResultsToReport <- result
+ txResults <- result
}(n)
- })
- if !ok {
- c.lggr.Debug("Cannot send transaction on sendonly node; MultiNode is stopped", "node", n.String())
}
+
+ c.wg.Add(1)
+ go func() {
+ // wait for primary nodes to finish the broadcast before closing the channel
+ primaryBroadcastWg.Wait()
+ close(txResultsToReport)
+ close(txResults)
+ c.wg.Done()
+ }()
+
+ c.wg.Add(1)
+ go c.reportSendTxAnomalies(tx, txResultsToReport)
+
+ })
+ if !ok {
+ return fmt.Errorf("aborted while broadcasting tx - multiNode is stopped: %w", context.Canceled)
}
- if nodeError != nil {
- return nodeError
+
+ return c.collectTxResults(ctx, tx, healthyNodesNum, txResults)
+}
+
+// findFirstIn - returns first existing value for the slice of keys
+func findFirstIn[K comparable, V any](set map[K]V, keys []K) (V, bool) {
+ for _, k := range keys {
+ if v, ok := set[k]; ok {
+ return v, true
+ }
}
- return main.RPC().SendTransaction(ctx, tx)
+ var v V
+ return v, false
}
func (c *multiNode[CHAIN_ID, SEQ, ADDR, BLOCK_HASH, TX, TX_HASH, EVENT, EVENT_OPS, TX_RECEIPT, FEE, HEAD, RPC_CLIENT]) SequenceAt(ctx context.Context, account ADDR, blockNumber *big.Int) (s SEQ, err error) {
diff --git a/common/client/multi_node_test.go b/common/client/multi_node_test.go
index 82af7411080..dabaae57c5d 100644
--- a/common/client/multi_node_test.go
+++ b/common/client/multi_node_test.go
@@ -1,9 +1,10 @@
package client
import (
+ "context"
"errors"
"fmt"
- big "math/big"
+ "math/big"
"math/rand"
"testing"
"time"
@@ -38,7 +39,8 @@ type multiNodeOpts struct {
chainID types.ID
chainType config.ChainType
chainFamily string
- sendOnlyErrorParser func(err error) SendTxReturnCode
+ classifySendTxError func(tx any, err error) SendTxReturnCode
+ sendTxSoftTimeout time.Duration
}
func newTestMultiNode(t *testing.T, opts multiNodeOpts) testMultiNode {
@@ -49,7 +51,7 @@ func newTestMultiNode(t *testing.T, opts multiNodeOpts) testMultiNode {
result := NewMultiNode[types.ID, *big.Int, Hashable, Hashable, any, Hashable, any, any,
types.Receipt[Hashable, Hashable], Hashable, types.Head[Hashable], multiNodeRPCClient](opts.logger,
opts.selectionMode, opts.leaseDuration, opts.noNewHeadsThreshold, opts.nodes, opts.sendonlys,
- opts.chainID, opts.chainType, opts.chainFamily, opts.sendOnlyErrorParser)
+ opts.chainID, opts.chainType, opts.chainFamily, opts.classifySendTxError, opts.sendTxSoftTimeout)
return testMultiNode{
result.(*multiNode[types.ID, *big.Int, Hashable, Hashable, any, Hashable, any, any,
types.Receipt[Hashable, Hashable], Hashable, types.Head[Hashable], multiNodeRPCClient]),
@@ -533,8 +535,10 @@ func TestMultiNode_BatchCallContextAll(t *testing.T) {
// setup ok and failed auxiliary nodes
okNode := newMockSendOnlyNode[types.ID, multiNodeRPCClient](t)
okNode.On("RPC").Return(okRPC).Once()
+ okNode.On("State").Return(nodeStateAlive)
failedNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
failedNode.On("RPC").Return(failedRPC).Once()
+ failedNode.On("State").Return(nodeStateAlive)
// setup main node
mainNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
@@ -555,81 +559,322 @@ func TestMultiNode_BatchCallContextAll(t *testing.T) {
require.NoError(t, err)
tests.RequireLogMessage(t, observedLogs, "Secondary node BatchCallContext failed")
})
-}
-
-func TestMultiNode_SendTransaction(t *testing.T) {
- t.Parallel()
- t.Run("Fails if failed to select active node", func(t *testing.T) {
- chainID := types.RandomID()
- mn := newTestMultiNode(t, multiNodeOpts{
- selectionMode: NodeSelectionModeRoundRobin,
- chainID: chainID,
- })
- nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
- nodeSelector.On("Select").Return(nil).Once()
- nodeSelector.On("Name").Return("MockedNodeSelector").Once()
- mn.nodeSelector = nodeSelector
- err := mn.SendTransaction(tests.Context(t), nil)
- require.EqualError(t, err, ErroringNodeError.Error())
- })
- t.Run("Returns error if RPC call fails for active node", func(t *testing.T) {
- chainID := types.RandomID()
- rpc := newMultiNodeRPCClient(t)
- expectedError := errors.New("rpc failed to do the batch call")
- rpc.On("SendTransaction", mock.Anything, mock.Anything).Return(expectedError).Once()
- node := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
- node.On("RPC").Return(rpc)
- nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
- nodeSelector.On("Select").Return(node).Once()
- mn := newTestMultiNode(t, multiNodeOpts{
- selectionMode: NodeSelectionModeRoundRobin,
- chainID: chainID,
- })
- mn.nodeSelector = nodeSelector
- err := mn.SendTransaction(tests.Context(t), nil)
- require.EqualError(t, err, expectedError.Error())
- })
- t.Run("Returns result of main node and logs secondary nodes results", func(t *testing.T) {
+ t.Run("Does not call BatchCallContext for unhealthy nodes", func(t *testing.T) {
// setup RPCs
- failedRPC := newMultiNodeRPCClient(t)
- failedRPC.On("SendTransaction", mock.Anything, mock.Anything).
- Return(errors.New("rpc failed to do the batch call")).Once()
okRPC := newMultiNodeRPCClient(t)
- okRPC.On("SendTransaction", mock.Anything, mock.Anything).Return(nil).Twice()
+ okRPC.On("BatchCallContext", mock.Anything, mock.Anything).Return(nil).Twice()
// setup ok and failed auxiliary nodes
- okNode := newMockSendOnlyNode[types.ID, multiNodeRPCClient](t)
- okNode.On("RPC").Return(okRPC).Once()
- okNode.On("String").Return("okNode")
- failedNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
- failedNode.On("RPC").Return(failedRPC).Once()
- failedNode.On("String").Return("failedNode")
+ healthyNode := newMockSendOnlyNode[types.ID, multiNodeRPCClient](t)
+ healthyNode.On("RPC").Return(okRPC).Once()
+ healthyNode.On("State").Return(nodeStateAlive)
+ deadNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
+ deadNode.On("State").Return(nodeStateUnreachable)
// setup main node
mainNode := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
mainNode.On("RPC").Return(okRPC)
nodeSelector := newMockNodeSelector[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
nodeSelector.On("Select").Return(mainNode).Once()
- lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel)
mn := newTestMultiNode(t, multiNodeOpts{
selectionMode: NodeSelectionModeRoundRobin,
chainID: types.RandomID(),
- nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{failedNode, mainNode},
- sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{okNode},
- logger: lggr,
- sendOnlyErrorParser: func(err error) SendTxReturnCode {
- if err != nil {
- return Fatal
- }
-
- return Successful
- },
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{deadNode, mainNode},
+ sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{healthyNode, deadNode},
})
mn.nodeSelector = nodeSelector
+ err := mn.BatchCallContextAll(tests.Context(t), nil)
+ require.NoError(t, err)
+ })
+}
+
+func TestMultiNode_SendTransaction(t *testing.T) {
+ t.Parallel()
+ classifySendTxError := func(tx any, err error) SendTxReturnCode {
+ if err != nil {
+ return Fatal
+ }
+
+ return Successful
+ }
+ newNodeWithState := func(t *testing.T, state nodeState, txErr error, sendTxRun func(args mock.Arguments)) *mockNode[types.ID, types.Head[Hashable], multiNodeRPCClient] {
+ rpc := newMultiNodeRPCClient(t)
+ rpc.On("SendTransaction", mock.Anything, mock.Anything).Return(txErr).Run(sendTxRun).Maybe()
+ node := newMockNode[types.ID, types.Head[Hashable], multiNodeRPCClient](t)
+ node.On("String").Return("node name").Maybe()
+ node.On("RPC").Return(rpc).Maybe()
+ node.On("State").Return(state).Maybe()
+ node.On("Close").Return(nil).Once()
+ return node
+ }
+
+ newNode := func(t *testing.T, txErr error, sendTxRun func(args mock.Arguments)) *mockNode[types.ID, types.Head[Hashable], multiNodeRPCClient] {
+ return newNodeWithState(t, nodeStateAlive, txErr, sendTxRun)
+ }
+ newStartedMultiNode := func(t *testing.T, opts multiNodeOpts) testMultiNode {
+ mn := newTestMultiNode(t, opts)
+ err := mn.StartOnce("startedTestMultiNode", func() error { return nil })
+ require.NoError(t, err)
+ t.Cleanup(func() {
+ require.NoError(t, mn.Close())
+ })
+ return mn
+ }
+ t.Run("Fails if there is no nodes available", func(t *testing.T) {
+ mn := newStartedMultiNode(t, multiNodeOpts{
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: types.RandomID(),
+ })
+ err := mn.SendTransaction(tests.Context(t), nil)
+ assert.EqualError(t, err, ErroringNodeError.Error())
+ })
+ t.Run("Transaction failure happy path", func(t *testing.T) {
+ chainID := types.RandomID()
+ expectedError := errors.New("transaction failed")
+ mainNode := newNode(t, expectedError, nil)
+ lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel)
+ mn := newStartedMultiNode(t, multiNodeOpts{
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: chainID,
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode},
+ sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, errors.New("unexpected error"), nil)},
+ classifySendTxError: classifySendTxError,
+ logger: lggr,
+ })
+ err := mn.SendTransaction(tests.Context(t), nil)
+ require.EqualError(t, err, expectedError.Error())
+ tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)
+ tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 2)
+ })
+ t.Run("Transaction success happy path", func(t *testing.T) {
+ chainID := types.RandomID()
+ mainNode := newNode(t, nil, nil)
+ lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel)
+ mn := newStartedMultiNode(t, multiNodeOpts{
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: chainID,
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode},
+ sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, errors.New("unexpected error"), nil)},
+ classifySendTxError: classifySendTxError,
+ logger: lggr,
+ })
+ err := mn.SendTransaction(tests.Context(t), nil)
+ require.NoError(t, err)
+ tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)
+ tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1)
+ })
+ t.Run("Context expired before collecting sufficient results", func(t *testing.T) {
+ chainID := types.RandomID()
+ testContext, testCancel := context.WithCancel(tests.Context(t))
+ defer testCancel()
+ mainNode := newNode(t, errors.New("unexpected error"), func(_ mock.Arguments) {
+ // block caller til end of the test
+ <-testContext.Done()
+ })
+ mn := newStartedMultiNode(t, multiNodeOpts{
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: chainID,
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode},
+ classifySendTxError: classifySendTxError,
+ })
+ requestContext, cancel := context.WithCancel(tests.Context(t))
+ cancel()
+ err := mn.SendTransaction(requestContext, nil)
+ require.EqualError(t, err, "context canceled")
+ })
+ t.Run("Soft timeout stops results collection", func(t *testing.T) {
+ chainID := types.RandomID()
+ expectedError := errors.New("tmp error")
+ fastNode := newNode(t, expectedError, nil)
+ // hold reply from the node till end of the test
+ testContext, testCancel := context.WithCancel(tests.Context(t))
+ defer testCancel()
+ slowNode := newNode(t, errors.New("transaction failed"), func(_ mock.Arguments) {
+ // block caller til end of the test
+ <-testContext.Done()
+ })
+ mn := newStartedMultiNode(t, multiNodeOpts{
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: chainID,
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{fastNode, slowNode},
+ classifySendTxError: classifySendTxError,
+ sendTxSoftTimeout: tests.TestInterval,
+ })
+ err := mn.SendTransaction(tests.Context(t), nil)
+ require.EqualError(t, err, expectedError.Error())
+ })
+ t.Run("Returns success without waiting for the rest of the nodes", func(t *testing.T) {
+ chainID := types.RandomID()
+ fastNode := newNode(t, nil, nil)
+ // hold reply from the node till end of the test
+ testContext, testCancel := context.WithCancel(tests.Context(t))
+ defer testCancel()
+ slowNode := newNode(t, errors.New("transaction failed"), func(_ mock.Arguments) {
+ // block caller til end of the test
+ <-testContext.Done()
+ })
+ slowSendOnly := newNode(t, errors.New("send only failed"), func(_ mock.Arguments) {
+ // block caller til end of the test
+ <-testContext.Done()
+ })
+ lggr, observedLogs := logger.TestObserved(t, zap.WarnLevel)
+ mn := newTestMultiNode(t, multiNodeOpts{
+ logger: lggr,
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: chainID,
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{fastNode, slowNode},
+ sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{slowSendOnly},
+ classifySendTxError: classifySendTxError,
+ sendTxSoftTimeout: tests.TestInterval,
+ })
+ assert.NoError(t, mn.StartOnce("startedTestMultiNode", func() error { return nil }))
+ err := mn.SendTransaction(tests.Context(t), nil)
+ require.NoError(t, err)
+ testCancel()
+ require.NoError(t, mn.Close())
+ tests.AssertLogEventually(t, observedLogs, "observed invariant violation on SendTransaction")
+ })
+ t.Run("Fails when closed", func(t *testing.T) {
+ mn := newTestMultiNode(t, multiNodeOpts{
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: types.RandomID(),
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{newNode(t, nil, nil)},
+ sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNode(t, nil, nil)},
+ classifySendTxError: classifySendTxError,
+ })
+ err := mn.StartOnce("startedTestMultiNode", func() error { return nil })
+ require.NoError(t, err)
+ require.NoError(t, mn.Close())
+ err = mn.SendTransaction(tests.Context(t), nil)
+ require.EqualError(t, err, "aborted while broadcasting tx - multiNode is stopped: context canceled")
+ })
+ t.Run("Returns error if there is no healthy primary nodes", func(t *testing.T) {
+ mn := newStartedMultiNode(t, multiNodeOpts{
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: types.RandomID(),
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{newNodeWithState(t, nodeStateUnreachable, nil, nil)},
+ sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{newNodeWithState(t, nodeStateUnreachable, nil, nil)},
+ classifySendTxError: classifySendTxError,
+ })
+ err := mn.SendTransaction(tests.Context(t), nil)
+ assert.EqualError(t, err, ErroringNodeError.Error())
+ })
+ t.Run("Transaction success even if one of the nodes is unhealthy", func(t *testing.T) {
+ chainID := types.RandomID()
+ mainNode := newNode(t, nil, nil)
+ unexpectedCall := func(args mock.Arguments) {
+ panic("SendTx must not be called for unhealthy node")
+ }
+ unhealthyNode := newNodeWithState(t, nodeStateUnreachable, nil, unexpectedCall)
+ unhealthySendOnlyNode := newNodeWithState(t, nodeStateUnreachable, nil, unexpectedCall)
+ lggr, observedLogs := logger.TestObserved(t, zap.DebugLevel)
+ mn := newStartedMultiNode(t, multiNodeOpts{
+ selectionMode: NodeSelectionModeRoundRobin,
+ chainID: chainID,
+ nodes: []Node[types.ID, types.Head[Hashable], multiNodeRPCClient]{mainNode, unhealthyNode},
+ sendonlys: []SendOnlyNode[types.ID, multiNodeRPCClient]{unhealthySendOnlyNode, newNode(t, errors.New("unexpected error"), nil)},
+ classifySendTxError: classifySendTxError,
+ logger: lggr,
+ })
err := mn.SendTransaction(tests.Context(t), nil)
require.NoError(t, err)
- tests.AssertLogEventually(t, observedLogs, "Sendonly node sent transaction")
- tests.AssertLogEventually(t, observedLogs, "RPC returned error")
+ tests.AssertLogCountEventually(t, observedLogs, "Node sent transaction", 2)
+ tests.AssertLogCountEventually(t, observedLogs, "RPC returned error", 1)
})
}
+
+func TestMultiNode_SendTransaction_aggregateTxResults(t *testing.T) {
+ t.Parallel()
+ // ensure failure on new SendTxReturnCode
+ codesToCover := map[SendTxReturnCode]struct{}{}
+ for code := Successful; code < sendTxReturnCodeLen; code++ {
+ codesToCover[code] = struct{}{}
+ }
+
+ testCases := []struct {
+ Name string
+ ExpectedTxResult string
+ ExpectedCriticalErr string
+ ResultsByCode map[SendTxReturnCode][]error
+ }{
+ {
+ Name: "Returns success and logs critical error on success and Fatal",
+ ExpectedTxResult: "success",
+ ExpectedCriticalErr: "found contradictions in nodes replies on SendTransaction: got success and severe error",
+ ResultsByCode: map[SendTxReturnCode][]error{
+ Successful: {errors.New("success")},
+ Fatal: {errors.New("fatal")},
+ },
+ },
+ {
+ Name: "Returns TransactionAlreadyKnown and logs critical error on TransactionAlreadyKnown and Fatal",
+ ExpectedTxResult: "tx_already_known",
+ ExpectedCriticalErr: "found contradictions in nodes replies on SendTransaction: got success and severe error",
+ ResultsByCode: map[SendTxReturnCode][]error{
+ TransactionAlreadyKnown: {errors.New("tx_already_known")},
+ Unsupported: {errors.New("unsupported")},
+ },
+ },
+ {
+ Name: "Prefers sever error to temporary",
+ ExpectedTxResult: "underpriced",
+ ExpectedCriticalErr: "",
+ ResultsByCode: map[SendTxReturnCode][]error{
+ Retryable: {errors.New("retryable")},
+ Underpriced: {errors.New("underpriced")},
+ },
+ },
+ {
+ Name: "Returns temporary error",
+ ExpectedTxResult: "retryable",
+ ExpectedCriticalErr: "",
+ ResultsByCode: map[SendTxReturnCode][]error{
+ Retryable: {errors.New("retryable")},
+ },
+ },
+ {
+ Name: "Insufficient funds is treated as error",
+ ExpectedTxResult: "",
+ ExpectedCriticalErr: "",
+ ResultsByCode: map[SendTxReturnCode][]error{
+ Successful: {nil},
+ InsufficientFunds: {errors.New("insufficientFunds")},
+ },
+ },
+ {
+ Name: "Logs critical error on empty ResultsByCode",
+ ExpectedTxResult: "expected at least one response on SendTransaction",
+ ExpectedCriticalErr: "expected at least one response on SendTransaction",
+ ResultsByCode: map[SendTxReturnCode][]error{},
+ },
+ }
+
+ for _, testCase := range testCases {
+ for code := range testCase.ResultsByCode {
+ delete(codesToCover, code)
+ }
+ t.Run(testCase.Name, func(t *testing.T) {
+ txResult, err := aggregateTxResults(testCase.ResultsByCode)
+ if testCase.ExpectedTxResult == "" {
+ assert.NoError(t, err)
+ } else {
+ assert.EqualError(t, txResult, testCase.ExpectedTxResult)
+ }
+
+ if testCase.ExpectedCriticalErr == "" {
+ assert.NoError(t, err)
+ } else {
+ assert.EqualError(t, err, testCase.ExpectedCriticalErr)
+ }
+ })
+ }
+
+ // explicitly signal that following codes are properly handled in aggregateTxResults,
+ //but dedicated test cases won't be beneficial
+ for _, codeToIgnore := range []SendTxReturnCode{Unknown, ExceedsMaxFee, FeeOutOfValidRange} {
+ delete(codesToCover, codeToIgnore)
+ }
+ assert.Empty(t, codesToCover, "all of the SendTxReturnCode must be covered by this test")
+
+}
diff --git a/common/client/types.go b/common/client/types.go
index 32d4da98b50..fe9e4d7d482 100644
--- a/common/client/types.go
+++ b/common/client/types.go
@@ -124,6 +124,10 @@ type clientAPI[
msg interface{},
blockNumber *big.Int,
) (rpcErr []byte, extractErr error)
+ PendingCallContract(
+ ctx context.Context,
+ msg interface{},
+ ) (rpcErr []byte, extractErr error)
CallContext(ctx context.Context, result interface{}, method string, args ...interface{}) error
CodeAt(ctx context.Context, account ADDR, blockNumber *big.Int) ([]byte, error)
}
diff --git a/common/txmgr/types/tx.go b/common/txmgr/types/tx.go
index 31f568b99a2..27cda86f6eb 100644
--- a/common/txmgr/types/tx.go
+++ b/common/txmgr/types/tx.go
@@ -146,6 +146,10 @@ type TxMeta[ADDR types.Hashable, TX_HASH types.Hashable] struct {
// Used for keepers
UpkeepID *string `json:"UpkeepID,omitempty"`
+ // Used for VRF to know if the txn is a ForceFulfilment txn
+ ForceFulfilled *bool `json:"ForceFulfilled,omitempty"`
+ ForceFulfillmentAttempt *uint64 `json:"ForceFulfillmentAttempt,omitempty"`
+
// Used only for forwarded txs, tracks the original destination address.
// When this is set, it indicates tx is forwarded through To address.
FwdrDestAddress *ADDR `json:"ForwarderDestAddress,omitempty"`
diff --git a/contracts/STYLE_GUIDE.md b/contracts/STYLE_GUIDE.md
index 3868117d4b9..903832cf099 100644
--- a/contracts/STYLE_GUIDE.md
+++ b/contracts/STYLE_GUIDE.md
@@ -239,12 +239,10 @@ Here are some examples of what this should look like:
```solidity
contract AccessControlledFoo is Foo {
- // solhint-disable-next-line chainlink-solidity/all-caps-constant-storage-variables
string public constant override typeAndVersion = "AccessControlledFoo 1.0.0";
}
contract OffchainAggregator is ITypeAndVersion {
- // solhint-disable-next-line chainlink-solidity/all-caps-constant-storage-variables
string public constant override typeAndVersion = "OffchainAggregator 1.0.0";
function getData() public returns(uint256) {
@@ -256,8 +254,6 @@ contract OffchainAggregator is ITypeAndVersion {
contract SuperDuperAggregator is ITypeAndVersion {
/// This is a new contract that has not been released yet, so we
/// add a `-dev` suffix to the typeAndVersion.
-
- // solhint-disable-next-line chainlink-solidity/all-caps-constant-storage-variables
string public constant override typeAndVersion = "SuperDuperAggregator 1.1.0-dev";
function getData() public returns(uint256) {
@@ -388,4 +384,27 @@ rule: `custom-errors`
Interfaces should be named `IFoo` instead of `FooInterface`. This follows the patterns of popular [libraries like OpenZeppelin’s](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L9).
-rule: `tbd`
\ No newline at end of file
+rule: `tbd`
+
+## Structs
+
+Structs should be constructed with named arguments. This prevents accidental assignment to the wrong field and makes the code more readable.
+
+```solidity
+// Good
+function setConfig(uint64 _foo, uint64 _bar, uint64 _baz) external {
+ config = Config({
+ foo: _foo,
+ bar: _bar,
+ baz: _baz
+ });
+}
+
+// Bad
+function setConfig(uint64 _foo, uint64 _bar, uint64 _baz) external {
+ config = Config(_foo, _bar, _baz);
+}
+```
+
+rule: `tbd`
+
diff --git a/contracts/foundry.toml b/contracts/foundry.toml
index 003c836b1f3..931f0d12361 100644
--- a/contracts/foundry.toml
+++ b/contracts/foundry.toml
@@ -43,7 +43,7 @@ solc_version = '0.8.19'
optimizer_runs = 1000000
src = 'src/v0.8/llo-feeds'
test = 'src/v0.8/llo-feeds/test'
-solc_version = '0.8.16'
+solc_version = '0.8.19'
# We cannot turn on deny_warnings = true as that will hide any CI failure
[profile.shared]
diff --git a/contracts/gas-snapshots/llo-feeds.gas-snapshot b/contracts/gas-snapshots/llo-feeds.gas-snapshot
index ad9339a3410..ec037aafb87 100644
--- a/contracts/gas-snapshots/llo-feeds.gas-snapshot
+++ b/contracts/gas-snapshots/llo-feeds.gas-snapshot
@@ -18,98 +18,98 @@ ByteUtilTest:test_readUint32MultiWord() (gas: 552)
ByteUtilTest:test_readUint32WithEmptyArray() (gas: 3253)
ByteUtilTest:test_readUint32WithNotEnoughBytes() (gas: 3272)
ByteUtilTest:test_readZeroAddress() (gas: 519)
-FeeManagerProcessFeeTest:test_DiscountIsAppliedForNative() (gas: 52282)
-FeeManagerProcessFeeTest:test_DiscountIsReturnedForNative() (gas: 52235)
-FeeManagerProcessFeeTest:test_DiscountIsReturnedForNativeWithSurcharge() (gas: 78440)
+FeeManagerProcessFeeTest:test_DiscountIsAppliedForNative() (gas: 52288)
+FeeManagerProcessFeeTest:test_DiscountIsReturnedForNative() (gas: 52241)
+FeeManagerProcessFeeTest:test_DiscountIsReturnedForNativeWithSurcharge() (gas: 78446)
FeeManagerProcessFeeTest:test_V1PayloadVerifies() (gas: 26980)
FeeManagerProcessFeeTest:test_V1PayloadVerifiesAndReturnsChange() (gas: 57895)
-FeeManagerProcessFeeTest:test_V2PayloadVerifies() (gas: 116092)
+FeeManagerProcessFeeTest:test_V2PayloadVerifies() (gas: 116094)
FeeManagerProcessFeeTest:test_V2PayloadWithoutQuoteFails() (gas: 27395)
-FeeManagerProcessFeeTest:test_V2PayloadWithoutZeroFee() (gas: 70368)
+FeeManagerProcessFeeTest:test_V2PayloadWithoutZeroFee() (gas: 70370)
FeeManagerProcessFeeTest:test_WithdrawERC20() (gas: 71617)
FeeManagerProcessFeeTest:test_WithdrawNonAdminAddr() (gas: 56261)
FeeManagerProcessFeeTest:test_WithdrawUnwrappedNative() (gas: 25322)
-FeeManagerProcessFeeTest:test_baseFeeIsAppliedForLink() (gas: 14345)
-FeeManagerProcessFeeTest:test_baseFeeIsAppliedForNative() (gas: 17279)
-FeeManagerProcessFeeTest:test_correctDiscountIsAppliedWhenBothTokensAreDiscounted() (gas: 90285)
-FeeManagerProcessFeeTest:test_discountAIsNotAppliedWhenSetForOtherUsers() (gas: 56171)
-FeeManagerProcessFeeTest:test_discountFeeRoundsDownWhenUneven() (gas: 52482)
-FeeManagerProcessFeeTest:test_discountIsAppliedForLink() (gas: 49277)
-FeeManagerProcessFeeTest:test_discountIsAppliedWith100PercentSurcharge() (gas: 78530)
-FeeManagerProcessFeeTest:test_discountIsNoLongerAppliedAfterRemoving() (gas: 45936)
+FeeManagerProcessFeeTest:test_baseFeeIsAppliedForLink() (gas: 14347)
+FeeManagerProcessFeeTest:test_baseFeeIsAppliedForNative() (gas: 17285)
+FeeManagerProcessFeeTest:test_correctDiscountIsAppliedWhenBothTokensAreDiscounted() (gas: 90297)
+FeeManagerProcessFeeTest:test_discountAIsNotAppliedWhenSetForOtherUsers() (gas: 56177)
+FeeManagerProcessFeeTest:test_discountFeeRoundsDownWhenUneven() (gas: 52490)
+FeeManagerProcessFeeTest:test_discountIsAppliedForLink() (gas: 49279)
+FeeManagerProcessFeeTest:test_discountIsAppliedWith100PercentSurcharge() (gas: 78538)
+FeeManagerProcessFeeTest:test_discountIsNoLongerAppliedAfterRemoving() (gas: 45940)
FeeManagerProcessFeeTest:test_discountIsNotAppliedForInvalidTokenAddress() (gas: 17546)
-FeeManagerProcessFeeTest:test_discountIsNotAppliedToOtherFeeds() (gas: 54241)
-FeeManagerProcessFeeTest:test_discountIsReturnedForLink() (gas: 49252)
+FeeManagerProcessFeeTest:test_discountIsNotAppliedToOtherFeeds() (gas: 54247)
+FeeManagerProcessFeeTest:test_discountIsReturnedForLink() (gas: 49254)
FeeManagerProcessFeeTest:test_emptyQuoteRevertsWithError() (gas: 12152)
FeeManagerProcessFeeTest:test_eventIsEmittedAfterSurchargeIsSet() (gas: 41348)
-FeeManagerProcessFeeTest:test_eventIsEmittedIfNotEnoughLink() (gas: 172711)
+FeeManagerProcessFeeTest:test_eventIsEmittedIfNotEnoughLink() (gas: 172747)
FeeManagerProcessFeeTest:test_eventIsEmittedUponWithdraw() (gas: 68984)
-FeeManagerProcessFeeTest:test_feeIsUpdatedAfterDiscountIsRemoved() (gas: 49176)
-FeeManagerProcessFeeTest:test_feeIsUpdatedAfterNewDiscountIsApplied() (gas: 66973)
-FeeManagerProcessFeeTest:test_feeIsUpdatedAfterNewSurchargeIsApplied() (gas: 63650)
-FeeManagerProcessFeeTest:test_feeIsZeroWith100PercentDiscount() (gas: 51682)
-FeeManagerProcessFeeTest:test_getBaseRewardWithLinkQuote() (gas: 14362)
-FeeManagerProcessFeeTest:test_getLinkFeeIsRoundedUp() (gas: 49468)
-FeeManagerProcessFeeTest:test_getLinkRewardIsSameAsFee() (gas: 54932)
-FeeManagerProcessFeeTest:test_getLinkRewardWithNativeQuoteAndSurchargeWithLinkDiscount() (gas: 82394)
-FeeManagerProcessFeeTest:test_getRewardWithLinkDiscount() (gas: 49295)
-FeeManagerProcessFeeTest:test_getRewardWithLinkQuoteAndLinkDiscount() (gas: 49298)
-FeeManagerProcessFeeTest:test_getRewardWithNativeQuote() (gas: 17299)
-FeeManagerProcessFeeTest:test_getRewardWithNativeQuoteAndSurcharge() (gas: 50481)
+FeeManagerProcessFeeTest:test_feeIsUpdatedAfterDiscountIsRemoved() (gas: 49186)
+FeeManagerProcessFeeTest:test_feeIsUpdatedAfterNewDiscountIsApplied() (gas: 66985)
+FeeManagerProcessFeeTest:test_feeIsUpdatedAfterNewSurchargeIsApplied() (gas: 63666)
+FeeManagerProcessFeeTest:test_feeIsZeroWith100PercentDiscount() (gas: 51688)
+FeeManagerProcessFeeTest:test_getBaseRewardWithLinkQuote() (gas: 14364)
+FeeManagerProcessFeeTest:test_getLinkFeeIsRoundedUp() (gas: 49472)
+FeeManagerProcessFeeTest:test_getLinkRewardIsSameAsFee() (gas: 54936)
+FeeManagerProcessFeeTest:test_getLinkRewardWithNativeQuoteAndSurchargeWithLinkDiscount() (gas: 82400)
+FeeManagerProcessFeeTest:test_getRewardWithLinkDiscount() (gas: 49297)
+FeeManagerProcessFeeTest:test_getRewardWithLinkQuoteAndLinkDiscount() (gas: 49300)
+FeeManagerProcessFeeTest:test_getRewardWithNativeQuote() (gas: 17305)
+FeeManagerProcessFeeTest:test_getRewardWithNativeQuoteAndSurcharge() (gas: 50487)
FeeManagerProcessFeeTest:test_linkAvailableForPaymentReturnsLinkBalance() (gas: 52419)
-FeeManagerProcessFeeTest:test_nativeSurcharge0Percent() (gas: 30491)
-FeeManagerProcessFeeTest:test_nativeSurcharge100Percent() (gas: 50504)
+FeeManagerProcessFeeTest:test_nativeSurcharge0Percent() (gas: 30497)
+FeeManagerProcessFeeTest:test_nativeSurcharge100Percent() (gas: 50512)
FeeManagerProcessFeeTest:test_nativeSurchargeCannotExceed100Percent() (gas: 17167)
FeeManagerProcessFeeTest:test_nativeSurchargeEventIsEmittedOnUpdate() (gas: 41394)
-FeeManagerProcessFeeTest:test_noFeeIsAppliedWhenReportHasZeroFee() (gas: 51505)
-FeeManagerProcessFeeTest:test_noFeeIsAppliedWhenReportHasZeroFeeAndDiscountAndSurchargeIsSet() (gas: 77733)
+FeeManagerProcessFeeTest:test_noFeeIsAppliedWhenReportHasZeroFee() (gas: 51511)
+FeeManagerProcessFeeTest:test_noFeeIsAppliedWhenReportHasZeroFeeAndDiscountAndSurchargeIsSet() (gas: 77739)
FeeManagerProcessFeeTest:test_nonAdminProxyUserCannotProcessFee() (gas: 21881)
FeeManagerProcessFeeTest:test_nonAdminUserCanNotSetDiscount() (gas: 19835)
-FeeManagerProcessFeeTest:test_payLinkDeficit() (gas: 193856)
+FeeManagerProcessFeeTest:test_payLinkDeficit() (gas: 193861)
FeeManagerProcessFeeTest:test_payLinkDeficitOnlyCallableByAdmin() (gas: 17405)
-FeeManagerProcessFeeTest:test_payLinkDeficitPaysAllFeesProcessed() (gas: 213891)
-FeeManagerProcessFeeTest:test_payLinkDeficitTwice() (gas: 198224)
-FeeManagerProcessFeeTest:test_processFeeAsProxy() (gas: 116430)
+FeeManagerProcessFeeTest:test_payLinkDeficitPaysAllFeesProcessed() (gas: 213908)
+FeeManagerProcessFeeTest:test_payLinkDeficitTwice() (gas: 198228)
+FeeManagerProcessFeeTest:test_processFeeAsProxy() (gas: 116432)
FeeManagerProcessFeeTest:test_processFeeDefaultReportsStillVerifiesWithEmptyQuote() (gas: 27468)
-FeeManagerProcessFeeTest:test_processFeeEmitsEventIfNotEnoughLink() (gas: 161837)
+FeeManagerProcessFeeTest:test_processFeeEmitsEventIfNotEnoughLink() (gas: 161843)
FeeManagerProcessFeeTest:test_processFeeIfSubscriberIsSelf() (gas: 27822)
-FeeManagerProcessFeeTest:test_processFeeNative() (gas: 172458)
-FeeManagerProcessFeeTest:test_processFeeUsesCorrectDigest() (gas: 117390)
+FeeManagerProcessFeeTest:test_processFeeNative() (gas: 172464)
+FeeManagerProcessFeeTest:test_processFeeUsesCorrectDigest() (gas: 117392)
FeeManagerProcessFeeTest:test_processFeeWithDefaultReportPayloadAndQuoteStillVerifies() (gas: 29542)
-FeeManagerProcessFeeTest:test_processFeeWithDiscountEmitsEvent() (gas: 241269)
+FeeManagerProcessFeeTest:test_processFeeWithDiscountEmitsEvent() (gas: 241293)
FeeManagerProcessFeeTest:test_processFeeWithInvalidReportVersionFailsToDecode() (gas: 28517)
-FeeManagerProcessFeeTest:test_processFeeWithNoDiscountDoesNotEmitEvent() (gas: 166400)
-FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNative() (gas: 179992)
-FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddress() (gas: 131459)
-FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddressExcessiveFee() (gas: 155388)
-FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeShortFunds() (gas: 92624)
-FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeWithExcessiveFee() (gas: 186953)
-FeeManagerProcessFeeTest:test_processFeeWithWithCorruptQuotePayload() (gas: 70679)
+FeeManagerProcessFeeTest:test_processFeeWithNoDiscountDoesNotEmitEvent() (gas: 166406)
+FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNative() (gas: 179998)
+FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddress() (gas: 131461)
+FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddressExcessiveFee() (gas: 155390)
+FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeShortFunds() (gas: 92630)
+FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeWithExcessiveFee() (gas: 186961)
+FeeManagerProcessFeeTest:test_processFeeWithWithCorruptQuotePayload() (gas: 70681)
FeeManagerProcessFeeTest:test_processFeeWithWithEmptyQuotePayload() (gas: 27733)
FeeManagerProcessFeeTest:test_processFeeWithWithZeroQuotePayload() (gas: 27783)
-FeeManagerProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithLinkQuote() (gas: 32971)
-FeeManagerProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithNativeQuote() (gas: 152357)
-FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkReturnsChange() (gas: 53468)
-FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithLinkQuote() (gas: 116341)
-FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithNativeQuote() (gas: 35738)
-FeeManagerProcessFeeTest:test_processMultipleLinkReports() (gas: 221457)
-FeeManagerProcessFeeTest:test_processMultipleUnwrappedNativeReports() (gas: 255272)
-FeeManagerProcessFeeTest:test_processMultipleV1Reports() (gas: 74135)
-FeeManagerProcessFeeTest:test_processMultipleWrappedNativeReports() (gas: 238399)
-FeeManagerProcessFeeTest:test_processV1V2V3Reports() (gas: 206219)
-FeeManagerProcessFeeTest:test_processV1V2V3ReportsWithUnwrapped() (gas: 247873)
+FeeManagerProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithLinkQuote() (gas: 32973)
+FeeManagerProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithNativeQuote() (gas: 152363)
+FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkReturnsChange() (gas: 53470)
+FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithLinkQuote() (gas: 116343)
+FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithNativeQuote() (gas: 35744)
+FeeManagerProcessFeeTest:test_processMultipleLinkReports() (gas: 221473)
+FeeManagerProcessFeeTest:test_processMultipleUnwrappedNativeReports() (gas: 255314)
+FeeManagerProcessFeeTest:test_processMultipleV1Reports() (gas: 74137)
+FeeManagerProcessFeeTest:test_processMultipleWrappedNativeReports() (gas: 238439)
+FeeManagerProcessFeeTest:test_processV1V2V3Reports() (gas: 206233)
+FeeManagerProcessFeeTest:test_processV1V2V3ReportsWithUnwrapped() (gas: 247907)
FeeManagerProcessFeeTest:test_reportWithNoExpiryOrFeeReturnsZero() (gas: 10770)
FeeManagerProcessFeeTest:test_setDiscountOver100Percent() (gas: 19548)
FeeManagerProcessFeeTest:test_subscriberDiscountEventIsEmittedOnUpdate() (gas: 46259)
-FeeManagerProcessFeeTest:test_surchargeFeeRoundsUpWhenUneven() (gas: 50856)
-FeeManagerProcessFeeTest:test_surchargeIsApplied() (gas: 50737)
-FeeManagerProcessFeeTest:test_surchargeIsAppliedForNativeFeeWithDiscount() (gas: 78892)
-FeeManagerProcessFeeTest:test_surchargeIsNoLongerAppliedAfterRemoving() (gas: 46503)
-FeeManagerProcessFeeTest:test_surchargeIsNotAppliedForLinkFee() (gas: 49585)
-FeeManagerProcessFeeTest:test_surchargeIsNotAppliedWith100PercentDiscount() (gas: 77890)
+FeeManagerProcessFeeTest:test_surchargeFeeRoundsUpWhenUneven() (gas: 50864)
+FeeManagerProcessFeeTest:test_surchargeIsApplied() (gas: 50745)
+FeeManagerProcessFeeTest:test_surchargeIsAppliedForNativeFeeWithDiscount() (gas: 78900)
+FeeManagerProcessFeeTest:test_surchargeIsNoLongerAppliedAfterRemoving() (gas: 46514)
+FeeManagerProcessFeeTest:test_surchargeIsNotAppliedForLinkFee() (gas: 49587)
+FeeManagerProcessFeeTest:test_surchargeIsNotAppliedWith100PercentDiscount() (gas: 77896)
FeeManagerProcessFeeTest:test_testRevertIfReportHasExpired() (gas: 14908)
RewardManagerClaimTest:test_claimAllRecipients() (gas: 275763)
-RewardManagerClaimTest:test_claimMultipleRecipients() (gas: 153306)
+RewardManagerClaimTest:test_claimMultipleRecipients() (gas: 153308)
RewardManagerClaimTest:test_claimRewardsWithDuplicatePoolIdsDoesNotPayoutTwice() (gas: 328345)
RewardManagerClaimTest:test_claimSingleRecipient() (gas: 88340)
RewardManagerClaimTest:test_claimUnevenAmountRoundsDown() (gas: 313549)
@@ -117,8 +117,8 @@ RewardManagerClaimTest:test_claimUnregisteredPoolId() (gas: 34461)
RewardManagerClaimTest:test_claimUnregisteredRecipient() (gas: 40491)
RewardManagerClaimTest:test_eventIsEmittedUponClaim() (gas: 86069)
RewardManagerClaimTest:test_eventIsNotEmittedUponUnsuccessfulClaim() (gas: 24700)
-RewardManagerClaimTest:test_recipientsClaimMultipleDeposits() (gas: 383214)
-RewardManagerClaimTest:test_singleRecipientClaimMultipleDeposits() (gas: 136289)
+RewardManagerClaimTest:test_recipientsClaimMultipleDeposits() (gas: 383222)
+RewardManagerClaimTest:test_singleRecipientClaimMultipleDeposits() (gas: 136295)
RewardManagerNoRecipientSet:test_claimAllRecipientsAfterRecipientsSet() (gas: 489377)
RewardManagerPayRecipientsTest:test_addFundsToPoolAsNonOwnerOrFeeManager() (gas: 11428)
RewardManagerPayRecipientsTest:test_addFundsToPoolAsOwner() (gas: 53876)
@@ -131,17 +131,17 @@ RewardManagerPayRecipientsTest:test_payRecipientWithInvalidPool() (gas: 28549)
RewardManagerPayRecipientsTest:test_payRecipientsEmptyRecipientList() (gas: 24970)
RewardManagerPayRecipientsTest:test_payRecipientsWithInvalidPoolId() (gas: 31055)
RewardManagerPayRecipientsTest:test_paySingleRecipient() (gas: 84354)
-RewardManagerPayRecipientsTest:test_paySubsetOfRecipientsInPool() (gas: 197449)
-RewardManagerRecipientClaimDifferentWeightsTest:test_allRecipientsClaimingReceiveExpectedAmount() (gas: 279714)
-RewardManagerRecipientClaimMultiplePoolsTest:test_claimAllRecipientsMultiplePools() (gas: 509889)
+RewardManagerPayRecipientsTest:test_paySubsetOfRecipientsInPool() (gas: 197451)
+RewardManagerRecipientClaimDifferentWeightsTest:test_allRecipientsClaimingReceiveExpectedAmount() (gas: 279425)
+RewardManagerRecipientClaimMultiplePoolsTest:test_claimAllRecipientsMultiplePools() (gas: 509891)
RewardManagerRecipientClaimMultiplePoolsTest:test_claimAllRecipientsSinglePool() (gas: 281811)
RewardManagerRecipientClaimMultiplePoolsTest:test_claimEmptyPoolWhenSecondPoolContainsFunds() (gas: 291640)
-RewardManagerRecipientClaimMultiplePoolsTest:test_claimMultipleRecipientsMultiplePools() (gas: 261589)
-RewardManagerRecipientClaimMultiplePoolsTest:test_claimMultipleRecipientsSinglePool() (gas: 153434)
-RewardManagerRecipientClaimMultiplePoolsTest:test_claimSingleRecipientMultiplePools() (gas: 131911)
-RewardManagerRecipientClaimMultiplePoolsTest:test_claimSingleUniqueRecipient() (gas: 105312)
-RewardManagerRecipientClaimMultiplePoolsTest:test_claimUnevenAmountRoundsDown() (gas: 576289)
-RewardManagerRecipientClaimMultiplePoolsTest:test_claimUnregisteredRecipient() (gas: 63555)
+RewardManagerRecipientClaimMultiplePoolsTest:test_claimMultipleRecipientsMultiplePools() (gas: 261591)
+RewardManagerRecipientClaimMultiplePoolsTest:test_claimMultipleRecipientsSinglePool() (gas: 153438)
+RewardManagerRecipientClaimMultiplePoolsTest:test_claimSingleRecipientMultiplePools() (gas: 131915)
+RewardManagerRecipientClaimMultiplePoolsTest:test_claimSingleUniqueRecipient() (gas: 105314)
+RewardManagerRecipientClaimMultiplePoolsTest:test_claimUnevenAmountRoundsDown() (gas: 576291)
+RewardManagerRecipientClaimMultiplePoolsTest:test_claimUnregisteredRecipient() (gas: 63557)
RewardManagerRecipientClaimMultiplePoolsTest:test_getAvailableRewardsCursorAndTotalPoolsEqual() (gas: 10202)
RewardManagerRecipientClaimMultiplePoolsTest:test_getAvailableRewardsCursorCannotBeGreaterThanTotalPools() (gas: 12680)
RewardManagerRecipientClaimMultiplePoolsTest:test_getAvailableRewardsCursorSingleResult() (gas: 19606)
@@ -149,35 +149,43 @@ RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipient
RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInBothPoolsWhereAlreadyClaimed() (gas: 147218)
RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInNoPools() (gas: 18532)
RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInSinglePool() (gas: 24569)
-RewardManagerRecipientClaimMultiplePoolsTest:test_recipientsClaimMultipleDeposits() (gas: 387664)
-RewardManagerRecipientClaimMultiplePoolsTest:test_singleRecipientClaimMultipleDeposits() (gas: 136328)
-RewardManagerRecipientClaimUnevenWeightTest:test_allRecipientsClaimingReceiveExpectedAmount() (gas: 198450)
-RewardManagerRecipientClaimUnevenWeightTest:test_allRecipientsClaimingReceiveExpectedAmountWithSmallDeposit() (gas: 218320)
+RewardManagerRecipientClaimMultiplePoolsTest:test_recipientsClaimMultipleDeposits() (gas: 387672)
+RewardManagerRecipientClaimMultiplePoolsTest:test_singleRecipientClaimMultipleDeposits() (gas: 136332)
+RewardManagerRecipientClaimUnevenWeightTest:test_allRecipientsClaimingReceiveExpectedAmount() (gas: 198399)
+RewardManagerRecipientClaimUnevenWeightTest:test_allRecipientsClaimingReceiveExpectedAmountWithSmallDeposit() (gas: 218269)
RewardManagerSetRecipientsTest:test_eventIsEmittedUponSetRecipients() (gas: 191729)
-RewardManagerSetRecipientsTest:test_setRecipientContainsDuplicateRecipients() (gas: 126058)
+RewardManagerSetRecipientsTest:test_setRecipientContainsDuplicateRecipients() (gas: 126082)
RewardManagerSetRecipientsTest:test_setRewardRecipientFromManagerAddress() (gas: 193880)
RewardManagerSetRecipientsTest:test_setRewardRecipientFromNonOwnerOrFeeManagerAddress() (gas: 21452)
RewardManagerSetRecipientsTest:test_setRewardRecipientTwice() (gas: 193324)
RewardManagerSetRecipientsTest:test_setRewardRecipientWeights() (gas: 180630)
RewardManagerSetRecipientsTest:test_setRewardRecipientWithZeroAddress() (gas: 90224)
-RewardManagerSetRecipientsTest:test_setRewardRecipients() (gas: 185567)
+RewardManagerSetRecipientsTest:test_setRewardRecipientWithZeroWeight() (gas: 191334)
+RewardManagerSetRecipientsTest:test_setRewardRecipients() (gas: 185589)
RewardManagerSetRecipientsTest:test_setRewardRecipientsIsEmpty() (gas: 87113)
-RewardManagerSetRecipientsTest:test_setSingleRewardRecipient() (gas: 110414)
+RewardManagerSetRecipientsTest:test_setSingleRewardRecipient() (gas: 110371)
RewardManagerSetupTest:test_eventEmittedUponFeeManagerUpdate() (gas: 21388)
RewardManagerSetupTest:test_eventEmittedUponFeePaid() (gas: 259121)
RewardManagerSetupTest:test_rejectsZeroLinkAddressOnConstruction() (gas: 59411)
RewardManagerSetupTest:test_setFeeManagerZeroAddress() (gas: 17038)
-RewardManagerUpdateRewardRecipientsMultiplePoolsTest:test_updatePrimaryRecipientWeights() (gas: 373535)
-RewardManagerUpdateRewardRecipientsTest:test_eventIsEmittedUponUpdateRecipients() (gas: 279096)
-RewardManagerUpdateRewardRecipientsTest:test_onlyAdminCanUpdateRecipients() (gas: 19704)
-RewardManagerUpdateRewardRecipientsTest:test_partialUpdateRecipientWeights() (gas: 218880)
+RewardManagerUpdateRewardRecipientsMultiplePoolsTest:test_updatePrimaryRecipientWeights() (gas: 373525)
+RewardManagerUpdateRewardRecipientsTest:test_eventIsEmittedUponUpdateRecipients() (gas: 279119)
+RewardManagerUpdateRewardRecipientsTest:test_onlyAdminCanUpdateRecipients() (gas: 19749)
+RewardManagerUpdateRewardRecipientsTest:test_partialUpdateRecipientWeights() (gas: 218898)
RewardManagerUpdateRewardRecipientsTest:test_updateAllRecipientsWithSameAddressAndWeight() (gas: 272941)
-RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithExcessiveWeight() (gas: 259196)
-RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithSameAddressAndWeight() (gas: 148912)
-RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithUnderWeightSet() (gas: 259270)
-RewardManagerUpdateRewardRecipientsTest:test_updateRecipientWeights() (gas: 368972)
-RewardManagerUpdateRewardRecipientsTest:test_updateRecipientWithNewZeroAddress() (gas: 270802)
-RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsContainsDuplicateRecipients() (gas: 288572)
+RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsToSubset() (gas: 254232)
+RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithExcessiveWeight() (gas: 259219)
+RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithSameAddressAndWeight() (gas: 148890)
+RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithUnderWeightSet() (gas: 259293)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientWeights() (gas: 369006)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientWithNewZeroAddress() (gas: 270780)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsContainsDuplicateRecipients() (gas: 288575)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsToDifferentLargerSet() (gas: 407876)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsToDifferentPartialSet() (gas: 318029)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsToDifferentSet() (gas: 377784)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsToDifferentSetWithInvalidWeights() (gas: 312122)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsUpdateAndRemoveExistingForLargerSet() (gas: 399699)
+RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsUpdateAndRemoveExistingForSmallerSet() (gas: 289513)
VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyRemovesAMiddleDigest() (gas: 24177)
VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyRemovesTheFirstDigest() (gas: 24144)
VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyUnsetsDigestsInSequence() (gas: 44109)
@@ -192,14 +200,14 @@ VerifierActivateFeedTest:test_revertsIfNoFeedExistsActivate() (gas: 13179)
VerifierActivateFeedTest:test_revertsIfNoFeedExistsDeactivate() (gas: 13157)
VerifierActivateFeedTest:test_revertsIfNotOwnerActivateFeed() (gas: 17098)
VerifierActivateFeedTest:test_revertsIfNotOwnerDeactivateFeed() (gas: 17153)
-VerifierBulkVerifyBillingReport:test_verifyMultiVersions() (gas: 475575)
-VerifierBulkVerifyBillingReport:test_verifyMultiVersionsReturnsVerifiedReports() (gas: 681851)
-VerifierBulkVerifyBillingReport:test_verifyWithBulkLink() (gas: 556847)
-VerifierBulkVerifyBillingReport:test_verifyWithBulkNative() (gas: 560426)
-VerifierBulkVerifyBillingReport:test_verifyWithBulkNativeUnwrapped() (gas: 567917)
-VerifierBulkVerifyBillingReport:test_verifyWithBulkNativeUnwrappedReturnsChange() (gas: 574921)
-VerifierConstructorTest:test_revertsIfInitializedWithEmptyVerifierProxy() (gas: 59967)
-VerifierConstructorTest:test_setsTheCorrectProperties() (gas: 1815769)
+VerifierBulkVerifyBillingReport:test_verifyMultiVersions() (gas: 475585)
+VerifierBulkVerifyBillingReport:test_verifyMultiVersionsReturnsVerifiedReports() (gas: 681857)
+VerifierBulkVerifyBillingReport:test_verifyWithBulkLink() (gas: 556863)
+VerifierBulkVerifyBillingReport:test_verifyWithBulkNative() (gas: 560460)
+VerifierBulkVerifyBillingReport:test_verifyWithBulkNativeUnwrapped() (gas: 567951)
+VerifierBulkVerifyBillingReport:test_verifyWithBulkNativeUnwrappedReturnsChange() (gas: 574957)
+VerifierConstructorTest:test_revertsIfInitializedWithEmptyVerifierProxy() (gas: 59960)
+VerifierConstructorTest:test_setsTheCorrectProperties() (gas: 1808155)
VerifierDeactivateFeedWithVerifyTest:test_currentReportAllowsVerification() (gas: 192062)
VerifierDeactivateFeedWithVerifyTest:test_currentReportFailsVerification() (gas: 113377)
VerifierDeactivateFeedWithVerifyTest:test_previousReportAllowsVerification() (gas: 99613)
@@ -228,26 +236,26 @@ VerifierProxyUnsetVerifierWithPreviouslySetVerifierTest:test_correctlyUnsetsVeri
VerifierProxyUnsetVerifierWithPreviouslySetVerifierTest:test_emitsAnEventAfterUnsettingVerifier() (gas: 17965)
VerifierProxyVerifyTest:test_proxiesToTheCorrectVerifier() (gas: 201609)
VerifierProxyVerifyTest:test_revertsIfNoVerifierConfigured() (gas: 117256)
-VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlySetsConfigWhenDigestsAreRemoved() (gas: 538896)
-VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlyUpdatesDigestsOnMultipleVerifiersInTheProxy() (gas: 964726)
-VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlyUpdatesTheDigestInTheProxy() (gas: 520480)
-VerifierSetConfigFromSourceTest:test_revertsIfCalledByNonOwner() (gas: 183215)
-VerifierSetConfigTest:test_correctlyUpdatesTheConfig() (gas: 1057923)
-VerifierSetConfigTest:test_revertsIfCalledByNonOwner() (gas: 182984)
-VerifierSetConfigTest:test_revertsIfDuplicateSigners() (gas: 251559)
+VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlySetsConfigWhenDigestsAreRemoved() (gas: 538898)
+VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlyUpdatesDigestsOnMultipleVerifiersInTheProxy() (gas: 964730)
+VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlyUpdatesTheDigestInTheProxy() (gas: 520482)
+VerifierSetConfigFromSourceTest:test_revertsIfCalledByNonOwner() (gas: 183217)
+VerifierSetConfigTest:test_correctlyUpdatesTheConfig() (gas: 1057925)
+VerifierSetConfigTest:test_revertsIfCalledByNonOwner() (gas: 182986)
+VerifierSetConfigTest:test_revertsIfDuplicateSigners() (gas: 251561)
VerifierSetConfigTest:test_revertsIfFaultToleranceIsZero() (gas: 176543)
-VerifierSetConfigTest:test_revertsIfNotEnoughSigners() (gas: 15835)
+VerifierSetConfigTest:test_revertsIfNotEnoughSigners() (gas: 15828)
VerifierSetConfigTest:test_revertsIfSetWithTooManySigners() (gas: 22213)
-VerifierSetConfigTest:test_revertsIfSignerContainsZeroAddress() (gas: 228032)
-VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlySetsConfigWhenDigestsAreRemoved() (gas: 538645)
-VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlyUpdatesDigestsOnMultipleVerifiersInTheProxy() (gas: 964215)
-VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlyUpdatesTheDigestInTheProxy() (gas: 520220)
+VerifierSetConfigTest:test_revertsIfSignerContainsZeroAddress() (gas: 228034)
+VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlySetsConfigWhenDigestsAreRemoved() (gas: 538647)
+VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlyUpdatesDigestsOnMultipleVerifiersInTheProxy() (gas: 964219)
+VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlyUpdatesTheDigestInTheProxy() (gas: 520222)
VerifierSupportsInterfaceTest:test_falseIfIsNotCorrectInterface() (gas: 5590)
VerifierSupportsInterfaceTest:test_trueIfIsCorrectInterface() (gas: 5633)
-VerifierTestBillingReport:test_verifyWithLink() (gas: 274946)
-VerifierTestBillingReport:test_verifyWithNative() (gas: 315644)
-VerifierTestBillingReport:test_verifyWithNativeUnwrapped() (gas: 317892)
-VerifierTestBillingReport:test_verifyWithNativeUnwrappedReturnsChange() (gas: 324958)
+VerifierTestBillingReport:test_verifyWithLink() (gas: 274948)
+VerifierTestBillingReport:test_verifyWithNative() (gas: 315650)
+VerifierTestBillingReport:test_verifyWithNativeUnwrapped() (gas: 317898)
+VerifierTestBillingReport:test_verifyWithNativeUnwrappedReturnsChange() (gas: 324966)
VerifierVerifyMultipleConfigDigestTest:test_canVerifyNewerReportsWithNewerConfigs() (gas: 131228)
VerifierVerifyMultipleConfigDigestTest:test_canVerifyOlderReportsWithOlderConfigs() (gas: 187132)
VerifierVerifyMultipleConfigDigestTest:test_revertsIfAReportIsVerifiedWithAnExistingButIncorrectDigest() (gas: 88205)
@@ -263,10 +271,10 @@ VerifierVerifySingleConfigDigestTest:test_revertsIfVerifiedWithIncorrectAddresse
VerifierVerifySingleConfigDigestTest:test_revertsIfWrongNumberOfSigners() (gas: 110031)
VerifierVerifySingleConfigDigestTest:test_setsTheCorrectEpoch() (gas: 194270)
Verifier_accessControlledVerify:testVerifyWithAccessControl_gas() (gas: 212066)
-Verifier_bulkVerifyWithFee:testBulkVerifyProxyWithLinkFeeSuccess_gas() (gas: 519368)
-Verifier_bulkVerifyWithFee:testBulkVerifyProxyWithNativeFeeSuccess_gas() (gas: 542767)
-Verifier_setConfig:testSetConfigSuccess_gas() (gas: 922682)
+Verifier_bulkVerifyWithFee:testBulkVerifyProxyWithLinkFeeSuccess_gas() (gas: 519378)
+Verifier_bulkVerifyWithFee:testBulkVerifyProxyWithNativeFeeSuccess_gas() (gas: 542797)
+Verifier_setConfig:testSetConfigSuccess_gas() (gas: 922684)
Verifier_verify:testVerifyProxySuccess_gas() (gas: 198731)
Verifier_verify:testVerifySuccess_gas() (gas: 186725)
-Verifier_verifyWithFee:testVerifyProxyWithLinkFeeSuccess_gas() (gas: 238886)
-Verifier_verifyWithFee:testVerifyProxyWithNativeFeeSuccess_gas() (gas: 257382)
\ No newline at end of file
+Verifier_verifyWithFee:testVerifyProxyWithLinkFeeSuccess_gas() (gas: 238888)
+Verifier_verifyWithFee:testVerifyProxyWithNativeFeeSuccess_gas() (gas: 257388)
\ No newline at end of file
diff --git a/contracts/package.json b/contracts/package.json
index 5d4b6324eee..654ec1d8958 100644
--- a/contracts/package.json
+++ b/contracts/package.json
@@ -18,7 +18,7 @@
"prepublishOnly": "pnpm compile && ./scripts/prepublish_generate_abi_folder",
"publish-beta": "pnpm publish --tag beta",
"publish-prod": "npm dist-tag add @chainlink/contracts@0.8.0 latest",
- "solhint": "solhint --max-warnings 33 \"./src/v0.8/**/*.sol\""
+ "solhint": "solhint --max-warnings 20 \"./src/v0.8/**/*.sol\""
},
"files": [
"src/v0.8",
@@ -51,17 +51,17 @@
"@types/debug": "^4.1.12",
"@types/deep-equal-in-any-order": "^1.0.3",
"@types/mocha": "^10.0.6",
- "@types/node": "^16.18.68",
- "@typescript-eslint/eslint-plugin": "^6.14.0",
- "@typescript-eslint/parser": "^6.14.0",
+ "@types/node": "^16.18.80",
+ "@typescript-eslint/eslint-plugin": "^6.21.0",
+ "@typescript-eslint/parser": "^6.21.0",
"abi-to-sol": "^0.6.6",
"cbor": "^5.2.0",
"chai": "^4.3.10",
"debug": "^4.3.4",
- "eslint": "^8.55.0",
+ "eslint": "^8.56.0",
"eslint-config-prettier": "^9.1.0",
"deep-equal-in-any-order": "^2.0.6",
- "eslint-plugin-prettier": "^5.0.1",
+ "eslint-plugin-prettier": "^5.1.3",
"ethereum-waffle": "^3.4.4",
"ethers": "~5.7.2",
"hardhat": "~2.19.2",
@@ -71,11 +71,11 @@
"hardhat-ignore-warnings": "^0.2.6",
"istanbul": "^0.4.5",
"moment": "^2.29.4",
- "prettier": "^3.1.1",
- "prettier-plugin-solidity": "1.2.0",
+ "prettier": "^3.2.5",
+ "prettier-plugin-solidity": "1.3.1",
"rlp": "^2.2.7",
- "solhint": "^4.0.0",
- "solhint-plugin-chainlink-solidity": "git+https://github.com/smartcontractkit/chainlink-solhint-rules.git#v1.2.0",
+ "solhint": "^4.1.1",
+ "solhint-plugin-chainlink-solidity": "git+https://github.com/smartcontractkit/chainlink-solhint-rules.git#v1.2.1",
"solhint-plugin-prettier": "^0.1.0",
"solidity-coverage": "^0.8.5",
"ts-node": "^10.9.2",
diff --git a/contracts/pnpm-lock.yaml b/contracts/pnpm-lock.yaml
index 1b18835dc2e..e272d62ab4a 100644
--- a/contracts/pnpm-lock.yaml
+++ b/contracts/pnpm-lock.yaml
@@ -42,19 +42,19 @@ devDependencies:
version: 5.7.0
'@nomicfoundation/hardhat-network-helpers':
specifier: ^1.0.9
- version: 1.0.9(hardhat@2.19.2)
+ version: 1.0.10(hardhat@2.19.2)
'@nomiclabs/hardhat-ethers':
specifier: ^2.2.3
version: 2.2.3(ethers@5.7.2)(hardhat@2.19.2)
'@nomiclabs/hardhat-etherscan':
specifier: ^3.1.7
- version: 3.1.7(hardhat@2.19.2)
+ version: 3.1.8(hardhat@2.19.2)
'@nomiclabs/hardhat-waffle':
specifier: 2.0.6
version: 2.0.6(@nomiclabs/hardhat-ethers@2.2.3)(@types/sinon-chai@3.2.8)(ethereum-waffle@3.4.4)(ethers@5.7.2)(hardhat@2.19.2)
'@openzeppelin/hardhat-upgrades':
specifier: 1.28.0
- version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.19.2)
+ version: 1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.8)(ethers@5.7.2)(hardhat@2.19.2)
'@openzeppelin/test-helpers':
specifier: ^0.5.16
version: 0.5.16(bn.js@4.12.0)
@@ -80,14 +80,14 @@ devDependencies:
specifier: ^10.0.6
version: 10.0.6
'@types/node':
- specifier: ^16.18.68
- version: 16.18.68
+ specifier: ^16.18.80
+ version: 16.18.80
'@typescript-eslint/eslint-plugin':
- specifier: ^6.14.0
- version: 6.14.0(@typescript-eslint/parser@6.14.0)(eslint@8.55.0)(typescript@5.3.3)
+ specifier: ^6.21.0
+ version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3)
'@typescript-eslint/parser':
- specifier: ^6.14.0
- version: 6.14.0(eslint@8.55.0)(typescript@5.3.3)
+ specifier: ^6.21.0
+ version: 6.21.0(eslint@8.56.0)(typescript@5.3.3)
abi-to-sol:
specifier: ^0.6.6
version: 0.6.6
@@ -104,14 +104,14 @@ devDependencies:
specifier: ^2.0.6
version: 2.0.6
eslint:
- specifier: ^8.55.0
- version: 8.55.0
+ specifier: ^8.56.0
+ version: 8.56.0
eslint-config-prettier:
specifier: ^9.1.0
- version: 9.1.0(eslint@8.55.0)
+ version: 9.1.0(eslint@8.56.0)
eslint-plugin-prettier:
- specifier: ^5.0.1
- version: 5.0.1(eslint-config-prettier@9.1.0)(eslint@8.55.0)(prettier@3.1.1)
+ specifier: ^5.1.3
+ version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5)
ethereum-waffle:
specifier: ^3.4.4
version: 3.4.4(typescript@5.3.3)
@@ -129,7 +129,7 @@ devDependencies:
version: 2.10.0(hardhat@2.19.2)
hardhat-gas-reporter:
specifier: ^1.0.9
- version: 1.0.9(debug@4.3.4)(hardhat@2.19.2)
+ version: 1.0.9(hardhat@2.19.2)
hardhat-ignore-warnings:
specifier: ^0.2.6
version: 0.2.9
@@ -140,29 +140,29 @@ devDependencies:
specifier: ^2.29.4
version: 2.29.4
prettier:
- specifier: ^3.1.1
- version: 3.1.1
+ specifier: ^3.2.5
+ version: 3.2.5
prettier-plugin-solidity:
- specifier: 1.2.0
- version: 1.2.0(prettier@3.1.1)
+ specifier: 1.3.1
+ version: 1.3.1(prettier@3.2.5)
rlp:
specifier: ^2.2.7
version: 2.2.7
solhint:
- specifier: ^4.0.0
- version: 4.0.0
+ specifier: ^4.1.1
+ version: 4.1.1
solhint-plugin-chainlink-solidity:
- specifier: git+https://github.com/smartcontractkit/chainlink-solhint-rules.git#v1.2.0
- version: github.com/smartcontractkit/chainlink-solhint-rules/cfc50b32f95b730304a50deb2e27e88d87115874
+ specifier: git+https://github.com/smartcontractkit/chainlink-solhint-rules.git#v1.2.1
+ version: github.com/smartcontractkit/chainlink-solhint-rules/1b4c0c2663fcd983589d4f33a2e73908624ed43c
solhint-plugin-prettier:
specifier: ^0.1.0
- version: 0.1.0(prettier-plugin-solidity@1.2.0)(prettier@3.1.1)
+ version: 0.1.0(prettier-plugin-solidity@1.3.1)(prettier@3.2.5)
solidity-coverage:
specifier: ^0.8.5
version: 0.8.5(hardhat@2.19.2)
ts-node:
specifier: ^10.9.2
- version: 10.9.2(@types/node@16.18.68)(typescript@5.3.3)
+ version: 10.9.2(@types/node@16.18.80)(typescript@5.3.3)
tslib:
specifier: ^2.6.2
version: 2.6.2
@@ -184,23 +184,23 @@ packages:
resolution: {integrity: sha512-Nr1QJIbW/afYYGzYvrF70LtaHrIRtd4TNAglX8BvlfxJLZ45SAmueIKYl5tWoNBPzp65ymXGFK0Bb1vZUpuc9g==}
dependencies:
'@aws-crypto/util': 1.2.2
- '@aws-sdk/types': 3.428.0
+ '@aws-sdk/types': 3.468.0
tslib: 1.14.1
dev: true
/@aws-crypto/util@1.2.2:
resolution: {integrity: sha512-H8PjG5WJ4wz0UXAFXeJjWCW1vkvIJ3qUUD+rGRwJ2/hj+xT58Qle2MTql/2MGzkU+1JLAFuR6aJpLAjHwhmwwg==}
dependencies:
- '@aws-sdk/types': 3.428.0
+ '@aws-sdk/types': 3.468.0
'@aws-sdk/util-utf8-browser': 3.259.0
tslib: 1.14.1
dev: true
- /@aws-sdk/types@3.428.0:
- resolution: {integrity: sha512-4T0Ps2spjg3qbWE6ZK13Vd3FnzpfliaiotqjxUK5YhjDrKXeT36HJp46JhDupElQuHtTkpdiJOSYk2lvY2H4IA==}
+ /@aws-sdk/types@3.468.0:
+ resolution: {integrity: sha512-rx/9uHI4inRbp2tw3Y4Ih4PNZkVj32h7WneSg3MVgVjAoVD5Zti9KhS5hkvsBxfgmQmg0AQbE+b1sy5WGAgntA==}
engines: {node: '>=14.0.0'}
dependencies:
- '@smithy/types': 2.3.5
+ '@smithy/types': 2.7.0
tslib: 2.6.2
dev: true
@@ -327,18 +327,18 @@ packages:
deprecated: Please use @ensdomains/ens-contracts
dev: true
- /@eslint-community/eslint-utils@4.4.0(eslint@8.55.0):
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0):
resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
dependencies:
- eslint: 8.55.0
+ eslint: 8.56.0
eslint-visitor-keys: 3.4.3
dev: true
- /@eslint-community/regexpp@4.8.0:
- resolution: {integrity: sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==}
+ /@eslint-community/regexpp@4.9.1:
+ resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
dev: true
@@ -359,8 +359,8 @@ packages:
- supports-color
dev: true
- /@eslint/js@8.55.0:
- resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==}
+ /@eslint/js@8.56.0:
+ resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
@@ -468,7 +468,7 @@ packages:
'@ethereum-waffle/ens': 3.4.4
ethers: 5.7.2
ganache-core: 2.13.2
- patch-package: 6.5.1
+ patch-package: 6.4.7
postinstall-postinstall: 2.1.0
transitivePeerDependencies:
- bufferutil
@@ -828,20 +828,6 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
- /@ljharb/resumer@0.0.1:
- resolution: {integrity: sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==}
- engines: {node: '>= 0.4'}
- dependencies:
- '@ljharb/through': 2.3.11
- dev: true
-
- /@ljharb/through@2.3.11:
- resolution: {integrity: sha512-ccfcIDlogiXNq5KcbAwbaO7lMh3Tm1i3khMPYpxlK8hH/W53zN81KM9coerRLOnTGu3nfXIniAmQbRI9OxbC0w==}
- engines: {node: '>= 0.4'}
- dependencies:
- call-bind: 1.0.2
- dev: true
-
/@metamask/eth-sig-util@4.0.1:
resolution: {integrity: sha512-tghyZKLHZjcdlDqCA3gNZmLeR0XvOE9U1qoQO9ohyAZT6Pya+H9vkBPcsyXytmYLNgVoin7CKCmweo/R43V+tQ==}
engines: {node: '>=12.0.0'}
@@ -1040,8 +1026,8 @@ packages:
- utf-8-validate
dev: true
- /@nomicfoundation/hardhat-network-helpers@1.0.9(hardhat@2.19.2):
- resolution: {integrity: sha512-OXWCv0cHpwLUO2u7bFxBna6dQtCC2Gg/aN/KtJLO7gmuuA28vgmVKYFRCDUqrbjujzgfwQ2aKyZ9Y3vSmDqS7Q==}
+ /@nomicfoundation/hardhat-network-helpers@1.0.10(hardhat@2.19.2):
+ resolution: {integrity: sha512-R35/BMBlx7tWN5V6d/8/19QCwEmIdbnA4ZrsuXgvs8i2qFx5i7h6mH5pBS4Pwi4WigLH+upl6faYusrNPuzMrQ==}
peerDependencies:
hardhat: ^2.9.5
dependencies:
@@ -1165,8 +1151,9 @@ packages:
hardhat: 2.19.2(ts-node@10.9.2)(typescript@5.3.3)
dev: true
- /@nomiclabs/hardhat-etherscan@3.1.7(hardhat@2.19.2):
- resolution: {integrity: sha512-tZ3TvSgpvsQ6B6OGmo1/Au6u8BrAkvs1mIC/eURA3xgIfznUZBhmpne8hv7BXUzw9xNL3fXdpOYgOQlVMTcoHQ==}
+ /@nomiclabs/hardhat-etherscan@3.1.8(hardhat@2.19.2):
+ resolution: {integrity: sha512-v5F6IzQhrsjHh6kQz4uNrym49brK9K5bYCq2zQZ729RYRaifI9hHbtmK+KkIVevfhut7huQFEQ77JLRMAzWYjQ==}
+ deprecated: The @nomiclabs/hardhat-etherscan package is deprecated, please use @nomicfoundation/hardhat-verify instead
peerDependencies:
hardhat: ^2.0.4
dependencies:
@@ -1216,12 +1203,12 @@ packages:
resolution: {integrity: sha512-He3LieZ1pP2TNt5JbkPA4PNT9WC3gOTOlDcFGJW4Le4QKqwmiNJCRt44APfxMxvq7OugU/cqYuPcSBzOw38DAg==}
dev: false
- /@openzeppelin/defender-base-client@1.49.0(debug@4.3.4):
- resolution: {integrity: sha512-nG2jslaAUbo2ZW9yBStstxTPscAchN/vRdJ16M34whuZRtUp1bccCBVLdv3oiPOdjwFaa1OBXJkheN+eF8alzA==}
+ /@openzeppelin/defender-base-client@1.52.0(debug@4.3.4):
+ resolution: {integrity: sha512-VFNu/pjVpAnFKIfuKT1cn9dRpbcO8FO8EAmVZ2XrrAsKXEWDZ3TNBtACxmj7fAu0ad/TzRkb66o5rMts7Fv7jw==}
dependencies:
- amazon-cognito-identity-js: 6.3.6
+ amazon-cognito-identity-js: 6.3.7
async-retry: 1.3.3
- axios: 1.5.1(debug@4.3.4)
+ axios: 1.6.2(debug@4.3.4)
lodash: 4.17.21
node-fetch: 2.6.7
transitivePeerDependencies:
@@ -1229,7 +1216,7 @@ packages:
- encoding
dev: true
- /@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.7)(ethers@5.7.2)(hardhat@2.19.2):
+ /@openzeppelin/hardhat-upgrades@1.28.0(@nomiclabs/hardhat-ethers@2.2.3)(@nomiclabs/hardhat-etherscan@3.1.8)(ethers@5.7.2)(hardhat@2.19.2):
resolution: {integrity: sha512-7sb/Jf+X+uIufOBnmHR0FJVWuxEs2lpxjJnLNN6eCJCP8nD0v+Ot5lTOW2Qb/GFnh+fLvJtEkhkowz4ZQ57+zQ==}
hasBin: true
peerDependencies:
@@ -1243,10 +1230,10 @@ packages:
optional: true
dependencies:
'@nomiclabs/hardhat-ethers': 2.2.3(ethers@5.7.2)(hardhat@2.19.2)
- '@nomiclabs/hardhat-etherscan': 3.1.7(hardhat@2.19.2)
- '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4)
+ '@nomiclabs/hardhat-etherscan': 3.1.8(hardhat@2.19.2)
+ '@openzeppelin/defender-base-client': 1.52.0(debug@4.3.4)
'@openzeppelin/platform-deploy-client': 0.8.0(debug@4.3.4)
- '@openzeppelin/upgrades-core': 1.30.1
+ '@openzeppelin/upgrades-core': 1.31.3
chalk: 4.1.2
debug: 4.3.4(supports-color@8.1.1)
ethers: 5.7.2
@@ -1262,7 +1249,7 @@ packages:
deprecated: '@openzeppelin/platform-deploy-client is deprecated. Please use @openzeppelin/defender-sdk-deploy-client'
dependencies:
'@ethersproject/abi': 5.7.0
- '@openzeppelin/defender-base-client': 1.49.0(debug@4.3.4)
+ '@openzeppelin/defender-base-client': 1.52.0(debug@4.3.4)
axios: 0.21.4(debug@4.3.4)
lodash: 4.17.21
node-fetch: 2.6.7
@@ -1292,8 +1279,8 @@ packages:
- utf-8-validate
dev: true
- /@openzeppelin/upgrades-core@1.30.1:
- resolution: {integrity: sha512-mFUsZibpiWJv1DR2K89cjbFIseTc2CUV4D2kvPPK5xYke6m7+M87qcr/Xk24mMrdCmG7RWNxQohhVnzESI6Eeg==}
+ /@openzeppelin/upgrades-core@1.31.3:
+ resolution: {integrity: sha512-i7q0IuItKS4uO0clJwm4CARmt98aA9dLfKh38HFRbX+aFLGXwF0sOvB2iwr6f87ShH7d3DNuLrVgnnXUrYb7CA==}
hasBin: true
dependencies:
cbor: 9.0.1
@@ -1303,21 +1290,14 @@ packages:
ethereumjs-util: 7.1.5
minimist: 1.2.8
proper-lockfile: 4.1.2
- solidity-ast: 0.4.52
+ solidity-ast: 0.4.55
transitivePeerDependencies:
- supports-color
dev: true
- /@pkgr/utils@2.4.2:
- resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==}
+ /@pkgr/core@0.1.1:
+ resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
- dependencies:
- cross-spawn: 7.0.3
- fast-glob: 3.3.1
- is-glob: 4.0.3
- open: 9.1.0
- picocolors: 1.0.0
- tslib: 2.6.2
dev: true
/@pnpm/config.env-replace@1.1.0:
@@ -1341,12 +1321,12 @@ packages:
config-chain: 1.1.13
dev: true
- /@prettier/sync@0.3.0(prettier@3.1.1):
+ /@prettier/sync@0.3.0(prettier@3.2.5):
resolution: {integrity: sha512-3dcmCyAxIcxy036h1I7MQU/uEEBq8oLwf1CE3xeze+MPlgkdlb/+w6rGR/1dhp6Hqi17fRS6nvwnOzkESxEkOw==}
peerDependencies:
prettier: ^3.0.0
dependencies:
- prettier: 3.1.1
+ prettier: 3.2.5
dev: true
/@resolver-engine/core@0.3.3:
@@ -1486,7 +1466,6 @@ packages:
/@sindresorhus/is@0.14.0:
resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
engines: {node: '>=6'}
- requiresBuild: true
dev: true
/@sindresorhus/is@4.6.0:
@@ -1494,8 +1473,8 @@ packages:
engines: {node: '>=10'}
dev: true
- /@smithy/types@2.3.5:
- resolution: {integrity: sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==}
+ /@smithy/types@2.7.0:
+ resolution: {integrity: sha512-1OIFyhK+vOkMbu4aN2HZz/MomREkrAC/HqY5mlJMUJfGrPRwijJDTeiN8Rnj9zUaB8ogXAfIOtZrrgqZ4w7Wnw==}
engines: {node: '>=14.0.0'}
dependencies:
tslib: 2.6.2
@@ -1519,10 +1498,13 @@ packages:
antlr4ts: 0.5.0-alpha.4
dev: true
+ /@solidity-parser/parser@0.17.0:
+ resolution: {integrity: sha512-Nko8R0/kUo391jsEHHxrGM07QFdnPGvlmox4rmH0kNiNAashItAilhy4Mv4pK5gQmW5f4sXAF58fwJbmlkGcVw==}
+ dev: true
+
/@szmarczak/http-timer@1.1.2:
resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
engines: {node: '>=6'}
- requiresBuild: true
dependencies:
defer-to-connect: 1.1.1
dev: true
@@ -1712,13 +1694,13 @@ packages:
/@types/bn.js@4.11.6:
resolution: {integrity: sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/bn.js@5.1.1:
resolution: {integrity: sha512-qNrYbZqMx0uJAfKnKclPh+dTwK33KfLHYqtyODwd5HnXOjnkhc4qgn3BrK6RWyGZm5+sIFE7Q7Vz6QQtJB7w7g==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/cacheable-request@6.0.2:
@@ -1726,14 +1708,14 @@ packages:
dependencies:
'@types/http-cache-semantics': 4.0.1
'@types/keyv': 3.1.4
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
'@types/responselike': 1.0.0
dev: true
/@types/cbor@5.0.1:
resolution: {integrity: sha512-zVqJy2KzusZPLOgyGJDnOIbu3DxIGGqxYbEwtEEe4Z+la8jwIhOyb+GMrlHafs5tvKruwf8f8qOYP6zTvse/pw==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/chai@4.3.11:
@@ -1743,7 +1725,7 @@ packages:
/@types/concat-stream@1.6.1:
resolution: {integrity: sha512-eHE4cQPoj6ngxBZMvVf6Hw7Mh4jMW4U9lpGmS5GBPB9RYxlFg+CHaVN7ErNY4W9XfLIEn20b4VDYaIrbq0q4uA==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/debug@4.1.12:
@@ -1763,7 +1745,7 @@ packages:
/@types/form-data@0.0.33:
resolution: {integrity: sha512-8BSvG1kGm83cyJITQMZSulnl6QV8jqAGreJsc5tPu1Jq0vTSOiY/k24Wx82JRpWwZSqrala6sd5rWi6aNXvqcw==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/glob@7.1.1:
@@ -1771,21 +1753,21 @@ packages:
dependencies:
'@types/events': 3.0.0
'@types/minimatch': 3.0.3
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/http-cache-semantics@4.0.1:
resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==}
dev: true
- /@types/json-schema@7.0.12:
- resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==}
+ /@types/json-schema@7.0.13:
+ resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==}
dev: true
/@types/keyv@3.1.4:
resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/lru-cache@5.1.1:
@@ -1799,7 +1781,7 @@ packages:
/@types/mkdirp@0.5.2:
resolution: {integrity: sha512-U5icWpv7YnZYGsN4/cmh3WD2onMY0aJIiTE6+51TwJCttdHvtCYmkBNOobHlXwrJRL0nkH9jH4kD+1FAdMN4Tg==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/mocha@10.0.6:
@@ -1813,7 +1795,7 @@ packages:
/@types/node-fetch@2.6.2:
resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
form-data: 3.0.1
dev: true
@@ -1825,8 +1807,8 @@ packages:
resolution: {integrity: sha512-7xHmXm/QJ7cbK2laF+YYD7gb5MggHIIQwqyjin3bpEGiSuvScMQ5JZZXPvRipi1MwckTQbJZROMns/JxdnIL1Q==}
dev: true
- /@types/node@16.18.68:
- resolution: {integrity: sha512-sG3hPIQwJLoewrN7cr0dwEy+yF5nD4D/4FxtQpFciRD/xwUzgD+G05uxZHv5mhfXo4F9Jkp13jjn0CC2q325sg==}
+ /@types/node@16.18.80:
+ resolution: {integrity: sha512-vFxJ1Iyl7A0+xB0uW1r1v504yItKZLdqg/VZELUZ4H02U0bXAgBisSQ8Erf0DMruNFz9ggoiEv6T8Ll9bTg8Jw==}
dev: true
/@types/node@8.10.66:
@@ -1836,7 +1818,7 @@ packages:
/@types/pbkdf2@3.1.0:
resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/prettier@2.7.1:
@@ -1850,26 +1832,26 @@ packages:
/@types/readable-stream@2.3.15:
resolution: {integrity: sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
safe-buffer: 5.1.2
dev: true
/@types/resolve@0.0.8:
resolution: {integrity: sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/responselike@1.0.0:
resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/secp256k1@4.0.3:
resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==}
dependencies:
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
dev: true
/@types/semver@7.5.0:
@@ -1893,8 +1875,8 @@ packages:
resolution: {integrity: sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==}
dev: true
- /@typescript-eslint/eslint-plugin@6.14.0(@typescript-eslint/parser@6.14.0)(eslint@8.55.0)(typescript@5.3.3):
- resolution: {integrity: sha512-1ZJBykBCXaSHG94vMMKmiHoL0MhNHKSVlcHVYZNw+BKxufhqQVTOawNpwwI1P5nIFZ/4jLVop0mcY6mJJDFNaw==}
+ /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.3.3):
+ resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
'@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha
@@ -1904,14 +1886,14 @@ packages:
typescript:
optional: true
dependencies:
- '@eslint-community/regexpp': 4.8.0
- '@typescript-eslint/parser': 6.14.0(eslint@8.55.0)(typescript@5.3.3)
- '@typescript-eslint/scope-manager': 6.14.0
- '@typescript-eslint/type-utils': 6.14.0(eslint@8.55.0)(typescript@5.3.3)
- '@typescript-eslint/utils': 6.14.0(eslint@8.55.0)(typescript@5.3.3)
- '@typescript-eslint/visitor-keys': 6.14.0
+ '@eslint-community/regexpp': 4.9.1
+ '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4(supports-color@8.1.1)
- eslint: 8.55.0
+ eslint: 8.56.0
graphemer: 1.4.0
ignore: 5.2.4
natural-compare: 1.4.0
@@ -1922,8 +1904,8 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/parser@6.14.0(eslint@8.55.0)(typescript@5.3.3):
- resolution: {integrity: sha512-QjToC14CKacd4Pa7JK4GeB/vHmWFJckec49FR4hmIRf97+KXole0T97xxu9IFiPxVQ1DBWrQ5wreLwAGwWAVQA==}
+ /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3):
+ resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
@@ -1932,27 +1914,27 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/scope-manager': 6.14.0
- '@typescript-eslint/types': 6.14.0
- '@typescript-eslint/typescript-estree': 6.14.0(typescript@5.3.3)
- '@typescript-eslint/visitor-keys': 6.14.0
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3)
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4(supports-color@8.1.1)
- eslint: 8.55.0
+ eslint: 8.56.0
typescript: 5.3.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/scope-manager@6.14.0:
- resolution: {integrity: sha512-VT7CFWHbZipPncAZtuALr9y3EuzY1b1t1AEkIq2bTXUPKw+pHoXflGNG5L+Gv6nKul1cz1VH8fz16IThIU0tdg==}
+ /@typescript-eslint/scope-manager@6.21.0:
+ resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
- '@typescript-eslint/types': 6.14.0
- '@typescript-eslint/visitor-keys': 6.14.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
dev: true
- /@typescript-eslint/type-utils@6.14.0(eslint@8.55.0)(typescript@5.3.3):
- resolution: {integrity: sha512-x6OC9Q7HfYKqjnuNu5a7kffIYs3No30isapRBJl1iCHLitD8O0lFbRcVGiOcuyN837fqXzPZ1NS10maQzZMKqw==}
+ /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.3.3):
+ resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
@@ -1961,23 +1943,23 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/typescript-estree': 6.14.0(typescript@5.3.3)
- '@typescript-eslint/utils': 6.14.0(eslint@8.55.0)(typescript@5.3.3)
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3)
+ '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.3.3)
debug: 4.3.4(supports-color@8.1.1)
- eslint: 8.55.0
+ eslint: 8.56.0
ts-api-utils: 1.0.3(typescript@5.3.3)
typescript: 5.3.3
transitivePeerDependencies:
- supports-color
dev: true
- /@typescript-eslint/types@6.14.0:
- resolution: {integrity: sha512-uty9H2K4Xs8E47z3SnXEPRNDfsis8JO27amp2GNCnzGETEW3yTqEIVg5+AI7U276oGF/tw6ZA+UesxeQ104ceA==}
+ /@typescript-eslint/types@6.21.0:
+ resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==}
engines: {node: ^16.0.0 || >=18.0.0}
dev: true
- /@typescript-eslint/typescript-estree@6.14.0(typescript@5.3.3):
- resolution: {integrity: sha512-yPkaLwK0yH2mZKFE/bXkPAkkFgOv15GJAUzgUVonAbv0Hr4PK/N2yaA/4XQbTZQdygiDkpt5DkxPELqHguNvyw==}
+ /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3):
+ resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
typescript: '*'
@@ -1985,11 +1967,12 @@ packages:
typescript:
optional: true
dependencies:
- '@typescript-eslint/types': 6.14.0
- '@typescript-eslint/visitor-keys': 6.14.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/visitor-keys': 6.21.0
debug: 4.3.4(supports-color@8.1.1)
globby: 11.1.0
is-glob: 4.0.3
+ minimatch: 9.0.3
semver: 7.5.4
ts-api-utils: 1.0.3(typescript@5.3.3)
typescript: 5.3.3
@@ -1997,30 +1980,30 @@ packages:
- supports-color
dev: true
- /@typescript-eslint/utils@6.14.0(eslint@8.55.0)(typescript@5.3.3):
- resolution: {integrity: sha512-XwRTnbvRr7Ey9a1NT6jqdKX8y/atWG+8fAIu3z73HSP8h06i3r/ClMhmaF/RGWGW1tHJEwij1uEg2GbEmPYvYg==}
+ /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.3.3):
+ resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==}
engines: {node: ^16.0.0 || >=18.0.0}
peerDependencies:
eslint: ^7.0.0 || ^8.0.0
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0)
- '@types/json-schema': 7.0.12
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+ '@types/json-schema': 7.0.13
'@types/semver': 7.5.0
- '@typescript-eslint/scope-manager': 6.14.0
- '@typescript-eslint/types': 6.14.0
- '@typescript-eslint/typescript-estree': 6.14.0(typescript@5.3.3)
- eslint: 8.55.0
+ '@typescript-eslint/scope-manager': 6.21.0
+ '@typescript-eslint/types': 6.21.0
+ '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3)
+ eslint: 8.56.0
semver: 7.5.4
transitivePeerDependencies:
- supports-color
- typescript
dev: true
- /@typescript-eslint/visitor-keys@6.14.0:
- resolution: {integrity: sha512-fB5cw6GRhJUz03MrROVuj5Zm/Q+XWlVdIsFj+Zb1Hvqouc8t+XP2H5y53QYU/MGtd2dPg6/vJJlhoX3xc2ehfw==}
+ /@typescript-eslint/visitor-keys@6.21.0:
+ resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==}
engines: {node: ^16.0.0 || >=18.0.0}
dependencies:
- '@typescript-eslint/types': 6.14.0
+ '@typescript-eslint/types': 6.21.0
eslint-visitor-keys: 3.4.3
dev: true
@@ -2053,7 +2036,7 @@ packages:
source-map-support: 0.5.21
optionalDependencies:
prettier: 2.8.8
- prettier-plugin-solidity: 1.2.0(prettier@2.8.8)
+ prettier-plugin-solidity: 1.3.1(prettier@2.8.8)
transitivePeerDependencies:
- supports-color
dev: true
@@ -2104,7 +2087,6 @@ packages:
/accepts@1.3.7:
resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dependencies:
mime-types: 2.1.27
negotiator: 0.6.2
@@ -2183,8 +2165,8 @@ packages:
uri-js: 4.4.1
dev: true
- /amazon-cognito-identity-js@6.3.6:
- resolution: {integrity: sha512-kBq+GE6OkLrxtFj3ZduIOlKBFYeOqZK3EhxbDBkv476UTvy+uwfR0tlriTq2QzNdnvlQAjBIXnXuOM7DwR1UEQ==}
+ /amazon-cognito-identity-js@6.3.7:
+ resolution: {integrity: sha512-tSjnM7KyAeOZ7UMah+oOZ6cW4Gf64FFcc7BE2l7MTcp7ekAPrXaCbpcW2xEpH1EiDS4cPcAouHzmCuc2tr72vQ==}
dependencies:
'@aws-crypto/sha256-js': 1.2.2
buffer: 4.9.2
@@ -2202,6 +2184,11 @@ packages:
dev: true
optional: true
+ /ansi-colors@3.2.3:
+ resolution: {integrity: sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==}
+ engines: {node: '>=6'}
+ dev: true
+
/ansi-colors@3.2.4:
resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==}
engines: {node: '>=6'}
@@ -2234,6 +2221,11 @@ packages:
engines: {node: '>=4'}
dev: true
+ /ansi-regex@4.1.1:
+ resolution: {integrity: sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==}
+ engines: {node: '>=6'}
+ dev: true
+
/ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
@@ -2331,13 +2323,12 @@ packages:
/array-buffer-byte-length@1.0.0:
resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
is-array-buffer: 3.0.2
dev: true
/array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
- requiresBuild: true
dev: true
/array-union@2.1.0:
@@ -2361,18 +2352,18 @@ packages:
dependencies:
call-bind: 1.0.2
define-properties: 1.2.1
- es-abstract: 1.22.2
- es-shim-unscopables: 1.0.0
- get-intrinsic: 1.2.1
+ es-abstract: 1.22.3
+ es-shim-unscopables: 1.0.2
+ get-intrinsic: 1.2.2
dev: true
- /array.prototype.reduce@1.0.6:
- resolution: {integrity: sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==}
+ /array.prototype.reduce@1.0.4:
+ resolution: {integrity: sha512-WnM+AjG/DvLRLo4DDl+r+SvCzYtD2Jd9oeBYMcEaI7t3fFrHY9M53/wdLcTvmZNQ70IU6Htj0emFkZ5TS+lrdw==}
engines: {node: '>= 0.4'}
dependencies:
call-bind: 1.0.2
- define-properties: 1.2.1
- es-abstract: 1.22.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.3
es-array-method-boxes-properly: 1.0.0
is-string: 1.0.7
dev: true
@@ -2382,10 +2373,10 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
array-buffer-byte-length: 1.0.0
- call-bind: 1.0.2
+ call-bind: 1.0.5
define-properties: 1.2.1
- es-abstract: 1.22.2
- get-intrinsic: 1.2.1
+ es-abstract: 1.22.3
+ get-intrinsic: 1.2.2
is-array-buffer: 3.0.2
is-shared-array-buffer: 1.0.2
dev: true
@@ -2396,7 +2387,6 @@ packages:
/asn1.js@4.10.1:
resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==}
- requiresBuild: true
dependencies:
bn.js: 4.12.0
inherits: 2.0.4
@@ -2499,8 +2489,8 @@ packages:
- debug
dev: true
- /axios@1.5.1(debug@4.3.4):
- resolution: {integrity: sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==}
+ /axios@1.6.2(debug@4.3.4):
+ resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==}
dependencies:
follow-redirects: 1.15.2(debug@4.3.4)
form-data: 4.0.0
@@ -2530,7 +2520,7 @@ packages:
babel-traverse: 6.26.0
babel-types: 6.26.0
babylon: 6.18.0
- convert-source-map: 1.9.0
+ convert-source-map: 1.8.0
debug: 2.6.9
json5: 0.5.1
lodash: 4.17.21
@@ -3090,11 +3080,6 @@ packages:
engines: {node: '>=0.6'}
dev: true
- /big-integer@1.6.51:
- resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
- engines: {node: '>=0.6'}
- dev: true
-
/big.js@6.2.1:
resolution: {integrity: sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==}
dev: true
@@ -3124,6 +3109,12 @@ packages:
engines: {node: '>=8'}
dev: true
+ /bindings@1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+ dependencies:
+ file-uri-to-path: 1.0.0
+ dev: true
+
/bip39@2.5.0:
resolution: {integrity: sha512-xwIx/8JKoT2+IPJpFEfXoWdYwP7UVAoUxxLNfGCfVowaJE7yg1Y5B1BVPqlUNsBq5/nGwmFkwRJ8xDW4sX8OdA==}
dependencies:
@@ -3134,6 +3125,12 @@ packages:
unorm: 1.6.0
dev: true
+ /bip66@1.1.5:
+ resolution: {integrity: sha512-nemMHz95EmS38a26XbbdxIYj5csHd3RMP3H5bwQknX0WYHF01qhpufP42mLOwVICuH2JmhIhXiWs89MfUGL7Xw==}
+ dependencies:
+ safe-buffer: 5.2.1
+ dev: true
+
/blakejs@1.2.1:
resolution: {integrity: sha512-QXUSXI3QVc/gJME0dBpXrag1kbzOqCjCX8/b54ntNyW6sjtoqxqRk3LTmXzaJoh71zMsDCjM+47jS7XiwN/+fQ==}
dev: true
@@ -3155,7 +3152,6 @@ packages:
/body-parser@1.19.0:
resolution: {integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==}
engines: {node: '>= 0.8'}
- requiresBuild: true
dependencies:
bytes: 3.1.0
content-type: 1.0.4
@@ -3175,13 +3171,6 @@ packages:
resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
dev: true
- /bplist-parser@0.2.0:
- resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
- engines: {node: '>= 5.10.0'}
- dependencies:
- big-integer: 1.6.51
- dev: true
-
/brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
@@ -3249,7 +3238,6 @@ packages:
/browserify-cipher@1.0.1:
resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
- requiresBuild: true
dependencies:
browserify-aes: 1.2.0
browserify-des: 1.0.2
@@ -3258,7 +3246,6 @@ packages:
/browserify-des@1.0.2:
resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
- requiresBuild: true
dependencies:
cipher-base: 1.0.4
des.js: 1.0.1
@@ -3268,15 +3255,20 @@ packages:
/browserify-rsa@4.0.1:
resolution: {integrity: sha512-+YpEyaLDDvvdzIxQ+cCx73r5YEhS3ANGOkiHdyWqW4t3gdeoNEYjSiQwntbU4Uo2/9yRkpYX3SRFeH+7jc2Duw==}
- requiresBuild: true
dependencies:
bn.js: 4.12.0
randombytes: 2.1.0
dev: true
+ /browserify-sha3@0.0.4:
+ resolution: {integrity: sha512-WmXX4M8lltqzMnBiPbP9KQdITknmxe4Wp3rhGfpYJst5yOeGwKkHpC0t+Ty22laH4Ltg9YO+p14p93wiipqjxA==}
+ dependencies:
+ js-sha3: 0.6.1
+ safe-buffer: 5.2.1
+ dev: true
+
/browserify-sign@4.0.4:
resolution: {integrity: sha512-D2ItxCwNtLcHRrOCuEDZQlIezlFyUV/N5IYz6TY1svu1noyThFuthoEjzT8ChZe3UEctqnwmykcPhet3Eiz58A==}
- requiresBuild: true
dependencies:
bn.js: 4.12.0
browserify-rsa: 4.0.1
@@ -3291,8 +3283,8 @@ packages:
resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==}
hasBin: true
dependencies:
- caniuse-lite: 1.0.30001549
- electron-to-chromium: 1.4.556
+ caniuse-lite: 1.0.30001414
+ electron-to-chromium: 1.4.270
dev: true
/bs58@4.0.1:
@@ -3315,12 +3307,10 @@ packages:
/buffer-to-arraybuffer@0.0.5:
resolution: {integrity: sha512-3dthu5CYiVB1DEJp61FtApNnNndTckcqe4pFcLdvHtrpG+kcyekCJKg4MRiDcFW7A6AODnXB9U4dwQiCW5kzJQ==}
- requiresBuild: true
dev: true
/buffer-xor@1.0.3:
resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
- requiresBuild: true
dev: true
/buffer-xor@2.0.2:
@@ -3364,13 +3354,6 @@ packages:
engines: {node: '>=8.0.0'}
dev: false
- /bundle-name@3.0.0:
- resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
- engines: {node: '>=12'}
- dependencies:
- run-applescript: 5.0.0
- dev: true
-
/busboy@1.6.0:
resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
engines: {node: '>=10.16.0'}
@@ -3381,7 +3364,6 @@ packages:
/bytes@3.1.0:
resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==}
engines: {node: '>= 0.8'}
- requiresBuild: true
dev: true
/bytes@3.1.2:
@@ -3425,7 +3407,6 @@ packages:
/cacheable-request@6.1.0:
resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==}
engines: {node: '>=8'}
- requiresBuild: true
dependencies:
clone-response: 1.0.2
get-stream: 5.1.0
@@ -3463,6 +3444,14 @@ packages:
get-intrinsic: 1.1.3
dev: true
+ /call-bind@1.0.5:
+ resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==}
+ dependencies:
+ function-bind: 1.1.2
+ get-intrinsic: 1.2.2
+ set-function-length: 1.1.1
+ dev: true
+
/callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
@@ -3485,13 +3474,18 @@ packages:
engines: {node: '>=4'}
dev: true
+ /camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+ dev: true
+
/camelcase@6.3.0:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
dev: true
- /caniuse-lite@1.0.30001549:
- resolution: {integrity: sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==}
+ /caniuse-lite@1.0.30001414:
+ resolution: {integrity: sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==}
dev: true
/case@1.6.3:
@@ -3642,6 +3636,21 @@ packages:
parse5-htmlparser2-tree-adapter: 7.0.0
dev: true
+ /chokidar@3.3.0:
+ resolution: {integrity: sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==}
+ engines: {node: '>= 8.10.0'}
+ dependencies:
+ anymatch: 3.1.2
+ braces: 3.0.2
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.2.0
+ optionalDependencies:
+ fsevents: 2.1.3
+ dev: true
+
/chokidar@3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
@@ -3659,7 +3668,6 @@ packages:
/chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
- requiresBuild: true
dev: true
/ci-info@2.0.0:
@@ -3670,7 +3678,6 @@ packages:
resolution: {integrity: sha512-zT7mPeghoWAu+ppn8+BS1tQ5qGmbMfB4AregnQjA/qHY3GC1m1ptI9GkWNlgeu38r7CuRdXB47uY2XgAYt6QVA==}
engines: {node: '>=4.0.0', npm: '>=3.0.0'}
deprecated: This module has been superseded by the multiformats module
- requiresBuild: true
dependencies:
buffer: 5.7.1
class-is: 1.1.0
@@ -3688,7 +3695,6 @@ packages:
/class-is@1.1.0:
resolution: {integrity: sha512-rhjH9AG1fvabIDoGRVH587413LPjTZgmDF9fOFCbFJQV4yuocX1mHxxvXI4g3cGwbVY9wAYIoKlg1N79frJKQw==}
- requiresBuild: true
dev: true
/class-utils@0.3.6:
@@ -3745,6 +3751,14 @@ packages:
wrap-ansi: 2.1.0
dev: true
+ /cliui@5.0.0:
+ resolution: {integrity: sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==}
+ dependencies:
+ string-width: 3.1.0
+ strip-ansi: 5.2.0
+ wrap-ansi: 5.1.0
+ dev: true
+
/cliui@7.0.4:
resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
dependencies:
@@ -3866,7 +3880,7 @@ packages:
dev: true
/concat-map@0.0.1:
- resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
dev: true
/concat-stream@1.6.2:
@@ -3896,7 +3910,6 @@ packages:
/content-disposition@0.5.3:
resolution: {integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dependencies:
safe-buffer: 5.1.2
dev: true
@@ -3912,22 +3925,21 @@ packages:
/content-type@1.0.4:
resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
- /convert-source-map@1.9.0:
- resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+ /convert-source-map@1.8.0:
+ resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==}
+ dependencies:
+ safe-buffer: 5.1.2
dev: true
/cookie-signature@1.0.6:
resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
- requiresBuild: true
dev: true
/cookie@0.4.0:
resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/cookie@0.4.2:
@@ -3937,7 +3949,6 @@ packages:
/cookiejar@2.1.2:
resolution: {integrity: sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==}
- requiresBuild: true
dev: true
/copy-descriptor@0.1.1:
@@ -3972,7 +3983,6 @@ packages:
/cors@2.8.5:
resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
engines: {node: '>= 0.10'}
- requiresBuild: true
dependencies:
object-assign: 4.1.1
vary: 1.1.2
@@ -3996,7 +4006,6 @@ packages:
/create-ecdh@4.0.3:
resolution: {integrity: sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==}
- requiresBuild: true
dependencies:
bn.js: 4.12.0
elliptic: 6.5.4
@@ -4140,7 +4149,7 @@ packages:
ms: 2.0.0
dev: true
- /debug@3.2.6:
+ /debug@3.2.6(supports-color@6.0.0):
resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==}
deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)
peerDependencies:
@@ -4150,6 +4159,7 @@ packages:
optional: true
dependencies:
ms: 2.1.3
+ supports-color: 6.0.0
dev: true
/debug@3.2.7:
@@ -4194,7 +4204,6 @@ packages:
/decompress-response@3.3.0:
resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
engines: {node: '>=4'}
- requiresBuild: true
dependencies:
mimic-response: 1.0.1
dev: true
@@ -4227,7 +4236,7 @@ packages:
is-regex: 1.1.4
object-is: 1.1.5
object-keys: 1.1.1
- regexp.prototype.flags: 1.4.3
+ regexp.prototype.flags: 1.5.1
dev: true
/deep-extend@0.6.0:
@@ -4239,27 +4248,8 @@ packages:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
dev: true
- /default-browser-id@3.0.0:
- resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
- engines: {node: '>=12'}
- dependencies:
- bplist-parser: 0.2.0
- untildify: 4.0.0
- dev: true
-
- /default-browser@4.0.0:
- resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
- engines: {node: '>=14.16'}
- dependencies:
- bundle-name: 3.0.0
- default-browser-id: 3.0.0
- execa: 7.2.0
- titleize: 3.0.0
- dev: true
-
/defer-to-connect@1.1.1:
resolution: {integrity: sha512-J7thop4u3mRTkYRQ+Vpfwy2G5Ehoy82I14+14W4YMDLKdWloI9gSzRbV30s/NckQGVJtPkWNcW4oMAUigTdqiQ==}
- requiresBuild: true
dev: true
/defer-to-connect@2.0.1:
@@ -4285,16 +4275,11 @@ packages:
resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==}
engines: {node: '>= 0.4'}
dependencies:
- get-intrinsic: 1.2.1
+ get-intrinsic: 1.2.2
gopd: 1.0.1
has-property-descriptors: 1.0.0
dev: true
- /define-lazy-prop@3.0.0:
- resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
- engines: {node: '>=12'}
- dev: true
-
/define-properties@1.1.4:
resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
engines: {node: '>= 0.4'}
@@ -4334,8 +4319,8 @@ packages:
isobject: 3.0.1
dev: true
- /defined@1.0.1:
- resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==}
+ /defined@1.0.0:
+ resolution: {integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==}
dev: true
/delayed-stream@1.0.0:
@@ -4357,7 +4342,6 @@ packages:
/depd@1.1.2:
resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/depd@2.0.0:
@@ -4367,7 +4351,6 @@ packages:
/des.js@1.0.1:
resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==}
- requiresBuild: true
dependencies:
inherits: 2.0.4
minimalistic-assert: 1.0.1
@@ -4375,7 +4358,6 @@ packages:
/destroy@1.0.4:
resolution: {integrity: sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==}
- requiresBuild: true
dev: true
/detect-indent@4.0.0:
@@ -4401,6 +4383,11 @@ packages:
- supports-color
dev: true
+ /diff@3.5.0:
+ resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==}
+ engines: {node: '>=0.3.1'}
+ dev: true
+
/diff@4.0.2:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'}
@@ -4413,7 +4400,6 @@ packages:
/diffie-hellman@5.0.3:
resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
- requiresBuild: true
dependencies:
bn.js: 4.12.0
miller-rabin: 4.0.1
@@ -4484,9 +4470,17 @@ packages:
minimatch: 3.1.2
dev: true
+ /drbg.js@1.0.1:
+ resolution: {integrity: sha512-F4wZ06PvqxYLFEZKkFxTDcns9oFNk34hvmJSEwdzsxVQ8YI5YaxtACgQatkYgv2VI2CFkUd2Y+xosPQnHv809g==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ browserify-aes: 1.2.0
+ create-hash: 1.2.0
+ create-hmac: 1.1.7
+ dev: true
+
/duplexer3@0.1.4:
resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==}
- requiresBuild: true
dev: true
/ecc-jsbn@0.1.2:
@@ -4498,11 +4492,10 @@ packages:
/ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- requiresBuild: true
dev: true
- /electron-to-chromium@1.4.556:
- resolution: {integrity: sha512-6RPN0hHfzDU8D56E72YkDvnLw5Cj2NMXZGg3UkgyoHxjVhG99KZpsKgBWMmTy0Ei89xwan+rbRsVB9yzATmYzQ==}
+ /electron-to-chromium@1.4.270:
+ resolution: {integrity: sha512-KNhIzgLiJmDDC444dj9vEOpZEgsV96ult9Iff98Vanumn+ShJHd5se8aX6KeVxdc0YQeqdrezBZv89rleDbvSg==}
dev: true
/elliptic@6.5.4:
@@ -4516,6 +4509,10 @@ packages:
minimalistic-assert: 1.0.1
minimalistic-crypto-utils: 1.0.1
+ /emoji-regex@7.0.3:
+ resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==}
+ dev: true
+
/emoji-regex@8.0.0:
resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
dev: true
@@ -4523,7 +4520,6 @@ packages:
/encodeurl@1.0.2:
resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
engines: {node: '>= 0.8'}
- requiresBuild: true
dev: true
/encoding-down@5.0.4:
@@ -4579,26 +4575,56 @@ packages:
is-arrayish: 0.2.1
dev: true
- /es-abstract@1.22.2:
- resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==}
+ /es-abstract@1.20.3:
+ resolution: {integrity: sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ es-to-primitive: 1.2.1
+ function-bind: 1.1.1
+ function.prototype.name: 1.1.5
+ get-intrinsic: 1.1.3
+ get-symbol-description: 1.0.0
+ has: 1.0.3
+ has-property-descriptors: 1.0.0
+ has-symbols: 1.0.3
+ internal-slot: 1.0.3
+ is-callable: 1.2.7
+ is-negative-zero: 2.0.2
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.2
+ is-string: 1.0.7
+ is-weakref: 1.0.2
+ object-inspect: 1.12.2
+ object-keys: 1.1.1
+ object.assign: 4.1.4
+ regexp.prototype.flags: 1.4.3
+ safe-regex-test: 1.0.0
+ string.prototype.trimend: 1.0.5
+ string.prototype.trimstart: 1.0.5
+ unbox-primitive: 1.0.2
+ dev: true
+
+ /es-abstract@1.22.3:
+ resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==}
engines: {node: '>= 0.4'}
dependencies:
array-buffer-byte-length: 1.0.0
arraybuffer.prototype.slice: 1.0.2
available-typed-arrays: 1.0.5
- call-bind: 1.0.2
- es-set-tostringtag: 2.0.1
+ call-bind: 1.0.5
+ es-set-tostringtag: 2.0.2
es-to-primitive: 1.2.1
function.prototype.name: 1.1.6
- get-intrinsic: 1.2.1
+ get-intrinsic: 1.2.2
get-symbol-description: 1.0.0
globalthis: 1.0.3
gopd: 1.0.1
- has: 1.0.3
has-property-descriptors: 1.0.0
has-proto: 1.0.1
has-symbols: 1.0.3
- internal-slot: 1.0.5
+ hasown: 2.0.0
+ internal-slot: 1.0.6
is-array-buffer: 3.0.2
is-callable: 1.2.7
is-negative-zero: 2.0.2
@@ -4607,7 +4633,7 @@ packages:
is-string: 1.0.7
is-typed-array: 1.1.12
is-weakref: 1.0.2
- object-inspect: 1.13.0
+ object-inspect: 1.13.1
object-keys: 1.1.1
object.assign: 4.1.4
regexp.prototype.flags: 1.5.1
@@ -4621,26 +4647,26 @@ packages:
typed-array-byte-offset: 1.0.0
typed-array-length: 1.0.4
unbox-primitive: 1.0.2
- which-typed-array: 1.1.11
+ which-typed-array: 1.1.13
dev: true
/es-array-method-boxes-properly@1.0.0:
resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==}
dev: true
- /es-set-tostringtag@2.0.1:
- resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
+ /es-set-tostringtag@2.0.2:
+ resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==}
engines: {node: '>= 0.4'}
dependencies:
- get-intrinsic: 1.2.1
- has: 1.0.3
+ get-intrinsic: 1.2.2
has-tostringtag: 1.0.0
+ hasown: 2.0.0
dev: true
- /es-shim-unscopables@1.0.0:
- resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+ /es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
dependencies:
- has: 1.0.3
+ hasown: 2.0.0
dev: true
/es-to-primitive@1.2.1:
@@ -4688,7 +4714,6 @@ packages:
/escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
- requiresBuild: true
dev: true
/escape-string-regexp@1.0.5:
@@ -4714,17 +4739,17 @@ packages:
source-map: 0.2.0
dev: true
- /eslint-config-prettier@9.1.0(eslint@8.55.0):
+ /eslint-config-prettier@9.1.0(eslint@8.56.0):
resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==}
hasBin: true
peerDependencies:
eslint: '>=7.0.0'
dependencies:
- eslint: 8.55.0
+ eslint: 8.56.0
dev: true
- /eslint-plugin-prettier@5.0.1(eslint-config-prettier@9.1.0)(eslint@8.55.0)(prettier@3.1.1):
- resolution: {integrity: sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg==}
+ /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.2.5):
+ resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
'@types/eslint': '>=8.0.0'
@@ -4737,11 +4762,11 @@ packages:
eslint-config-prettier:
optional: true
dependencies:
- eslint: 8.55.0
- eslint-config-prettier: 9.1.0(eslint@8.55.0)
- prettier: 3.1.1
+ eslint: 8.56.0
+ eslint-config-prettier: 9.1.0(eslint@8.56.0)
+ prettier: 3.2.5
prettier-linter-helpers: 1.0.0
- synckit: 0.8.5
+ synckit: 0.8.8
dev: true
/eslint-scope@7.2.2:
@@ -4757,15 +4782,15 @@ packages:
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
dev: true
- /eslint@8.55.0:
- resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==}
+ /eslint@8.56.0:
+ resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
hasBin: true
dependencies:
- '@eslint-community/eslint-utils': 4.4.0(eslint@8.55.0)
- '@eslint-community/regexpp': 4.8.0
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+ '@eslint-community/regexpp': 4.9.1
'@eslint/eslintrc': 2.1.4
- '@eslint/js': 8.55.0
+ '@eslint/js': 8.56.0
'@humanwhocodes/config-array': 0.11.13
'@humanwhocodes/module-importer': 1.0.1
'@nodelib/fs.walk': 1.2.8
@@ -4857,7 +4882,6 @@ packages:
/etag@1.8.1:
resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/eth-block-tracker@3.0.1:
@@ -4869,7 +4893,7 @@ packages:
ethjs-util: 0.1.6
json-rpc-engine: 3.8.0
pify: 2.3.0
- tape: 4.17.0
+ tape: 4.16.1
transitivePeerDependencies:
- supports-color
dev: true
@@ -4881,31 +4905,29 @@ packages:
js-sha3: 0.5.7
dev: true
- /eth-gas-reporter@0.2.27(debug@4.3.4):
- resolution: {integrity: sha512-femhvoAM7wL0GcI8ozTdxfuBtBFJ9qsyIAsmKVjlWAHUbdnnXHt+lKzz/kmldM5lA9jLuNHGwuIxorNpLbR1Zw==}
+ /eth-gas-reporter@0.2.25:
+ resolution: {integrity: sha512-1fRgyE4xUB8SoqLgN3eDfpDfwEfRxh2Sz1b7wzFbyQA+9TekMmvSjjoRu9SKcSVyK+vLkLIsVbJDsTWjw195OQ==}
peerDependencies:
'@codechecks/client': ^0.1.0
peerDependenciesMeta:
'@codechecks/client':
optional: true
dependencies:
+ '@ethersproject/abi': 5.7.0
'@solidity-parser/parser': 0.14.3
- axios: 1.5.1(debug@4.3.4)
cli-table3: 0.5.1
colors: 1.4.0
ethereum-cryptography: 1.1.2
- ethers: 5.7.2
+ ethers: 4.0.49
fs-readdir-recursive: 1.1.0
lodash: 4.17.21
markdown-table: 1.1.3
- mocha: 10.2.0
+ mocha: 7.2.0
req-cwd: 2.0.0
+ request: 2.88.2
+ request-promise-native: 1.0.9(request@2.88.2)
sha1: 1.1.1
sync-request: 6.1.0
- transitivePeerDependencies:
- - bufferutil
- - debug
- - utf-8-validate
dev: true
/eth-json-rpc-infura@3.2.1:
@@ -4934,16 +4956,15 @@ packages:
fetch-ponyfill: 4.1.0
json-rpc-engine: 3.8.0
json-rpc-error: 2.0.0
- json-stable-stringify: 1.0.2
+ json-stable-stringify: 1.0.1
promise-to-callback: 1.0.0
- tape: 4.17.0
+ tape: 4.16.1
transitivePeerDependencies:
- supports-color
dev: true
/eth-lib@0.1.29:
resolution: {integrity: sha512-bfttrr3/7gG4E02HoWTDUcDDslN003OlOoBxk9virpAZQ1ja/jDgwkWB8QfJF7ojuEowrqy+lzp9VcJG7/k5bQ==}
- requiresBuild: true
dependencies:
bn.js: 4.12.0
elliptic: 6.5.4
@@ -5082,7 +5103,7 @@ packages:
resolution: {integrity: sha512-rCjJZ/AE96c/AAZc6O3kaog4FhOsAViaysBxqJNy2+LHP0ttH0zkZ7nXdVHOAyt6lFwLO0nlCwWszysG/ao1+g==}
dependencies:
bn.js: 4.12.0
- ethereumjs-util: 4.5.1
+ ethereumjs-util: 4.5.0
dev: true
/ethereumjs-abi@0.6.8:
@@ -5168,14 +5189,14 @@ packages:
ethereumjs-util: 6.2.1
dev: true
- /ethereumjs-util@4.5.1:
- resolution: {integrity: sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w==}
+ /ethereumjs-util@4.5.0:
+ resolution: {integrity: sha512-gT1zBY8aQKkexYu7XNeBZBnJsRLo+sWD1XWRLJOaDSz49/9kCOs6ERP52Bw/TA4uaVFKpM+O8ebWy44Ib5B6xw==}
dependencies:
bn.js: 4.12.0
create-hash: 1.2.0
- elliptic: 6.5.4
- ethereum-cryptography: 0.1.3
+ keccakjs: 0.2.3
rlp: 2.2.7
+ secp256k1: 3.7.1
dev: true
/ethereumjs-util@5.2.1:
@@ -5248,7 +5269,7 @@ packages:
merkle-patricia-tree: 2.3.2
rustbn.js: 0.2.0
safe-buffer: 5.2.1
- util.promisify: 1.1.2
+ util.promisify: 1.1.1
dev: true
/ethereumjs-wallet@0.6.5:
@@ -5342,6 +5363,7 @@ packages:
is-hex-prefixed: 1.0.0
strip-hex-prefix: 1.0.0
dev: true
+ bundledDependencies: false
/eventemitter3@4.0.4:
resolution: {integrity: sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==}
@@ -5354,42 +5376,11 @@ packages:
/evp_bytestokey@1.0.3:
resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
- requiresBuild: true
dependencies:
md5.js: 1.3.5
safe-buffer: 5.2.1
dev: true
- /execa@5.1.1:
- resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
- engines: {node: '>=10'}
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 6.0.1
- human-signals: 2.1.0
- is-stream: 2.0.1
- merge-stream: 2.0.0
- npm-run-path: 4.0.1
- onetime: 5.1.2
- signal-exit: 3.0.7
- strip-final-newline: 2.0.0
- dev: true
-
- /execa@7.2.0:
- resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
- engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
- dependencies:
- cross-spawn: 7.0.3
- get-stream: 6.0.1
- human-signals: 4.3.1
- is-stream: 3.0.0
- merge-stream: 2.0.0
- npm-run-path: 5.1.0
- onetime: 6.0.0
- signal-exit: 3.0.7
- strip-final-newline: 3.0.0
- dev: true
-
/expand-brackets@2.1.4:
resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
engines: {node: '>=0.10.0'}
@@ -5408,7 +5399,6 @@ packages:
/express@4.17.1:
resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==}
engines: {node: '>= 0.10.0'}
- requiresBuild: true
dependencies:
accepts: 1.3.7
array-flatten: 1.1.1
@@ -5558,6 +5548,10 @@ packages:
flat-cache: 3.0.4
dev: true
+ /file-uri-to-path@1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+ dev: true
+
/fill-range@4.0.0:
resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
engines: {node: '>=0.10.0'}
@@ -5578,7 +5572,6 @@ packages:
/finalhandler@1.1.2:
resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==}
engines: {node: '>= 0.8'}
- requiresBuild: true
dependencies:
debug: 2.6.9
encodeurl: 1.0.2
@@ -5621,6 +5614,13 @@ packages:
locate-path: 2.0.0
dev: true
+ /find-up@3.0.0:
+ resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
+ engines: {node: '>=6'}
+ dependencies:
+ locate-path: 3.0.0
+ dev: true
+
/find-up@4.1.0:
resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
engines: {node: '>=8'}
@@ -5660,6 +5660,13 @@ packages:
rimraf: 3.0.2
dev: true
+ /flat@4.1.1:
+ resolution: {integrity: sha512-FmTtBsHskrU6FJ2VxCnsDb84wu9zhmO3cUX2kGFb5tuwhfXxGciiT0oRY+cck35QmG+NmGh5eLz6lLCpWTqwpA==}
+ hasBin: true
+ dependencies:
+ is-buffer: 2.0.5
+ dev: true
+
/flat@5.0.2:
resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
hasBin: true
@@ -5696,6 +5703,10 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
+ /foreach@2.0.5:
+ resolution: {integrity: sha512-ZBbtRiapkZYLsqoPyZOR+uPfto0GRMNQN1GwzZtZt7iZvPPbDDQV0JF5Hx4o/QFQ5c0vyuoZ98T8RSBbopzWtA==}
+ dev: true
+
/forever-agent@0.6.1:
resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
dev: true
@@ -5734,7 +5745,6 @@ packages:
/forwarded@0.1.2:
resolution: {integrity: sha512-Ua9xNhH0b8pwE3yRbFfXJvfdWF0UHNCdeyb2sbi9Ul/M+r3PTdrz7Cv4SCfZRMjmzEM9PhraqfZFbGTIg3OMyA==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/fp-ts@1.19.3:
@@ -5751,7 +5761,6 @@ packages:
/fresh@0.5.2:
resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/fs-extra@0.30.0:
@@ -5802,7 +5811,6 @@ packages:
/fs-minipass@1.2.7:
resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==}
- requiresBuild: true
dependencies:
minipass: 2.9.0
dev: true
@@ -5815,6 +5823,15 @@ packages:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
dev: true
+ /fsevents@2.1.3:
+ resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ deprecated: '"Please update to latest v2.3 or v2.2"'
+ requiresBuild: true
+ dev: true
+ optional: true
+
/fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -5827,13 +5844,27 @@ packages:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
dev: true
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+ dev: true
+
+ /function.prototype.name@1.1.5:
+ resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.3
+ functions-have-names: 1.2.3
+ dev: true
+
/function.prototype.name@1.1.6:
resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-abstract: 1.22.3
functions-have-names: 1.2.3
dev: true
@@ -5855,7 +5886,7 @@ packages:
bip39: 2.5.0
cachedown: 1.0.0
clone: 2.1.2
- debug: 3.2.6
+ debug: 3.2.6(supports-color@6.0.0)
encoding-down: 5.0.4
eth-sig-util: 3.0.0
ethereumjs-abi: 0.6.8
@@ -5909,13 +5940,13 @@ packages:
has-symbols: 1.0.3
dev: true
- /get-intrinsic@1.2.1:
- resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
+ /get-intrinsic@1.2.2:
+ resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==}
dependencies:
- function-bind: 1.1.1
- has: 1.0.3
+ function-bind: 1.1.2
has-proto: 1.0.1
has-symbols: 1.0.3
+ hasown: 2.0.0
dev: true
/get-port@3.2.0:
@@ -5926,13 +5957,11 @@ packages:
/get-stream@3.0.0:
resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==}
engines: {node: '>=4'}
- requiresBuild: true
dev: true
/get-stream@4.1.0:
resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
engines: {node: '>=6'}
- requiresBuild: true
dependencies:
pump: 3.0.0
dev: true
@@ -6000,6 +6029,17 @@ packages:
path-is-absolute: 1.0.1
dev: true
+ /glob@7.1.3:
+ resolution: {integrity: sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==}
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+ dev: true
+
/glob@7.1.7:
resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
dependencies:
@@ -6115,7 +6155,7 @@ packages:
/gopd@1.0.1:
resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
dependencies:
- get-intrinsic: 1.2.1
+ get-intrinsic: 1.2.2
dev: true
/got@12.1.0:
@@ -6140,7 +6180,6 @@ packages:
/got@7.1.0:
resolution: {integrity: sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==}
engines: {node: '>=4'}
- requiresBuild: true
dependencies:
'@types/keyv': 3.1.4
'@types/responselike': 1.0.0
@@ -6191,6 +6230,11 @@ packages:
resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
dev: true
+ /growl@1.10.5:
+ resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==}
+ engines: {node: '>=4.x'}
+ dev: true
+
/handlebars@4.7.7:
resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==}
engines: {node: '>=0.4.7'}
@@ -6240,20 +6284,17 @@ packages:
strip-ansi: 6.0.1
dev: true
- /hardhat-gas-reporter@1.0.9(debug@4.3.4)(hardhat@2.19.2):
+ /hardhat-gas-reporter@1.0.9(hardhat@2.19.2):
resolution: {integrity: sha512-INN26G3EW43adGKBNzYWOlI3+rlLnasXTwW79YNnUhXPDa+yHESgt639dJEs37gCjhkbNKcRRJnomXEuMFBXJg==}
peerDependencies:
hardhat: ^2.0.2
dependencies:
array-uniq: 1.0.3
- eth-gas-reporter: 0.2.27(debug@4.3.4)
+ eth-gas-reporter: 0.2.25
hardhat: 2.19.2(ts-node@10.9.2)(typescript@5.3.3)
sha1: 1.1.1
transitivePeerDependencies:
- '@codechecks/client'
- - bufferutil
- - debug
- - utf-8-validate
dev: true
/hardhat-ignore-warnings@0.2.9:
@@ -6320,7 +6361,7 @@ packages:
solc: 0.7.3(debug@4.3.4)
source-map-support: 0.5.21
stacktrace-parser: 0.1.10
- ts-node: 10.9.2(@types/node@16.18.68)(typescript@5.3.3)
+ ts-node: 10.9.2(@types/node@16.18.80)(typescript@5.3.3)
tsort: 0.0.1
typescript: 5.3.3
undici: 5.19.1
@@ -6371,7 +6412,6 @@ packages:
/has-symbol-support-x@1.4.2:
resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==}
- requiresBuild: true
dev: true
/has-symbols@1.0.3:
@@ -6381,7 +6421,6 @@ packages:
/has-to-string-tag-x@1.4.1:
resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==}
- requiresBuild: true
dependencies:
has-symbol-support-x: 1.4.2
dev: true
@@ -6453,6 +6492,13 @@ packages:
inherits: 2.0.4
minimalistic-assert: 1.0.1
+ /hasown@2.0.0:
+ resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function-bind: 1.1.2
+ dev: true
+
/he@1.2.0:
resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
hasBin: true
@@ -6522,7 +6568,6 @@ packages:
/http-errors@1.7.2:
resolution: {integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dependencies:
depd: 1.1.2
inherits: 2.0.3
@@ -6534,7 +6579,6 @@ packages:
/http-errors@1.7.3:
resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dependencies:
depd: 1.1.2
inherits: 2.0.4
@@ -6569,7 +6613,7 @@ packages:
engines: {node: '>=0.8', npm: '>=1.3.7'}
dependencies:
assert-plus: 1.0.0
- jsprim: 1.4.2
+ jsprim: 1.4.1
sshpk: 1.16.1
dev: true
@@ -6591,16 +6635,6 @@ packages:
- supports-color
dev: true
- /human-signals@2.1.0:
- resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
- engines: {node: '>=10.17.0'}
- dev: true
-
- /human-signals@4.3.1:
- resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
- engines: {node: '>=14.18.0'}
- dev: true
-
/iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
@@ -6670,7 +6704,6 @@ packages:
/inherits@2.0.3:
resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
- requiresBuild: true
dev: true
/inherits@2.0.4:
@@ -6680,19 +6713,28 @@ packages:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
dev: true
- /internal-slot@1.0.5:
- resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
+ /internal-slot@1.0.3:
+ resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
engines: {node: '>= 0.4'}
dependencies:
- get-intrinsic: 1.2.1
+ get-intrinsic: 1.1.3
has: 1.0.3
side-channel: 1.0.4
dev: true
- /interpret@1.2.0:
- resolution: {integrity: sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==}
- engines: {node: '>= 0.10'}
- dev: true
+ /internal-slot@1.0.6:
+ resolution: {integrity: sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.2
+ hasown: 2.0.0
+ side-channel: 1.0.4
+ dev: true
+
+ /interpret@1.2.0:
+ resolution: {integrity: sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==}
+ engines: {node: '>= 0.10'}
+ dev: true
/invariant@2.2.4:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
@@ -6714,7 +6756,6 @@ packages:
/ipaddr.js@1.9.0:
resolution: {integrity: sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==}
engines: {node: '>= 0.10'}
- requiresBuild: true
dev: true
/is-accessor-descriptor@0.1.6:
@@ -6739,8 +6780,8 @@ packages:
/is-array-buffer@3.0.2:
resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
is-typed-array: 1.1.12
dev: true
@@ -6790,8 +6831,8 @@ packages:
ci-info: 2.0.0
dev: true
- /is-core-module@2.13.0:
- resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==}
+ /is-core-module@2.10.0:
+ resolution: {integrity: sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==}
dependencies:
has: 1.0.3
dev: true
@@ -6839,12 +6880,6 @@ packages:
hasBin: true
dev: true
- /is-docker@3.0.0:
- resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- hasBin: true
- dev: true
-
/is-extendable@0.1.1:
resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
engines: {node: '>=0.10.0'}
@@ -6910,14 +6945,6 @@ packages:
engines: {node: '>=6.5.0', npm: '>=3'}
dev: true
- /is-inside-container@1.0.0:
- resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
- engines: {node: '>=14.16'}
- hasBin: true
- dependencies:
- is-docker: 3.0.0
- dev: true
-
/is-lower-case@1.1.3:
resolution: {integrity: sha512-+5A1e/WJpLLXZEDlgz4G//WYSHyQBD32qa4Jd3Lw06qQlv3fJHnp3YIHjTQSGzHMgzmVKz2ZP3rBxTHkPw/lxA==}
dependencies:
@@ -6950,7 +6977,6 @@ packages:
/is-object@1.0.1:
resolution: {integrity: sha512-+XzmTRB/JXoIdK20Ge8K8PRsP5UlthLaVhIRxzIwQ73jRgER8iRw98DilvERx/tSjOHLy9JM4sKUfLRMB5ui0Q==}
- requiresBuild: true
dev: true
/is-path-inside@3.0.3:
@@ -6961,7 +6987,6 @@ packages:
/is-plain-obj@1.1.0:
resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
engines: {node: '>=0.10.0'}
- requiresBuild: true
dev: true
/is-plain-obj@2.1.0:
@@ -6987,7 +7012,6 @@ packages:
/is-retry-allowed@1.2.0:
resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==}
engines: {node: '>=0.10.0'}
- requiresBuild: true
dev: true
/is-shared-array-buffer@1.0.2:
@@ -7001,16 +7025,6 @@ packages:
engines: {node: '>=0.10.0'}
dev: true
- /is-stream@2.0.1:
- resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
- engines: {node: '>=8'}
- dev: true
-
- /is-stream@3.0.0:
- resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dev: true
-
/is-string@1.0.7:
resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
engines: {node: '>= 0.4'}
@@ -7029,7 +7043,18 @@ packages:
resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==}
engines: {node: '>= 0.4'}
dependencies:
- which-typed-array: 1.1.11
+ which-typed-array: 1.1.13
+ dev: true
+
+ /is-typed-array@1.1.5:
+ resolution: {integrity: sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.5
+ es-abstract: 1.22.3
+ foreach: 2.0.5
+ has-symbols: 1.0.3
dev: true
/is-typedarray@1.0.0:
@@ -7141,7 +7166,6 @@ packages:
/isurl@1.0.0:
resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==}
engines: {node: '>= 4'}
- requiresBuild: true
dependencies:
has-to-string-tag-x: 1.4.1
is-object: 1.0.1
@@ -7163,6 +7187,10 @@ packages:
resolution: {integrity: sha512-GII20kjaPX0zJ8wzkTbNDYMY7msuZcTWk8S5UOh6806Jq/wz1J8/bnr8uGU0DAUmYDjj2Mr4X1cW8v/GLYnR+g==}
dev: true
+ /js-sha3@0.6.1:
+ resolution: {integrity: sha512-2OHj7sAZ9gnJS4lQsgIsTslmqVrNQdDC99bvwYGQKU1w6k/gwsTLeGBfWt8yHCuTOGqk7DXzuVlK8J+dDXnG7A==}
+ dev: true
+
/js-sha3@0.8.0:
resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==}
@@ -7174,6 +7202,14 @@ packages:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
dev: true
+ /js-yaml@3.13.1:
+ resolution: {integrity: sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+ dev: true
+
/js-yaml@3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
hasBin: true
@@ -7205,7 +7241,6 @@ packages:
/json-buffer@3.0.0:
resolution: {integrity: sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ==}
- requiresBuild: true
dev: true
/json-buffer@3.0.1:
@@ -7247,18 +7282,18 @@ packages:
resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
dev: true
- /json-schema@0.4.0:
- resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+ /json-schema@0.2.3:
+ resolution: {integrity: sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ==}
dev: true
/json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
dev: true
- /json-stable-stringify@1.0.2:
- resolution: {integrity: sha512-eunSSaEnxV12z+Z73y/j5N37/In40GK4GmsSy+tEHJMxknvqnA7/djeYtAgW0GsWHUfg+847WJjKaEylk2y09g==}
+ /json-stable-stringify@1.0.1:
+ resolution: {integrity: sha512-i/J297TW6xyj7sDFa7AmBPkQvLIxWr2kKPWI26tXydnZrzVAocNqn5DMNT1Mzk0vit1V5UkRM7C1KdVNp7Lmcg==}
dependencies:
- jsonify: 0.0.1
+ jsonify: 0.0.0
dev: true
/json-stringify-safe@5.0.1:
@@ -7298,8 +7333,8 @@ packages:
graceful-fs: 4.2.10
dev: true
- /jsonify@0.0.1:
- resolution: {integrity: sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==}
+ /jsonify@0.0.0:
+ resolution: {integrity: sha512-trvBk1ki43VZptdBI5rIlG4YOzyeH/WefQt5rj1grasPn4iiZWKet8nkgc4GlsAylaztn0qZfUYOiTsASJFdNA==}
dev: true
/jsonpointer@5.0.1:
@@ -7311,13 +7346,13 @@ packages:
resolution: {integrity: sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==}
dev: true
- /jsprim@1.4.2:
- resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
- engines: {node: '>=0.6.0'}
+ /jsprim@1.4.1:
+ resolution: {integrity: sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog==}
+ engines: {'0': node >=0.6.0}
dependencies:
assert-plus: 1.0.0
extsprintf: 1.3.0
- json-schema: 0.4.0
+ json-schema: 0.2.3
verror: 1.10.0
dev: true
@@ -7331,9 +7366,15 @@ packages:
readable-stream: 3.6.0
dev: true
+ /keccakjs@0.2.3:
+ resolution: {integrity: sha512-BjLkNDcfaZ6l8HBG9tH0tpmDv3sS2mA7FNQxFHpCdzP3Gb2MVruXBSuoM66SnVxKJpAr5dKGdkHD+bDokt8fTg==}
+ dependencies:
+ browserify-sha3: 0.0.4
+ sha3: 1.2.6
+ dev: true
+
/keyv@3.1.0:
resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
- requiresBuild: true
dependencies:
json-buffer: 3.0.0
dev: true
@@ -7423,7 +7464,7 @@ packages:
dependencies:
inherits: 2.0.4
level-errors: 1.0.5
- readable-stream: 1.1.14
+ readable-stream: 1.0.34
xtend: 4.0.2
dev: true
@@ -7477,7 +7518,7 @@ packages:
ltgt: 2.1.3
pull-defer: 0.2.3
pull-level: 2.0.4
- pull-stream: 3.7.0
+ pull-stream: 3.6.14
typewiselite: 1.0.0
xtend: 4.0.2
dev: true
@@ -7585,6 +7626,14 @@ packages:
path-exists: 3.0.0
dev: true
+ /locate-path@3.0.0:
+ resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-locate: 3.0.0
+ path-exists: 3.0.0
+ dev: true
+
/locate-path@5.0.0:
resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
engines: {node: '>=8'}
@@ -7631,6 +7680,13 @@ packages:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
dev: true
+ /log-symbols@3.0.0:
+ resolution: {integrity: sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ chalk: 2.4.2
+ dev: true
+
/log-symbols@4.1.0:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
@@ -7672,7 +7728,6 @@ packages:
/lowercase-keys@1.0.1:
resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
engines: {node: '>=0.10.0'}
- requiresBuild: true
dev: true
/lowercase-keys@2.0.0:
@@ -7752,7 +7807,6 @@ packages:
/media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/memdown@1.4.1:
@@ -7794,11 +7848,6 @@ packages:
/merge-descriptors@1.0.1:
resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
- requiresBuild: true
- dev: true
-
- /merge-stream@2.0.0:
- resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
dev: true
/merge2@1.4.1:
@@ -7834,7 +7883,6 @@ packages:
/methods@1.1.2:
resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/micromatch@3.1.10:
@@ -7890,23 +7938,11 @@ packages:
resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
engines: {node: '>=4'}
hasBin: true
- requiresBuild: true
- dev: true
-
- /mimic-fn@2.1.0:
- resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
- engines: {node: '>=6'}
- dev: true
-
- /mimic-fn@4.0.0:
- resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
- engines: {node: '>=12'}
dev: true
/mimic-response@1.0.1:
resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
engines: {node: '>=4'}
- requiresBuild: true
dev: true
/mimic-response@3.1.0:
@@ -7952,6 +7988,13 @@ packages:
brace-expansion: 2.0.1
dev: true
+ /minimatch@9.0.3:
+ resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
/minimist@1.2.6:
resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
dev: true
@@ -7962,7 +8005,6 @@ packages:
/minipass@2.9.0:
resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==}
- requiresBuild: true
dependencies:
safe-buffer: 5.2.1
yallist: 3.1.1
@@ -7970,7 +8012,6 @@ packages:
/minizlib@1.3.3:
resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==}
- requiresBuild: true
dependencies:
minipass: 2.9.0
dev: true
@@ -7987,11 +8028,17 @@ packages:
resolution: {integrity: sha512-Hepn5kb1lJPtVW84RFT40YG1OddBNTOVUZR2bzQUHc+Z03en8/3uX0+060JDhcEzyO08HmipsN9DcnFMxhIL9w==}
engines: {node: '>=4'}
deprecated: This package is broken and no longer maintained. 'mkdirp' itself supports promises now, please switch to that.
- requiresBuild: true
dependencies:
mkdirp: 1.0.4
dev: true
+ /mkdirp@0.5.5:
+ resolution: {integrity: sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
/mkdirp@0.5.6:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
@@ -8039,21 +8086,39 @@ packages:
yargs-unparser: 2.0.0
dev: true
- /mock-fs@4.12.0:
- resolution: {integrity: sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==}
- requiresBuild: true
+ /mocha@7.2.0:
+ resolution: {integrity: sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==}
+ engines: {node: '>= 8.10.0'}
+ hasBin: true
+ dependencies:
+ ansi-colors: 3.2.3
+ browser-stdout: 1.3.1
+ chokidar: 3.3.0
+ debug: 3.2.6(supports-color@6.0.0)
+ diff: 3.5.0
+ escape-string-regexp: 1.0.5
+ find-up: 3.0.0
+ glob: 7.1.3
+ growl: 1.10.5
+ he: 1.2.0
+ js-yaml: 3.13.1
+ log-symbols: 3.0.0
+ minimatch: 3.0.4
+ mkdirp: 0.5.5
+ ms: 2.1.1
+ node-environment-flags: 1.0.6
+ object.assign: 4.1.0
+ strip-json-comments: 2.0.1
+ supports-color: 6.0.0
+ which: 1.3.1
+ wide-align: 1.1.3
+ yargs: 13.3.2
+ yargs-parser: 13.1.2
+ yargs-unparser: 1.6.0
dev: true
- /mock-property@1.0.2:
- resolution: {integrity: sha512-GHVKHd3bFiXtvZtp23+8+EQLMeDJWcEVrSA2pOBs1KB5Uh2ww8Q+9fYDljS67k3GzU4DIDBa6+qRIgfZ2Bp+gQ==}
- engines: {node: '>= 0.4'}
- dependencies:
- define-data-property: 1.1.1
- functions-have-names: 1.2.3
- gopd: 1.0.1
- has: 1.0.3
- has-property-descriptors: 1.0.0
- isarray: 2.0.5
+ /mock-fs@4.12.0:
+ resolution: {integrity: sha512-/P/HtrlvBxY4o/PzXY9cCNBrdylDNxg7gnrv2sMNxj+UJ2m8jSpl0/A6fuJeNAWr99ZvGWH8XCbE0vmnM5KupQ==}
dev: true
/module-error@1.0.2:
@@ -8084,7 +8149,6 @@ packages:
/multibase@0.6.1:
resolution: {integrity: sha512-pFfAwyTjbbQgNc3G7D48JkJxWtoJoBMaR4xQUOuB8RnCgRqaYmWNFeJTTvrJ2w51bjLq2zTby6Rqj9TQ9elSUw==}
deprecated: This module has been superseded by the multiformats module
- requiresBuild: true
dependencies:
base-x: 3.0.9
buffer: 5.7.1
@@ -8093,7 +8157,6 @@ packages:
/multibase@0.7.0:
resolution: {integrity: sha512-TW8q03O0f6PNFTQDvh3xxH03c8CjGaaYrjkl9UQPG6rz53TQzzxJVCIWVjzcbN/Q5Y53Zd0IBQBMVktVgNx4Fg==}
deprecated: This module has been superseded by the multiformats module
- requiresBuild: true
dependencies:
base-x: 3.0.9
buffer: 5.7.1
@@ -8102,7 +8165,6 @@ packages:
/multicodec@0.5.7:
resolution: {integrity: sha512-PscoRxm3f+88fAtELwUnZxGDkduE2HD9Q6GHUOywQLjOGT/HAdhjLDYNZ1e7VR0s0TP0EwZ16LNUTFpoBGivOA==}
deprecated: This module has been superseded by the multiformats module
- requiresBuild: true
dependencies:
varint: 5.0.2
dev: true
@@ -8110,7 +8172,6 @@ packages:
/multicodec@1.0.4:
resolution: {integrity: sha512-NDd7FeS3QamVtbgfvu5h7fd1IlbaC4EQ0/pgU4zqE2vdHCmBGsUa0TiM8/TdSeG6BMPC92OOCf8F1ocE/Wkrrg==}
deprecated: This module has been superseded by the multiformats module
- requiresBuild: true
dependencies:
buffer: 5.7.1
varint: 5.0.2
@@ -8118,20 +8179,26 @@ packages:
/multihashes@0.4.21:
resolution: {integrity: sha512-uVSvmeCWf36pU2nB4/1kzYZjsXD9vofZKpgudqkceYY5g2aZZXJ5r9lxuzoRLl1OAp28XljXsEJ/X/85ZsKmKw==}
- requiresBuild: true
dependencies:
buffer: 5.7.1
multibase: 0.7.0
varint: 5.0.2
dev: true
+ /nan@2.13.2:
+ resolution: {integrity: sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==}
+ dev: true
+
+ /nan@2.16.0:
+ resolution: {integrity: sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==}
+ dev: true
+
/nano-base32@1.0.1:
resolution: {integrity: sha512-sxEtoTqAPdjWVGv71Q17koMFGsOMSiHsIFEvzOM7cNp8BXB4AnEwmDabm5dorusJf/v1z7QxaZYxUorU9RKaAw==}
dev: true
/nano-json-stream-parser@0.1.2:
resolution: {integrity: sha512-9MqxMH/BSJC7dnLsEMPyfN5Dvoo49IsPFYMcHw3Bcfc2kN0lpHRBSzlMSVx4HGyJ7s9B31CyBTVehWJoQ8Ctew==}
- requiresBuild: true
dev: true
/nanoid@3.3.3:
@@ -8170,7 +8237,6 @@ packages:
/negotiator@0.6.2:
resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/neo-async@2.6.2:
@@ -8207,6 +8273,13 @@ packages:
lodash: 4.17.21
dev: true
+ /node-environment-flags@1.0.6:
+ resolution: {integrity: sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==}
+ dependencies:
+ object.getownpropertydescriptors: 2.1.4
+ semver: 5.7.1
+ dev: true
+
/node-fetch@1.7.3:
resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==}
dependencies:
@@ -8259,7 +8332,7 @@ packages:
resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
dependencies:
hosted-git-info: 2.8.9
- resolve: 1.22.8
+ resolve: 1.22.1
semver: 5.7.1
validate-npm-package-license: 3.0.4
dev: true
@@ -8272,7 +8345,6 @@ packages:
/normalize-url@4.5.1:
resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
engines: {node: '>=8'}
- requiresBuild: true
dev: true
/normalize-url@6.1.0:
@@ -8280,20 +8352,6 @@ packages:
engines: {node: '>=10'}
dev: true
- /npm-run-path@4.0.1:
- resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
- engines: {node: '>=8'}
- dependencies:
- path-key: 3.1.1
- dev: true
-
- /npm-run-path@5.1.0:
- resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
- engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- dependencies:
- path-key: 4.0.0
- dev: true
-
/nth-check@2.1.1:
resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
dependencies:
@@ -8335,20 +8393,16 @@ packages:
resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
dev: true
- /object-inspect@1.12.3:
- resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
- dev: true
-
- /object-inspect@1.13.0:
- resolution: {integrity: sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==}
+ /object-inspect@1.13.1:
+ resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
dev: true
/object-is@1.1.5:
resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- define-properties: 1.1.4
+ call-bind: 1.0.5
+ define-properties: 1.2.1
dev: true
/object-keys@0.4.0:
@@ -8367,6 +8421,16 @@ packages:
isobject: 3.0.1
dev: true
+ /object.assign@4.1.0:
+ resolution: {integrity: sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.1.4
+ function-bind: 1.1.1
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+ dev: true
+
/object.assign@4.1.4:
resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
engines: {node: '>= 0.4'}
@@ -8377,15 +8441,14 @@ packages:
object-keys: 1.1.1
dev: true
- /object.getownpropertydescriptors@2.1.7:
- resolution: {integrity: sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==}
+ /object.getownpropertydescriptors@2.1.4:
+ resolution: {integrity: sha512-sccv3L/pMModT6dJAYF3fzGMVcb38ysQ0tEE6ixv2yXJDtEIPph268OlAdJj5/qZMZDq2g/jqvwppt36uS/uQQ==}
engines: {node: '>= 0.8'}
dependencies:
- array.prototype.reduce: 1.0.6
+ array.prototype.reduce: 1.0.4
call-bind: 1.0.2
- define-properties: 1.2.1
- es-abstract: 1.22.2
- safe-array-concat: 1.0.1
+ define-properties: 1.1.4
+ es-abstract: 1.20.3
dev: true
/object.pick@1.3.0:
@@ -8400,7 +8463,7 @@ packages:
dev: true
/oboe@2.1.4:
- resolution: {integrity: sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY=}
+ resolution: {integrity: sha512-ymBJ4xSC6GBXLT9Y7lirj+xbqBLa+jADGJldGEYG7u8sZbS9GyG+u1Xk9c5cbriKwSpCg41qUhPjvU5xOpvIyQ==}
requiresBuild: true
dependencies:
http-https: 1.0.0
@@ -8408,7 +8471,7 @@ packages:
optional: true
/oboe@2.1.5:
- resolution: {integrity: sha1-VVQoTFQ6ImbXo48X4HOCH73jk80=}
+ resolution: {integrity: sha512-zRFWiF+FoicxEs3jNI/WYUrVEgA7DeET/InK0XQuudGHRg8iIob3cNPrJTKaz4004uaA9Pbe+Dwa8iluhjLZWA==}
dependencies:
http-https: 1.0.0
dev: true
@@ -8416,7 +8479,6 @@ packages:
/on-finished@2.3.0:
resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==}
engines: {node: '>= 0.8'}
- requiresBuild: true
dependencies:
ee-first: 1.1.1
dev: true
@@ -8427,20 +8489,6 @@ packages:
wrappy: 1.0.2
dev: true
- /onetime@5.1.2:
- resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
- engines: {node: '>=6'}
- dependencies:
- mimic-fn: 2.1.0
- dev: true
-
- /onetime@6.0.0:
- resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
- engines: {node: '>=12'}
- dependencies:
- mimic-fn: 4.0.0
- dev: true
-
/open@7.4.2:
resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==}
engines: {node: '>=8'}
@@ -8449,16 +8497,6 @@ packages:
is-wsl: 2.2.0
dev: true
- /open@9.1.0:
- resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
- engines: {node: '>=14.16'}
- dependencies:
- default-browser: 4.0.0
- define-lazy-prop: 3.0.0
- is-inside-container: 1.0.0
- is-wsl: 2.2.0
- dev: true
-
/optionator@0.8.3:
resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
engines: {node: '>= 0.8.0'}
@@ -8503,13 +8541,11 @@ packages:
/p-cancelable@0.3.0:
resolution: {integrity: sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==}
engines: {node: '>=4'}
- requiresBuild: true
dev: true
/p-cancelable@1.1.0:
resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
engines: {node: '>=6'}
- requiresBuild: true
dev: true
/p-cancelable@3.0.0:
@@ -8520,7 +8556,6 @@ packages:
/p-finally@1.0.0:
resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
engines: {node: '>=4'}
- requiresBuild: true
dev: true
/p-limit@1.3.0:
@@ -8551,6 +8586,13 @@ packages:
p-limit: 1.3.0
dev: true
+ /p-locate@3.0.0:
+ resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-limit: 2.3.0
+ dev: true
+
/p-locate@4.1.0:
resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
engines: {node: '>=8'}
@@ -8575,7 +8617,6 @@ packages:
/p-timeout@1.2.1:
resolution: {integrity: sha512-gb0ryzr+K2qFqFv6qi3khoeqMZF/+ajxQipEF6NteZVnvz9tzdsfAVj3lYtn1gAXvH5lfLwfxEII799gt/mRIA==}
engines: {node: '>=4'}
- requiresBuild: true
dependencies:
p-finally: 1.0.0
dev: true
@@ -8615,7 +8656,6 @@ packages:
/parse-asn1@5.1.5:
resolution: {integrity: sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==}
- requiresBuild: true
dependencies:
asn1.js: 4.10.1
browserify-aes: 1.2.0
@@ -8666,7 +8706,6 @@ packages:
/parseurl@1.3.3:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
- requiresBuild: true
dev: true
/pascal-case@2.0.1:
@@ -8693,7 +8732,7 @@ packages:
fs-extra: 7.0.1
is-ci: 2.0.0
klaw-sync: 6.0.0
- minimist: 1.2.6
+ minimist: 1.2.8
rimraf: 2.7.1
semver: 5.7.1
slash: 2.0.0
@@ -8702,25 +8741,24 @@ packages:
- supports-color
dev: true
- /patch-package@6.5.1:
- resolution: {integrity: sha512-I/4Zsalfhc6bphmJTlrLoOcAF87jcxko4q0qsv4bGcurbr8IskEOtdnt9iCmsQVGL1B+iUhSQqweyTLJfCF9rA==}
- engines: {node: '>=10', npm: '>5'}
+ /patch-package@6.4.7:
+ resolution: {integrity: sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==}
+ engines: {npm: '>5'}
hasBin: true
dependencies:
'@yarnpkg/lockfile': 1.1.0
- chalk: 4.1.2
+ chalk: 2.4.2
cross-spawn: 6.0.5
find-yarn-workspace-root: 2.0.0
- fs-extra: 9.1.0
+ fs-extra: 7.0.1
is-ci: 2.0.0
klaw-sync: 6.0.0
- minimist: 1.2.6
+ minimist: 1.2.8
open: 7.4.2
rimraf: 2.7.1
semver: 5.7.1
slash: 2.0.0
tmp: 0.0.33
- yaml: 1.10.2
dev: true
/path-browserify@1.0.1:
@@ -8765,11 +8803,6 @@ packages:
engines: {node: '>=8'}
dev: true
- /path-key@4.0.0:
- resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
- engines: {node: '>=12'}
- dev: true
-
/path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
dev: true
@@ -8781,7 +8814,6 @@ packages:
/path-to-regexp@0.1.7:
resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
- requiresBuild: true
dev: true
/path-type@1.1.0:
@@ -8816,10 +8848,6 @@ packages:
resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
dev: true
- /picocolors@1.0.0:
- resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
- dev: true
-
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
@@ -8880,13 +8908,11 @@ packages:
/prepend-http@1.0.4:
resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==}
engines: {node: '>=0.10.0'}
- requiresBuild: true
dev: true
/prepend-http@2.0.0:
resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
engines: {node: '>=4'}
- requiresBuild: true
dev: true
/prettier-linter-helpers@1.0.0:
@@ -8896,29 +8922,29 @@ packages:
fast-diff: 1.2.0
dev: true
- /prettier-plugin-solidity@1.2.0(prettier@2.8.8):
- resolution: {integrity: sha512-fgxcUZpVAP+LlRfy5JI5oaAkXGkmsje2VJ5krv/YMm+rcTZbIUwFguSw5f+WFuttMjpDm6wB4UL7WVkArEfiVA==}
+ /prettier-plugin-solidity@1.3.1(prettier@2.8.8):
+ resolution: {integrity: sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==}
engines: {node: '>=16'}
peerDependencies:
prettier: '>=2.3.0'
dependencies:
- '@solidity-parser/parser': 0.16.2
+ '@solidity-parser/parser': 0.17.0
prettier: 2.8.8
semver: 7.5.4
- solidity-comments-extractor: 0.0.7
+ solidity-comments-extractor: 0.0.8
dev: true
optional: true
- /prettier-plugin-solidity@1.2.0(prettier@3.1.1):
- resolution: {integrity: sha512-fgxcUZpVAP+LlRfy5JI5oaAkXGkmsje2VJ5krv/YMm+rcTZbIUwFguSw5f+WFuttMjpDm6wB4UL7WVkArEfiVA==}
+ /prettier-plugin-solidity@1.3.1(prettier@3.2.5):
+ resolution: {integrity: sha512-MN4OP5I2gHAzHZG1wcuJl0FsLS3c4Cc5494bbg+6oQWBPuEamjwDvmGfFMZ6NFzsh3Efd9UUxeT7ImgjNH4ozA==}
engines: {node: '>=16'}
peerDependencies:
prettier: '>=2.3.0'
dependencies:
- '@solidity-parser/parser': 0.16.2
- prettier: 3.1.1
+ '@solidity-parser/parser': 0.17.0
+ prettier: 3.2.5
semver: 7.5.4
- solidity-comments-extractor: 0.0.7
+ solidity-comments-extractor: 0.0.8
dev: true
/prettier@2.8.8:
@@ -8927,8 +8953,8 @@ packages:
hasBin: true
dev: true
- /prettier@3.1.1:
- resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==}
+ /prettier@3.2.5:
+ resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==}
engines: {node: '>=14'}
hasBin: true
dev: true
@@ -8976,7 +9002,6 @@ packages:
/proxy-addr@2.0.5:
resolution: {integrity: sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==}
engines: {node: '>= 0.10'}
- requiresBuild: true
dependencies:
forwarded: 0.1.2
ipaddr.js: 1.9.0
@@ -9000,7 +9025,6 @@ packages:
/public-encrypt@4.0.3:
resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
- requiresBuild: true
dependencies:
bn.js: 4.12.0
browserify-rsa: 4.0.1
@@ -9025,7 +9049,7 @@ packages:
pull-cat: 1.1.11
pull-live: 1.0.1
pull-pushable: 2.2.0
- pull-stream: 3.7.0
+ pull-stream: 3.6.14
pull-window: 2.1.4
stream-to-pull-stream: 1.7.3
dev: true
@@ -9034,15 +9058,15 @@ packages:
resolution: {integrity: sha512-tkNz1QT5gId8aPhV5+dmwoIiA1nmfDOzJDlOOUpU5DNusj6neNd3EePybJ5+sITr2FwyCs/FVpx74YMCfc8YeA==}
dependencies:
pull-cat: 1.1.11
- pull-stream: 3.7.0
+ pull-stream: 3.6.14
dev: true
/pull-pushable@2.2.0:
resolution: {integrity: sha512-M7dp95enQ2kaHvfCt2+DJfyzgCSpWVR2h2kWYnVsW6ZpxQBx5wOu0QWOvQPVoPnBLUZYitYP2y7HyHkLQNeGXg==}
dev: true
- /pull-stream@3.7.0:
- resolution: {integrity: sha512-Eco+/R004UaCK2qEDE8vGklcTG2OeZSVm1kTUQNrykEjDwcFXDZhygFDsW49DbXyJMEhHeRL3z5cRVqPAhXlIw==}
+ /pull-stream@3.6.14:
+ resolution: {integrity: sha512-KIqdvpqHHaTUA2mCYcLG1ibEbu/LCKoJZsBWyv9lSYtPkJPBq8m3Hxa103xHi6D2thj5YXa0TqK3L3GUkwgnew==}
dev: true
/pull-window@2.1.4:
@@ -9053,7 +9077,6 @@ packages:
/pump@3.0.0:
resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
- requiresBuild: true
dependencies:
end-of-stream: 1.4.4
once: 1.4.0
@@ -9092,13 +9115,11 @@ packages:
/qs@6.7.0:
resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==}
engines: {node: '>=0.6'}
- requiresBuild: true
dev: true
/query-string@5.1.1:
resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==}
engines: {node: '>=0.10.0'}
- requiresBuild: true
dependencies:
decode-uri-component: 0.2.0
object-assign: 4.1.1
@@ -9106,7 +9127,7 @@ packages:
dev: true
/querystring@0.2.0:
- resolution: {integrity: sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=}
+ resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==}
engines: {node: '>=0.4.x'}
deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
dev: true
@@ -9128,7 +9149,6 @@ packages:
/randomfill@1.0.4:
resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
- requiresBuild: true
dependencies:
randombytes: 2.1.0
safe-buffer: 5.2.1
@@ -9137,13 +9157,11 @@ packages:
/range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/raw-body@2.4.0:
resolution: {integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==}
engines: {node: '>= 0.8'}
- requiresBuild: true
dependencies:
bytes: 3.1.0
http-errors: 1.7.2
@@ -9197,15 +9215,6 @@ packages:
string_decoder: 0.10.31
dev: true
- /readable-stream@1.1.14:
- resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
- dependencies:
- core-util-is: 1.0.3
- inherits: 2.0.4
- isarray: 0.0.1
- string_decoder: 0.10.31
- dev: true
-
/readable-stream@2.3.7:
resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==}
dependencies:
@@ -9227,6 +9236,13 @@ packages:
util-deprecate: 1.0.2
dev: true
+ /readdirp@3.2.0:
+ resolution: {integrity: sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==}
+ engines: {node: '>= 8'}
+ dependencies:
+ picomatch: 2.3.1
+ dev: true
+
/readdirp@3.6.0:
resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
engines: {node: '>=8.10.0'}
@@ -9238,7 +9254,7 @@ packages:
resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
engines: {node: '>= 0.10'}
dependencies:
- resolve: 1.22.8
+ resolve: 1.22.1
dev: true
/recursive-readdir@2.2.2:
@@ -9294,7 +9310,7 @@ packages:
resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
define-properties: 1.2.1
set-function-name: 2.0.1
dev: true
@@ -9363,6 +9379,29 @@ packages:
resolve-from: 3.0.0
dev: true
+ /request-promise-core@1.1.4(request@2.88.2):
+ resolution: {integrity: sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==}
+ engines: {node: '>=0.10.0'}
+ peerDependencies:
+ request: ^2.34
+ dependencies:
+ lodash: 4.17.21
+ request: 2.88.2
+ dev: true
+
+ /request-promise-native@1.0.9(request@2.88.2):
+ resolution: {integrity: sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==}
+ engines: {node: '>=0.12.0'}
+ deprecated: request-promise-native has been deprecated because it extends the now deprecated request package, see https://github.com/request/request/issues/3142
+ peerDependencies:
+ request: ^2.34
+ dependencies:
+ request: 2.88.2
+ request-promise-core: 1.1.4(request@2.88.2)
+ stealthy-require: 1.1.1
+ tough-cookie: 2.5.0
+ dev: true
+
/request@2.88.2:
resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
engines: {node: '>= 6'}
@@ -9409,6 +9448,10 @@ packages:
resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==}
dev: true
+ /require-main-filename@2.0.0:
+ resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+ dev: true
+
/resolve-alpn@1.2.1:
resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
dev: true
@@ -9438,18 +9481,17 @@ packages:
path-parse: 1.0.7
dev: true
- /resolve@1.22.8:
- resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ /resolve@1.22.1:
+ resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
hasBin: true
dependencies:
- is-core-module: 2.13.0
+ is-core-module: 2.10.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
dev: true
/responselike@1.0.2:
resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
- requiresBuild: true
dependencies:
lowercase-keys: 1.0.1
dev: true
@@ -9460,6 +9502,12 @@ packages:
lowercase-keys: 2.0.0
dev: true
+ /resumer@0.0.0:
+ resolution: {integrity: sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==}
+ dependencies:
+ through: 2.3.8
+ dev: true
+
/ret@0.1.15:
resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
engines: {node: '>=0.12'}
@@ -9513,13 +9561,6 @@ packages:
bn.js: 5.2.1
dev: true
- /run-applescript@5.0.0:
- resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
- engines: {node: '>=12'}
- dependencies:
- execa: 5.1.1
- dev: true
-
/run-parallel-limit@1.1.0:
resolution: {integrity: sha512-jJA7irRNM91jaKc3Hcl1npHsFLOXOoTkPCUL1JEa1R82O2miplXXRaGdjW/KM/98YQWDhJLiSs793CnXfblJUw==}
dependencies:
@@ -9538,8 +9579,8 @@ packages:
resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==}
engines: {node: '>=0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
has-symbols: 1.0.3
isarray: 2.0.5
dev: true
@@ -9612,6 +9653,21 @@ packages:
dev: true
optional: true
+ /secp256k1@3.7.1:
+ resolution: {integrity: sha512-1cf8sbnRreXrQFdH6qsg2H71Xw91fCCS9Yp021GnUNJzWJS/py96fS4lHbnTnouLp08Xj6jBoBB6V78Tdbdu5g==}
+ engines: {node: '>=4.0.0'}
+ requiresBuild: true
+ dependencies:
+ bindings: 1.5.0
+ bip66: 1.1.5
+ bn.js: 4.12.0
+ create-hash: 1.2.0
+ drbg.js: 1.0.1
+ elliptic: 6.5.4
+ nan: 2.16.0
+ safe-buffer: 5.2.1
+ dev: true
+
/secp256k1@4.0.3:
resolution: {integrity: sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==}
engines: {node: '>=10.0.0'}
@@ -9665,7 +9721,6 @@ packages:
/send@0.17.1:
resolution: {integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==}
engines: {node: '>= 0.8.0'}
- requiresBuild: true
dependencies:
debug: 2.6.9
depd: 1.1.2
@@ -9700,7 +9755,6 @@ packages:
/serve-static@1.14.1:
resolution: {integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==}
engines: {node: '>= 0.8.0'}
- requiresBuild: true
dependencies:
encodeurl: 1.0.2
escape-html: 1.0.3
@@ -9713,7 +9767,6 @@ packages:
/servify@0.1.12:
resolution: {integrity: sha512-/xE6GvsKKqyo1BAY+KxOWXcLpPsUUyji7Qg3bVD7hh1eRze5bR1uYiuDA/k3Gof1s9BTzQZEJK8sNcNGFIzeWw==}
engines: {node: '>=6'}
- requiresBuild: true
dependencies:
body-parser: 1.19.0
cors: 2.8.5
@@ -9728,6 +9781,16 @@ packages:
resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
dev: true
+ /set-function-length@1.1.1:
+ resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.1
+ get-intrinsic: 1.2.2
+ gopd: 1.0.1
+ has-property-descriptors: 1.0.0
+ dev: true
+
/set-function-name@2.0.1:
resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==}
engines: {node: '>= 0.4'}
@@ -9762,7 +9825,6 @@ packages:
/setprototypeof@1.1.1:
resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==}
- requiresBuild: true
dev: true
/setprototypeof@1.2.0:
@@ -9784,6 +9846,13 @@ packages:
crypt: 0.0.2
dev: true
+ /sha3@1.2.6:
+ resolution: {integrity: sha512-KgLGmJGrmNB4JWVsAV11Yk6KbvsAiygWJc7t5IebWva/0NukNrjJqhtKhzy3Eiv2AKuGvhZZt7dt1mDo7HkoiQ==}
+ requiresBuild: true
+ dependencies:
+ nan: 2.13.2
+ dev: true
+
/sha3@2.1.4:
resolution: {integrity: sha512-S8cNxbyb0UGUM2VhRD4Poe5N58gJnJsLJ5vC7FYWGUmGhcsj4++WaIOBFVDxlG0W3To6xBuiRh+i0Qp2oNCOtg==}
dependencies:
@@ -9818,8 +9887,8 @@ packages:
engines: {node: '>=8'}
dev: true
- /shelljs@0.8.5:
- resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==}
+ /shelljs@0.8.3:
+ resolution: {integrity: sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==}
engines: {node: '>=4'}
hasBin: true
dependencies:
@@ -9842,12 +9911,10 @@ packages:
/simple-concat@1.0.0:
resolution: {integrity: sha512-pgxq9iGMSS24atefsqEznXW1Te610qB4pwMdrEg6mxczHh7sPtPyiixkP/VaQic8JjZofnIvT7CDeKlHqfbPBg==}
- requiresBuild: true
dev: true
/simple-get@2.8.1:
resolution: {integrity: sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==}
- requiresBuild: true
dependencies:
decompress-response: 3.3.0
once: 1.4.0
@@ -9960,23 +10027,23 @@ packages:
- debug
dev: true
- /solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.2.0)(prettier@3.1.1):
+ /solhint-plugin-prettier@0.1.0(prettier-plugin-solidity@1.3.1)(prettier@3.2.5):
resolution: {integrity: sha512-SDOTSM6tZxZ6hamrzl3GUgzF77FM6jZplgL2plFBclj/OjKP8Z3eIPojKU73gRr0MvOS8ACZILn8a5g0VTz/Gw==}
peerDependencies:
prettier: ^3.0.0
prettier-plugin-solidity: ^1.0.0
dependencies:
- '@prettier/sync': 0.3.0(prettier@3.1.1)
- prettier: 3.1.1
+ '@prettier/sync': 0.3.0(prettier@3.2.5)
+ prettier: 3.2.5
prettier-linter-helpers: 1.0.0
- prettier-plugin-solidity: 1.2.0(prettier@3.1.1)
+ prettier-plugin-solidity: 1.3.1(prettier@3.2.5)
dev: true
- /solhint@4.0.0:
- resolution: {integrity: sha512-bFViMcFvhqVd/HK3Roo7xZXX5nbujS7Bxeg5vnZc9QvH0yCWCrQ38Yrn1pbAY9tlKROc6wFr+rK1mxYgYrjZgA==}
+ /solhint@4.1.1:
+ resolution: {integrity: sha512-7G4iF8H5hKHc0tR+/uyZesSKtfppFIMvPSW+Ku6MSL25oVRuyFeqNhOsXHfkex64wYJyXs4fe+pvhB069I19Tw==}
hasBin: true
dependencies:
- '@solidity-parser/parser': 0.16.0
+ '@solidity-parser/parser': 0.16.2
ajv: 6.12.6
antlr4: 4.13.0
ast-parents: 0.0.1
@@ -9998,8 +10065,8 @@ packages:
prettier: 2.8.8
dev: true
- /solidity-ast@0.4.52:
- resolution: {integrity: sha512-iOya9BSiB9jhM8Vf40n8lGELGzwrUc57rl5BhfNtJ5cvAaMvRcNlHeAMNvqJJyjoUnczqRbHqdivEqK89du3Cw==}
+ /solidity-ast@0.4.55:
+ resolution: {integrity: sha512-qeEU/r/K+V5lrAw8iswf2/yfWAnSGs3WKPHI+zAFKFjX0dIBVXEU/swQ8eJQYHf6PJWUZFO2uWV4V1wEOkeQbA==}
dependencies:
array.prototype.findlast: 1.2.3
dev: true
@@ -10022,8 +10089,8 @@ packages:
dev: true
optional: true
- /solidity-comments-extractor@0.0.7:
- resolution: {integrity: sha512-wciNMLg/Irp8OKGrh3S2tfvZiZ0NEyILfcRCXCD4mp7SgK/i9gzLfhY2hY7VMCQJ3kH9UB9BzNdibIVMchzyYw==}
+ /solidity-comments-extractor@0.0.8:
+ resolution: {integrity: sha512-htM7Vn6LhHreR+EglVMd2s+sZhcXAirB1Zlyrv5zBuTxieCvjfnRpd7iZk75m/u6NOlEyQ94C6TWbBn2cY7w8g==}
dev: true
/solidity-comments-freebsd-x64@0.0.2:
@@ -10139,7 +10206,7 @@ packages:
recursive-readdir: 2.2.2
sc-istanbul: 0.4.6
semver: 7.5.4
- shelljs: 0.8.5
+ shelljs: 0.8.3
web3-utils: 1.8.0
transitivePeerDependencies:
- supports-color
@@ -10273,7 +10340,6 @@ packages:
/statuses@1.5.0:
resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dev: true
/statuses@2.0.1:
@@ -10281,11 +10347,16 @@ packages:
engines: {node: '>= 0.8'}
dev: true
+ /stealthy-require@1.1.1:
+ resolution: {integrity: sha512-ZnWpYnYugiOVEY5GkcuJK1io5V8QmNYChG62gSit9pQVGErXtrKuPC55ITaVSukmMta5qpMU7vqLt2Lnni4f/g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
/stream-to-pull-stream@1.7.3:
resolution: {integrity: sha512-6sNyqJpr5dIOQdgNy/xcDWwDuzAsAwVzhzrWlAPAQ7Lkjx/rv0wgvxEyKwTq6FmNd5rjTrELt/CLmaSw7crMGg==}
dependencies:
looper: 3.0.0
- pull-stream: 3.7.0
+ pull-stream: 3.6.14
dev: true
/streamsearch@1.1.0:
@@ -10296,7 +10367,6 @@ packages:
/strict-uri-encode@1.1.0:
resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
engines: {node: '>=0.10.0'}
- requiresBuild: true
dev: true
/string-format@2.0.0:
@@ -10320,6 +10390,15 @@ packages:
strip-ansi: 4.0.0
dev: true
+ /string-width@3.1.0:
+ resolution: {integrity: sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==}
+ engines: {node: '>=6'}
+ dependencies:
+ emoji-regex: 7.0.3
+ is-fullwidth-code-point: 2.0.0
+ strip-ansi: 5.2.0
+ dev: true
+
/string-width@4.2.3:
resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
engines: {node: '>=8'}
@@ -10333,25 +10412,41 @@ packages:
resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-abstract: 1.22.3
+ dev: true
+
+ /string.prototype.trimend@1.0.5:
+ resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.3
dev: true
/string.prototype.trimend@1.0.7:
resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-abstract: 1.22.3
+ dev: true
+
+ /string.prototype.trimstart@1.0.5:
+ resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==}
+ dependencies:
+ call-bind: 1.0.2
+ define-properties: 1.1.4
+ es-abstract: 1.20.3
dev: true
/string.prototype.trimstart@1.0.7:
resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
define-properties: 1.2.1
- es-abstract: 1.22.2
+ es-abstract: 1.22.3
dev: true
/string_decoder@0.10.31:
@@ -10384,6 +10479,13 @@ packages:
ansi-regex: 3.0.1
dev: true
+ /strip-ansi@5.2.0:
+ resolution: {integrity: sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==}
+ engines: {node: '>=6'}
+ dependencies:
+ ansi-regex: 4.1.1
+ dev: true
+
/strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -10398,16 +10500,6 @@ packages:
is-utf8: 0.2.1
dev: true
- /strip-final-newline@2.0.0:
- resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
- engines: {node: '>=6'}
- dev: true
-
- /strip-final-newline@3.0.0:
- resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
- engines: {node: '>=12'}
- dev: true
-
/strip-hex-prefix@1.0.0:
resolution: {integrity: sha512-q8d4ue7JGEiVcypji1bALTos+0pWtyGlivAWyPuTkHzuTCJqrK9sWxYQZUq6Nq3cuyv3bm734IhHvHtGGURU6A==}
engines: {node: '>=6.5.0', npm: '>=3'}
@@ -10449,6 +10541,13 @@ packages:
has-flag: 3.0.0
dev: true
+ /supports-color@6.0.0:
+ resolution: {integrity: sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==}
+ engines: {node: '>=6'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: true
+
/supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -10510,11 +10609,11 @@ packages:
get-port: 3.2.0
dev: true
- /synckit@0.8.5:
- resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
+ /synckit@0.8.8:
+ resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==}
engines: {node: ^14.18.0 || >=16.0.0}
dependencies:
- '@pkgr/utils': 2.4.2
+ '@pkgr/core': 0.1.1
tslib: 2.6.2
dev: true
@@ -10539,15 +10638,13 @@ packages:
strip-ansi: 6.0.1
dev: true
- /tape@4.17.0:
- resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==}
+ /tape@4.16.1:
+ resolution: {integrity: sha512-U4DWOikL5gBYUrlzx+J0oaRedm2vKLFbtA/+BRAXboGWpXO7bMP8ddxlq3Cse2bvXFQ0jZMOj6kk3546mvCdFg==}
hasBin: true
dependencies:
- '@ljharb/resumer': 0.0.1
- '@ljharb/through': 2.3.11
- call-bind: 1.0.2
+ call-bind: 1.0.5
deep-equal: 1.1.1
- defined: 1.0.1
+ defined: 1.0.0
dotignore: 0.1.2
for-each: 0.3.3
glob: 7.2.3
@@ -10555,16 +10652,16 @@ packages:
inherits: 2.0.4
is-regex: 1.1.4
minimist: 1.2.8
- mock-property: 1.0.2
- object-inspect: 1.12.3
- resolve: 1.22.8
+ object-inspect: 1.12.2
+ resolve: 1.22.1
+ resumer: 0.0.0
string.prototype.trim: 1.2.8
+ through: 2.3.8
dev: true
/tar@4.4.19:
resolution: {integrity: sha512-a20gEsvHnWe0ygBY8JbxoM4w3SJdhc7ZAuxkLqh+nvNQN2IOt0B5lLgM490X5Hl8FF0dl0tOf2ewFYAlIFgzVA==}
engines: {node: '>=4.5'}
- requiresBuild: true
dependencies:
chownr: 1.1.4
fs-minipass: 1.2.7
@@ -10616,10 +10713,13 @@ packages:
xtend: 4.0.2
dev: true
+ /through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
+
/timed-out@4.0.1:
resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
engines: {node: '>=0.10.0'}
- requiresBuild: true
dev: true
/title-case@2.1.1:
@@ -10629,11 +10729,6 @@ packages:
upper-case: 1.1.3
dev: true
- /titleize@3.0.0:
- resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
- engines: {node: '>=12'}
- dev: true
-
/tmp@0.0.33:
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
engines: {node: '>=0.6.0'}
@@ -10663,7 +10758,6 @@ packages:
/to-readable-stream@1.0.0:
resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
engines: {node: '>=6'}
- requiresBuild: true
dev: true
/to-regex-range@2.1.1:
@@ -10694,7 +10788,6 @@ packages:
/toidentifier@1.0.0:
resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==}
engines: {node: '>=0.6'}
- requiresBuild: true
dev: true
/toidentifier@1.0.1:
@@ -10769,11 +10862,11 @@ packages:
glob: 7.2.3
mkdirp: 0.5.6
prettier: 2.8.8
- resolve: 1.22.8
+ resolve: 1.22.1
ts-essentials: 1.0.4
dev: true
- /ts-node@10.9.2(@types/node@16.18.68)(typescript@5.3.3):
+ /ts-node@10.9.2(@types/node@16.18.80)(typescript@5.3.3):
resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==}
hasBin: true
peerDependencies:
@@ -10792,7 +10885,7 @@ packages:
'@tsconfig/node12': 1.0.11
'@tsconfig/node14': 1.0.3
'@tsconfig/node16': 1.0.3
- '@types/node': 16.18.68
+ '@types/node': 16.18.80
acorn: 8.10.0
acorn-walk: 8.2.0
arg: 4.1.3
@@ -10870,7 +10963,6 @@ packages:
/type-is@1.6.18:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
- requiresBuild: true
dependencies:
media-typer: 0.3.0
mime-types: 2.1.27
@@ -10925,8 +11017,8 @@ packages:
resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
- get-intrinsic: 1.2.1
+ call-bind: 1.0.5
+ get-intrinsic: 1.2.2
is-typed-array: 1.1.12
dev: true
@@ -10934,7 +11026,7 @@ packages:
resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==}
engines: {node: '>= 0.4'}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
for-each: 0.3.3
has-proto: 1.0.1
is-typed-array: 1.1.12
@@ -10945,7 +11037,7 @@ packages:
engines: {node: '>= 0.4'}
dependencies:
available-typed-arrays: 1.0.5
- call-bind: 1.0.2
+ call-bind: 1.0.5
for-each: 0.3.3
has-proto: 1.0.1
is-typed-array: 1.1.12
@@ -10954,7 +11046,7 @@ packages:
/typed-array-length@1.0.4:
resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
for-each: 0.3.3
is-typed-array: 1.1.12
dev: true
@@ -11013,7 +11105,6 @@ packages:
/ultron@1.1.1:
resolution: {integrity: sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==}
- requiresBuild: true
dev: true
/unbox-primitive@1.0.2:
@@ -11080,11 +11171,6 @@ packages:
isobject: 3.0.1
dev: true
- /untildify@4.0.0:
- resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
- engines: {node: '>=8'}
- dev: true
-
/upper-case-first@1.1.2:
resolution: {integrity: sha512-wINKYvI3Db8dtjikdAqoBbZoP6Q+PZUyfMR7pmwHzjC2quzSkUq5DmPrTtPEqHaz8AGtmsB4TqwapMTM1QAQOQ==}
dependencies:
@@ -11109,7 +11195,6 @@ packages:
/url-parse-lax@1.0.0:
resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==}
engines: {node: '>=0.10.0'}
- requiresBuild: true
dependencies:
prepend-http: 1.0.4
dev: true
@@ -11117,20 +11202,17 @@ packages:
/url-parse-lax@3.0.0:
resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
engines: {node: '>=4'}
- requiresBuild: true
dependencies:
prepend-http: 2.0.0
dev: true
/url-set-query@1.0.0:
resolution: {integrity: sha512-3AChu4NiXquPfeckE5R5cGdiHCMWJx1dwCWOmWIL4KHAziJNOFIYJlpGFeKDvwLPHovZRCxK3cYlwzqI9Vp+Gg==}
- requiresBuild: true
dev: true
/url-to-options@1.0.1:
resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==}
engines: {node: '>= 4'}
- requiresBuild: true
dev: true
/url@0.11.0:
@@ -11161,16 +11243,14 @@ packages:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
dev: true
- /util.promisify@1.1.2:
- resolution: {integrity: sha512-PBdZ03m1kBnQ5cjjO0ZvJMJS+QsbyIcFwi4hY4U76OQsCO9JrOYjbCFgIF76ccFg9xnJo7ZHPkqyj1GqmdS7MA==}
+ /util.promisify@1.1.1:
+ resolution: {integrity: sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==}
dependencies:
- call-bind: 1.0.2
+ call-bind: 1.0.5
define-properties: 1.2.1
for-each: 0.3.3
- has-proto: 1.0.1
has-symbols: 1.0.3
- object.getownpropertydescriptors: 2.1.7
- safe-array-concat: 1.0.1
+ object.getownpropertydescriptors: 2.1.4
dev: true
/util@0.12.3:
@@ -11179,15 +11259,14 @@ packages:
inherits: 2.0.4
is-arguments: 1.0.4
is-generator-function: 1.0.8
- is-typed-array: 1.1.12
+ is-typed-array: 1.1.5
safe-buffer: 5.2.1
- which-typed-array: 1.1.11
+ which-typed-array: 1.1.4
dev: true
/utils-merge@1.0.1:
- resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=}
+ resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
engines: {node: '>= 0.4.0'}
- requiresBuild: true
dev: true
/uuid@2.0.1:
@@ -11225,13 +11304,11 @@ packages:
/varint@5.0.2:
resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==}
- requiresBuild: true
dev: true
/vary@1.1.2:
resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
engines: {node: '>= 0.8'}
- requiresBuild: true
dev: true
/verror@1.10.0:
@@ -11867,7 +11944,7 @@ packages:
ethereumjs-util: 5.2.1
ethereumjs-vm: 2.6.0
json-rpc-error: 2.0.0
- json-stable-stringify: 1.0.2
+ json-stable-stringify: 1.0.1
promise-to-callback: 1.0.0
readable-stream: 2.3.7
request: 2.88.2
@@ -12171,17 +12248,34 @@ packages:
resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==}
dev: true
- /which-typed-array@1.1.11:
- resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==}
+ /which-module@2.0.0:
+ resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==}
+ dev: true
+
+ /which-typed-array@1.1.13:
+ resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==}
engines: {node: '>= 0.4'}
dependencies:
available-typed-arrays: 1.0.5
- call-bind: 1.0.2
+ call-bind: 1.0.5
for-each: 0.3.3
gopd: 1.0.1
has-tostringtag: 1.0.0
dev: true
+ /which-typed-array@1.1.4:
+ resolution: {integrity: sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ available-typed-arrays: 1.0.5
+ call-bind: 1.0.5
+ es-abstract: 1.22.3
+ foreach: 2.0.5
+ function-bind: 1.1.2
+ has-symbols: 1.0.3
+ is-typed-array: 1.1.12
+ dev: true
+
/which@1.3.1:
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
hasBin: true
@@ -12197,6 +12291,12 @@ packages:
isexe: 2.0.0
dev: true
+ /wide-align@1.1.3:
+ resolution: {integrity: sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==}
+ dependencies:
+ string-width: 2.1.1
+ dev: true
+
/window-size@0.2.0:
resolution: {integrity: sha512-UD7d8HFA2+PZsbKyaOCEy8gMh1oDtHgJh1LfgjQ4zVXmYjAT/kvz3PueITKuqDiIXQe7yzpPnxX3lNc+AhQMyw==}
engines: {node: '>= 0.10.0'}
@@ -12232,6 +12332,15 @@ packages:
strip-ansi: 3.0.1
dev: true
+ /wrap-ansi@5.1.0:
+ resolution: {integrity: sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==}
+ engines: {node: '>=6'}
+ dependencies:
+ ansi-styles: 3.2.1
+ string-width: 3.1.0
+ strip-ansi: 5.2.0
+ dev: true
+
/wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
@@ -12247,7 +12356,6 @@ packages:
/ws@3.3.3:
resolution: {integrity: sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==}
- requiresBuild: true
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
@@ -12303,14 +12411,12 @@ packages:
/xhr-request-promise@0.1.2:
resolution: {integrity: sha512-yAQlCCNLwPgoGxw4k+IdRp1uZ7MZibS4kFw2boSUOesjnmvcxxj73j5a8KavE5Bzas++8P49OpJ4m8qjWGiDsA==}
- requiresBuild: true
dependencies:
xhr-request: 1.1.0
dev: true
/xhr-request@1.1.0:
resolution: {integrity: sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA==}
- requiresBuild: true
dependencies:
buffer-to-arraybuffer: 0.0.5
object-assign: 4.1.1
@@ -12357,6 +12463,10 @@ packages:
resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==}
dev: true
+ /y18n@4.0.3:
+ resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+ dev: true
+
/y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@@ -12375,9 +12485,11 @@ packages:
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
dev: true
- /yaml@1.10.2:
- resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
- engines: {node: '>= 6'}
+ /yargs-parser@13.1.2:
+ resolution: {integrity: sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==}
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
dev: true
/yargs-parser@2.4.1:
@@ -12392,6 +12504,15 @@ packages:
engines: {node: '>=10'}
dev: true
+ /yargs-unparser@1.6.0:
+ resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==}
+ engines: {node: '>=6'}
+ dependencies:
+ flat: 4.1.1
+ lodash: 4.17.21
+ yargs: 13.3.2
+ dev: true
+
/yargs-unparser@2.0.0:
resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
engines: {node: '>=10'}
@@ -12402,6 +12523,21 @@ packages:
is-plain-obj: 2.1.0
dev: true
+ /yargs@13.3.2:
+ resolution: {integrity: sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==}
+ dependencies:
+ cliui: 5.0.0
+ find-up: 3.0.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ require-main-filename: 2.0.0
+ set-blocking: 2.0.0
+ string-width: 3.1.0
+ which-module: 2.0.0
+ y18n: 4.0.3
+ yargs-parser: 13.1.2
+ dev: true
+
/yargs@16.2.0:
resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
engines: {node: '>=10'}
@@ -12453,8 +12589,8 @@ packages:
ethereumjs-util: 6.2.1
dev: true
- github.com/smartcontractkit/chainlink-solhint-rules/cfc50b32f95b730304a50deb2e27e88d87115874:
- resolution: {tarball: https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/cfc50b32f95b730304a50deb2e27e88d87115874}
+ github.com/smartcontractkit/chainlink-solhint-rules/1b4c0c2663fcd983589d4f33a2e73908624ed43c:
+ resolution: {tarball: https://codeload.github.com/smartcontractkit/chainlink-solhint-rules/tar.gz/1b4c0c2663fcd983589d4f33a2e73908624ed43c}
name: '@chainlink/solhint-plugin-chainlink-solidity'
version: 1.2.0
dev: true
diff --git a/contracts/scripts/native_solc_compile_all_llo-feeds b/contracts/scripts/native_solc_compile_all_llo-feeds
index 2caa6fb98de..eb17f93b0de 100755
--- a/contracts/scripts/native_solc_compile_all_llo-feeds
+++ b/contracts/scripts/native_solc_compile_all_llo-feeds
@@ -6,7 +6,7 @@ echo " ┌───────────────────────
echo " │ Compiling Low Latency Oracle contracts... │"
echo " └──────────────────────────────────────────────┘"
-SOLC_VERSION="0.8.16"
+SOLC_VERSION="0.8.19"
OPTIMIZE_RUNS=1000000
@@ -33,6 +33,12 @@ compileContract llo-feeds/VerifierProxy.sol
compileContract llo-feeds/FeeManager.sol
compileContract llo-feeds/RewardManager.sol
-#Test | Mocks
+
+# Test | Mocks
compileContract llo-feeds/test/mocks/ErroredVerifier.sol
-compileContract llo-feeds/test/mocks/ExposedVerifier.sol
\ No newline at end of file
+compileContract llo-feeds/test/mocks/ExposedVerifier.sol
+
+# LLO
+compileContract llo-feeds/dev/ChannelConfigStore.sol
+compileContract llo-feeds/dev/ChannelVerifier.sol
+compileContract llo-feeds/dev/test/mocks/ExposedChannelVerifier.sol
diff --git a/contracts/scripts/native_solc_compile_all_vrfv2plus b/contracts/scripts/native_solc_compile_all_vrfv2plus
new file mode 100755
index 00000000000..f25d851b5cd
--- /dev/null
+++ b/contracts/scripts/native_solc_compile_all_vrfv2plus
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+
+set -e
+
+echo " ┌──────────────────────────────────────────────┐"
+echo " │ Compiling VRF contracts... │"
+echo " └──────────────────────────────────────────────┘"
+
+SOLC_VERSION="0.8.6"
+OPTIMIZE_RUNS=1000000
+
+SCRIPTPATH="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )"
+ROOT="$( cd "$(dirname "$0")" >/dev/null 2>&1 ; cd ../../ && pwd -P )"
+python3 -m pip install --require-hashes -r "$SCRIPTPATH"/requirements.txt
+
+solc-select install $SOLC_VERSION
+solc-select use $SOLC_VERSION
+export SOLC_VERSION=$SOLC_VERSION
+
+compileContract () {
+ local contract
+ contract=$(basename "$1" ".sol")
+
+ solc @openzeppelin/="$ROOT"/contracts/node_modules/@openzeppelin/ --overwrite --optimize --optimize-runs $OPTIMIZE_RUNS --metadata-hash none \
+ -o "$ROOT"/contracts/solc/v$SOLC_VERSION/"$contract" \
+ --abi --bin --allow-paths "$ROOT"/contracts/src/v0.8,"$ROOT"/contracts/node_modules\
+ "$ROOT"/contracts/src/v0.8/"$1"
+}
+
+compileContractAltOpts () {
+ local contract
+ contract=$(basename "$1" ".sol")
+
+ solc @openzeppelin/="$ROOT"/contracts/node_modules/@openzeppelin/ --overwrite --optimize --optimize-runs "$2" --metadata-hash none \
+ -o "$ROOT"/contracts/solc/v$SOLC_VERSION/"$contract" \
+ --abi --bin --allow-paths "$ROOT"/contracts/src/v0.8,"$ROOT"/contracts/node_modules\
+ "$ROOT"/contracts/src/v0.8/"$1"
+}
+
+# VRF
+compileContract vrf/VRFRequestIDBase.sol
+compileContract vrf/VRFConsumerBase.sol
+compileContract vrf/testhelpers/VRFConsumer.sol
+compileContract vrf/testhelpers/VRFRequestIDBaseTestHelper.sol
+compileContract vrf/mocks/VRFCoordinatorMock.sol
+
+# VRF V2Plus
+compileContract vrf/dev/interfaces/IVRFCoordinatorV2PlusInternal.sol
+compileContract vrf/dev/testhelpers/VRFV2PlusConsumerExample.sol
+compileContractAltOpts vrf/dev/VRFCoordinatorV2_5.sol 50
+compileContract vrf/dev/BatchVRFCoordinatorV2Plus.sol
+compileContract vrf/dev/VRFV2PlusWrapper.sol
+compileContract vrf/dev/testhelpers/VRFConsumerV2PlusUpgradeableExample.sol
+compileContract vrf/dev/testhelpers/VRFMaliciousConsumerV2Plus.sol
+compileContract vrf/dev/testhelpers/VRFV2PlusExternalSubOwnerExample.sol
+compileContract vrf/dev/testhelpers/VRFV2PlusSingleConsumerExample.sol
+compileContract vrf/dev/testhelpers/VRFV2PlusWrapperConsumerExample.sol
+compileContract vrf/dev/testhelpers/VRFV2PlusRevertingExample.sol
+compileContract vrf/dev/testhelpers/VRFConsumerV2PlusUpgradeableExample.sol
+compileContract vrf/dev/testhelpers/VRFV2PlusMaliciousMigrator.sol
+compileContract vrf/dev/libraries/VRFV2PlusClient.sol
+compileContract vrf/dev/testhelpers/VRFCoordinatorV2Plus_V2Example.sol
+compileContract vrf/dev/BlockhashStore.sol
+compileContract vrf/dev/TrustedBlockhashStore.sol
+compileContract vrf/dev/testhelpers/VRFV2PlusLoadTestWithMetrics.sol
+compileContractAltOpts vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol 5
+compileContract vrf/dev/testhelpers/VRFV2PlusWrapperLoadTestConsumer.sol
diff --git a/contracts/src/v0.8/automation/dev/chains/ArbitrumModule.sol b/contracts/src/v0.8/automation/dev/chains/ArbitrumModule.sol
new file mode 100644
index 00000000000..62e9ff9ea1c
--- /dev/null
+++ b/contracts/src/v0.8/automation/dev/chains/ArbitrumModule.sol
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.19;
+
+import {ArbSys} from "../../../vendor/@arbitrum/nitro-contracts/src/precompiles/ArbSys.sol";
+import {ArbGasInfo} from "../../../vendor/@arbitrum/nitro-contracts/src/precompiles/ArbGasInfo.sol";
+import {ChainModuleBase} from "./ChainModuleBase.sol";
+
+contract ArbitrumModule is ChainModuleBase {
+ /// @dev ARB_SYS_ADDR is the address of the ArbSys precompile on Arbitrum.
+ /// @dev reference: https://github.com/OffchainLabs/nitro/blob/v2.0.14/contracts/src/precompiles/ArbSys.sol#L10
+ address private constant ARB_SYS_ADDR = 0x0000000000000000000000000000000000000064;
+ ArbSys private constant ARB_SYS = ArbSys(ARB_SYS_ADDR);
+
+ /// @dev ARB_GAS_ADDR is the address of the ArbGasInfo precompile on Arbitrum.
+ /// @dev reference: https://github.com/OffchainLabs/nitro/blob/v2.0.14/contracts/src/precompiles/ArbGasInfo.sol#L10
+ address private constant ARB_GAS_ADDR = 0x000000000000000000000000000000000000006C;
+ ArbGasInfo private constant ARB_GAS = ArbGasInfo(ARB_GAS_ADDR);
+
+ function blockHash(uint256 n) external view override returns (bytes32) {
+ uint256 blockNum = ARB_SYS.arbBlockNumber();
+ if (n >= blockNum || blockNum - n > 256) {
+ return "";
+ }
+ return ARB_SYS.arbBlockHash(n);
+ }
+
+ function blockNumber() external view override returns (uint256) {
+ return ARB_SYS.arbBlockNumber();
+ }
+
+ function getCurrentL1Fee() external view override returns (uint256) {
+ return ARB_GAS.getCurrentTxL1GasFees();
+ }
+
+ function getMaxL1Fee(uint256 dataSize) external view override returns (uint256) {
+ (, uint256 perL1CalldataUnit, , , , ) = ARB_GAS.getPricesInWei();
+ return perL1CalldataUnit * dataSize * 16;
+ }
+}
diff --git a/contracts/src/v0.8/automation/dev/chains/ChainModuleBase.sol b/contracts/src/v0.8/automation/dev/chains/ChainModuleBase.sol
new file mode 100644
index 00000000000..f8685e651f4
--- /dev/null
+++ b/contracts/src/v0.8/automation/dev/chains/ChainModuleBase.sol
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.19;
+
+import {IChainModule} from "../interfaces/v2_2/IChainModule.sol";
+
+contract ChainModuleBase is IChainModule {
+ function blockNumber() external view virtual returns (uint256) {
+ return block.number;
+ }
+
+ function blockHash(uint256 n) external view virtual returns (bytes32) {
+ if (n >= block.number || block.number - n > 256) {
+ return "";
+ }
+ return blockhash(n);
+ }
+
+ function getCurrentL1Fee() external view virtual returns (uint256) {
+ return 0;
+ }
+
+ function getMaxL1Fee(uint256) external view virtual returns (uint256) {
+ return 0;
+ }
+}
diff --git a/contracts/src/v0.8/automation/dev/chains/OptimismModule.sol b/contracts/src/v0.8/automation/dev/chains/OptimismModule.sol
new file mode 100644
index 00000000000..7f26440c154
--- /dev/null
+++ b/contracts/src/v0.8/automation/dev/chains/OptimismModule.sol
@@ -0,0 +1,26 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.19;
+
+import {OVM_GasPriceOracle} from "../../../vendor/@eth-optimism/contracts/v0.8.9/contracts/L2/predeploys/OVM_GasPriceOracle.sol";
+import {ChainModuleBase} from "./ChainModuleBase.sol";
+
+contract OptimismModule is ChainModuleBase {
+ /// @dev OP_L1_DATA_FEE_PADDING includes 35 bytes for L1 data padding for Optimism and BASE
+ bytes private constant OP_L1_DATA_FEE_PADDING =
+ hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ /// @dev OVM_GASPRICEORACLE_ADDR is the address of the OVM_GasPriceOracle precompile on Optimism.
+ /// @dev reference: https://community.optimism.io/docs/developers/build/transaction-fees/#estimating-the-l1-data-fee
+ address private constant OVM_GASPRICEORACLE_ADDR = 0x420000000000000000000000000000000000000F;
+ OVM_GasPriceOracle private constant OVM_GASPRICEORACLE = OVM_GasPriceOracle(OVM_GASPRICEORACLE_ADDR);
+
+ function getCurrentL1Fee() external view override returns (uint256) {
+ return OVM_GASPRICEORACLE.getL1Fee(bytes.concat(msg.data, OP_L1_DATA_FEE_PADDING));
+ }
+
+ function getMaxL1Fee(uint256 dataSize) external view override returns (uint256) {
+ // fee is 4 per 0 byte, 16 per non-zero byte. Worst case we can have all non zero-bytes.
+ // Instead of setting bytes to non-zero, we initialize 'new bytes' of length 4*dataSize to cover for zero bytes.
+ bytes memory txCallData = new bytes(4 * dataSize);
+ return OVM_GASPRICEORACLE.getL1Fee(bytes.concat(txCallData, OP_L1_DATA_FEE_PADDING));
+ }
+}
diff --git a/contracts/src/v0.8/automation/dev/chains/ScrollModule.sol b/contracts/src/v0.8/automation/dev/chains/ScrollModule.sol
new file mode 100644
index 00000000000..a2f585dd381
--- /dev/null
+++ b/contracts/src/v0.8/automation/dev/chains/ScrollModule.sol
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity 0.8.19;
+
+import {IScrollL1GasPriceOracle} from "../../../vendor/@scroll-tech/contracts/src/L2/predeploys/IScrollL1GasPriceOracle.sol";
+import {ChainModuleBase} from "./ChainModuleBase.sol";
+
+contract ScrollModule is ChainModuleBase {
+ /// @dev SCROLL_L1_FEE_DATA_PADDING includes 120 bytes for L1 data padding for Optimism
+ /// @dev according to testing, this padding allows automation registry to properly estimates L1 data fee with 3-5% buffer
+ /// @dev this MAY NOT work for a different product and this may get out of date if transmit function is changed
+ bytes private constant SCROLL_L1_FEE_DATA_PADDING =
+ hex"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+ /// @dev SCROLL_ORACLE_ADDR is the address of the L1GasPriceOracle precompile on Optimism.
+ /// @dev reference: https://docs.scroll.io/en/developers/transaction-fees-on-scroll/#estimating-the-l1-data-fee
+ address private constant SCROLL_ORACLE_ADDR = 0x5300000000000000000000000000000000000002;
+ IScrollL1GasPriceOracle private constant SCROLL_ORACLE = IScrollL1GasPriceOracle(SCROLL_ORACLE_ADDR);
+
+ function getCurrentL1Fee() external view override returns (uint256) {
+ return SCROLL_ORACLE.getL1Fee(bytes.concat(msg.data, SCROLL_L1_FEE_DATA_PADDING));
+ }
+
+ function getMaxL1Fee(uint256 dataSize) external view override returns (uint256) {
+ // fee is 4 per 0 byte, 16 per non-zero byte. Worst case we can have all non zero-bytes.
+ // Instead of setting bytes to non-zero, we initialize 'new bytes' of length 4*dataSize to cover for zero bytes.
+ // this is the same as OP.
+ bytes memory txCallData = new bytes(4 * dataSize);
+ return SCROLL_ORACLE.getL1Fee(bytes.concat(txCallData, SCROLL_L1_FEE_DATA_PADDING));
+ }
+}
diff --git a/contracts/src/v0.8/automation/dev/interfaces/v2_2/IAutomationRegistryMaster.sol b/contracts/src/v0.8/automation/dev/interfaces/v2_2/IAutomationRegistryMaster.sol
index e67622a3779..2c0d8f05297 100644
--- a/contracts/src/v0.8/automation/dev/interfaces/v2_2/IAutomationRegistryMaster.sol
+++ b/contracts/src/v0.8/automation/dev/interfaces/v2_2/IAutomationRegistryMaster.sol
@@ -1,4 +1,4 @@
-// abi-checksum: 0x0ed34e4b36bd7b4a5447152c2d61491e6ba7ed944b11e4dfef4fea184708975e
+// abi-checksum: 0x71da69c27646c421cbde8ef39597eb47197351f8c89dee37447b35d8ad1d572e
// SPDX-License-Identifier: MIT
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.6.6. SEE SOURCE BELOW. !!
pragma solidity ^0.8.4;
@@ -58,6 +58,7 @@ interface IAutomationRegistryMaster {
error ValueNotChanged();
event AdminPrivilegeConfigSet(address indexed admin, bytes privilegeConfig);
event CancelledUpkeepReport(uint256 indexed id, bytes trigger);
+ event ChainSpecificModuleUpdated(address newModule);
event ConfigSet(
uint32 previousConfigBlockNumber,
bytes32 configDigest,
@@ -208,9 +209,11 @@ interface IAutomationRegistryMaster {
function acceptUpkeepAdmin(uint256 id) external;
function getActiveUpkeepIDs(uint256 startIndex, uint256 maxCount) external view returns (uint256[] memory);
function getAdminPrivilegeConfig(address admin) external view returns (bytes memory);
+ function getAllowedReadOnlyAddress() external view returns (address);
function getAutomationForwarderLogic() external view returns (address);
function getBalance(uint256 id) external view returns (uint96 balance);
function getCancellationDelay() external pure returns (uint256);
+ function getChainModule() external view returns (address chainModule);
function getConditionalGasOverhead() external pure returns (uint256);
function getFastGasFeedAddress() external view returns (address);
function getForwarder(uint256 upkeepID) external view returns (address);
@@ -220,17 +223,17 @@ interface IAutomationRegistryMaster {
function getMaxPaymentForGas(uint8 triggerType, uint32 gasLimit) external view returns (uint96 maxPayment);
function getMinBalance(uint256 id) external view returns (uint96);
function getMinBalanceForUpkeep(uint256 id) external view returns (uint96 minBalance);
- function getMode() external view returns (uint8);
function getPeerRegistryMigrationPermission(address peer) external view returns (uint8);
function getPerPerformByteGasOverhead() external pure returns (uint256);
function getPerSignerGasOverhead() external pure returns (uint256);
+ function getReorgProtectionEnabled() external view returns (bool reorgProtectionEnabled);
function getSignerInfo(address query) external view returns (bool active, uint8 index);
function getState()
external
view
returns (
AutomationRegistryBase2_2.State memory state,
- AutomationRegistryBase2_2.OnchainConfig memory config,
+ AutomationRegistryBase2_2.OnchainConfigLegacy memory config,
address[] memory signers,
address[] memory transmitters,
uint8 f
@@ -247,6 +250,7 @@ interface IAutomationRegistryMaster {
function pauseUpkeep(uint256 id) external;
function recoverFunds() external;
function setAdminPrivilegeConfig(address admin, bytes memory newPrivilegeConfig) external;
+ function setChainSpecificModule(address newModule) external;
function setPayees(address[] memory payees) external;
function setPeerRegistryMigrationPermission(address peer, uint8 permission) external;
function setUpkeepCheckData(uint256 id, bytes memory newCheckData) external;
@@ -281,6 +285,7 @@ interface AutomationRegistryBase2_2 {
address transcoder;
address[] registrars;
address upkeepPrivilegeManager;
+ address chainModule;
bool reorgProtectionEnabled;
}
@@ -297,6 +302,24 @@ interface AutomationRegistryBase2_2 {
bool paused;
}
+ struct OnchainConfigLegacy {
+ uint32 paymentPremiumPPB;
+ uint32 flatFeeMicroLink;
+ uint32 checkGasLimit;
+ uint24 stalenessSeconds;
+ uint16 gasCeilingMultiplier;
+ uint96 minUpkeepSpend;
+ uint32 maxPerformGas;
+ uint32 maxCheckDataSize;
+ uint32 maxPerformDataSize;
+ uint32 maxRevertDataSize;
+ uint256 fallbackGasPrice;
+ uint256 fallbackLinkPrice;
+ address transcoder;
+ address[] registrars;
+ address upkeepPrivilegeManager;
+ }
+
struct UpkeepInfo {
address target;
uint32 performGas;
@@ -313,5 +336,5 @@ interface AutomationRegistryBase2_2 {
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
-[{"inputs":[{"internalType":"contract AutomationRegistryLogicB2_2","name":"logicA","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayHasNoEntries","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"CheckDataExceedsLimit","type":"error"},{"inputs":[],"name":"ConfigDigestMismatch","type":"error"},{"inputs":[],"name":"DuplicateEntry","type":"error"},{"inputs":[],"name":"DuplicateSigners","type":"error"},{"inputs":[],"name":"GasLimitCanOnlyIncrease","type":"error"},{"inputs":[],"name":"GasLimitOutsideRange","type":"error"},{"inputs":[],"name":"IncorrectNumberOfFaultyOracles","type":"error"},{"inputs":[],"name":"IncorrectNumberOfSignatures","type":"error"},{"inputs":[],"name":"IncorrectNumberOfSigners","type":"error"},{"inputs":[],"name":"IndexOutOfRange","type":"error"},{"inputs":[],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InvalidDataLength","type":"error"},{"inputs":[],"name":"InvalidPayee","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidReport","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[],"name":"InvalidTransmitter","type":"error"},{"inputs":[],"name":"InvalidTrigger","type":"error"},{"inputs":[],"name":"InvalidTriggerType","type":"error"},{"inputs":[],"name":"MaxCheckDataSizeCanOnlyIncrease","type":"error"},{"inputs":[],"name":"MaxPerformDataSizeCanOnlyIncrease","type":"error"},{"inputs":[],"name":"MigrationNotPermitted","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"OnlyActiveSigners","type":"error"},{"inputs":[],"name":"OnlyActiveTransmitters","type":"error"},{"inputs":[],"name":"OnlyCallableByAdmin","type":"error"},{"inputs":[],"name":"OnlyCallableByLINKToken","type":"error"},{"inputs":[],"name":"OnlyCallableByOwnerOrAdmin","type":"error"},{"inputs":[],"name":"OnlyCallableByOwnerOrRegistrar","type":"error"},{"inputs":[],"name":"OnlyCallableByPayee","type":"error"},{"inputs":[],"name":"OnlyCallableByProposedAdmin","type":"error"},{"inputs":[],"name":"OnlyCallableByProposedPayee","type":"error"},{"inputs":[],"name":"OnlyCallableByUpkeepPrivilegeManager","type":"error"},{"inputs":[],"name":"OnlyPausedUpkeep","type":"error"},{"inputs":[],"name":"OnlySimulatedBackend","type":"error"},{"inputs":[],"name":"OnlyUnpausedUpkeep","type":"error"},{"inputs":[],"name":"ParameterLengthError","type":"error"},{"inputs":[],"name":"PaymentGreaterThanAllLINK","type":"error"},{"inputs":[],"name":"ReentrantCall","type":"error"},{"inputs":[],"name":"RegistryPaused","type":"error"},{"inputs":[],"name":"RepeatedSigner","type":"error"},{"inputs":[],"name":"RepeatedTransmitter","type":"error"},{"inputs":[{"internalType":"bytes","name":"reason","type":"bytes"}],"name":"TargetCheckReverted","type":"error"},{"inputs":[],"name":"TooManyOracles","type":"error"},{"inputs":[],"name":"TranscoderNotSet","type":"error"},{"inputs":[],"name":"UpkeepAlreadyExists","type":"error"},{"inputs":[],"name":"UpkeepCancelled","type":"error"},{"inputs":[],"name":"UpkeepNotCanceled","type":"error"},{"inputs":[],"name":"UpkeepNotNeeded","type":"error"},{"inputs":[],"name":"ValueNotChanged","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"bytes","name":"privilegeConfig","type":"bytes"}],"name":"AdminPrivilegeConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"CancelledUpkeepReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"previousConfigBlockNumber","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"configDigest","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"configCount","type":"uint64"},{"indexed":false,"internalType":"address[]","name":"signers","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"transmitters","type":"address[]"},{"indexed":false,"internalType":"uint8","name":"f","type":"uint8"},{"indexed":false,"internalType":"bytes","name":"onchainConfig","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"offchainConfigVersion","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"ConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"dedupKey","type":"bytes32"}],"name":"DedupKeyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint96","name":"amount","type":"uint96"}],"name":"FundsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"FundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"InsufficientFundsUpkeepReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"amount","type":"uint96"}],"name":"OwnerFundsWithdrawn","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"transmitters","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"payees","type":"address[]"}],"name":"PayeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"PayeeshipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"PayeeshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"payee","type":"address"}],"name":"PaymentWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"ReorgedUpkeepReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"StaleUpkeepReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"configDigest","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"epoch","type":"uint32"}],"name":"Transmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"UpkeepAdminTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"UpkeepAdminTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint64","name":"atBlockHeight","type":"uint64"}],"name":"UpkeepCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newCheckData","type":"bytes"}],"name":"UpkeepCheckDataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint96","name":"gasLimit","type":"uint96"}],"name":"UpkeepGasLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remainingBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"destination","type":"address"}],"name":"UpkeepMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"UpkeepOffchainConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"UpkeepPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint96","name":"totalPayment","type":"uint96"},{"indexed":false,"internalType":"uint256","name":"gasUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasOverhead","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"UpkeepPerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"privilegeConfig","type":"bytes"}],"name":"UpkeepPrivilegeConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startingBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"importedFrom","type":"address"}],"name":"UpkeepReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"performGas","type":"uint32"},{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"UpkeepRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"triggerConfig","type":"bytes"}],"name":"UpkeepTriggerConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"UpkeepUnpaused","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fallbackTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestConfigDetails","outputs":[{"internalType":"uint32","name":"configCount","type":"uint32"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32","name":"configDigest","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestConfigDigestAndEpoch","outputs":[{"internalType":"bool","name":"scanLogs","type":"bool"},{"internalType":"bytes32","name":"configDigest","type":"bytes32"},{"internalType":"uint32","name":"epoch","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"address[]","name":"transmitters","type":"address[]"},{"internalType":"uint8","name":"f","type":"uint8"},{"internalType":"bytes","name":"onchainConfigBytes","type":"bytes"},{"internalType":"uint64","name":"offchainConfigVersion","type":"uint64"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"address[]","name":"transmitters","type":"address[]"},{"internalType":"uint8","name":"f","type":"uint8"},{"components":[{"internalType":"uint32","name":"paymentPremiumPPB","type":"uint32"},{"internalType":"uint32","name":"flatFeeMicroLink","type":"uint32"},{"internalType":"uint32","name":"checkGasLimit","type":"uint32"},{"internalType":"uint24","name":"stalenessSeconds","type":"uint24"},{"internalType":"uint16","name":"gasCeilingMultiplier","type":"uint16"},{"internalType":"uint96","name":"minUpkeepSpend","type":"uint96"},{"internalType":"uint32","name":"maxPerformGas","type":"uint32"},{"internalType":"uint32","name":"maxCheckDataSize","type":"uint32"},{"internalType":"uint32","name":"maxPerformDataSize","type":"uint32"},{"internalType":"uint32","name":"maxRevertDataSize","type":"uint32"},{"internalType":"uint256","name":"fallbackGasPrice","type":"uint256"},{"internalType":"uint256","name":"fallbackLinkPrice","type":"uint256"},{"internalType":"address","name":"transcoder","type":"address"},{"internalType":"address[]","name":"registrars","type":"address[]"},{"internalType":"address","name":"upkeepPrivilegeManager","type":"address"},{"internalType":"bool","name":"reorgProtectionEnabled","type":"bool"}],"internalType":"struct AutomationRegistryBase2_2.OnchainConfig","name":"onchainConfig","type":"tuple"},{"internalType":"uint64","name":"offchainConfigVersion","type":"uint64"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"setConfigTypeSafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"performData","type":"bytes"}],"name":"simulatePerformUpkeep","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"view","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":"rawReport","type":"bytes"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"},{"internalType":"bytes32","name":"rawVs","type":"bytes32"}],"name":"transmit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract AutomationRegistryLogicB2_2","name":"logicB","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"addFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"cancelUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes[]","name":"values","type":"bytes[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"checkCallback","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"},{"internalType":"enum AutomationRegistryBase2_2.UpkeepFailureReason","name":"upkeepFailureReason","type":"uint8"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"triggerData","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"},{"internalType":"enum AutomationRegistryBase2_2.UpkeepFailureReason","name":"upkeepFailureReason","type":"uint8"},{"internalType":"uint256","name":"gasUsed","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"fastGasWei","type":"uint256"},{"internalType":"uint256","name":"linkNative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"},{"internalType":"enum AutomationRegistryBase2_2.UpkeepFailureReason","name":"upkeepFailureReason","type":"uint8"},{"internalType":"uint256","name":"gasUsed","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"fastGasWei","type":"uint256"},{"internalType":"uint256","name":"linkNative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"executeCallback","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"},{"internalType":"enum AutomationRegistryBase2_2.UpkeepFailureReason","name":"upkeepFailureReason","type":"uint8"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"destination","type":"address"}],"name":"migrateUpkeeps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedUpkeeps","type":"bytes"}],"name":"receiveUpkeeps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"enum AutomationRegistryBase2_2.Trigger","name":"triggerType","type":"uint8"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"bytes","name":"triggerConfig","type":"bytes"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"registerUpkeep","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"registerUpkeep","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"triggerConfig","type":"bytes"}],"name":"setUpkeepTriggerConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum AutomationRegistryBase2_2.Mode","name":"mode","type":"uint8"},{"internalType":"address","name":"link","type":"address"},{"internalType":"address","name":"linkNativeFeed","type":"address"},{"internalType":"address","name":"fastGasFeed","type":"address"},{"internalType":"address","name":"automationForwarderLogic","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"transmitter","type":"address"}],"name":"acceptPayeeship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"acceptUpkeepAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"name":"getActiveUpkeepIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"getAdminPrivilegeConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutomationForwarderLogic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getBalance","outputs":[{"internalType":"uint96","name":"balance","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCancellationDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getConditionalGasOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getFastGasFeedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepID","type":"uint256"}],"name":"getForwarder","outputs":[{"internalType":"contract IAutomationForwarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLinkNativeFeedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLogGasOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"enum AutomationRegistryBase2_2.Trigger","name":"triggerType","type":"uint8"},{"internalType":"uint32","name":"gasLimit","type":"uint32"}],"name":"getMaxPaymentForGas","outputs":[{"internalType":"uint96","name":"maxPayment","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMinBalance","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMinBalanceForUpkeep","outputs":[{"internalType":"uint96","name":"minBalance","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMode","outputs":[{"internalType":"enum AutomationRegistryBase2_2.Mode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"peer","type":"address"}],"name":"getPeerRegistryMigrationPermission","outputs":[{"internalType":"enum AutomationRegistryBase2_2.MigrationPermission","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPerPerformByteGasOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getPerSignerGasOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"query","type":"address"}],"name":"getSignerInfo","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint8","name":"index","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"components":[{"internalType":"uint32","name":"nonce","type":"uint32"},{"internalType":"uint96","name":"ownerLinkBalance","type":"uint96"},{"internalType":"uint256","name":"expectedLinkBalance","type":"uint256"},{"internalType":"uint96","name":"totalPremium","type":"uint96"},{"internalType":"uint256","name":"numUpkeeps","type":"uint256"},{"internalType":"uint32","name":"configCount","type":"uint32"},{"internalType":"uint32","name":"latestConfigBlockNumber","type":"uint32"},{"internalType":"bytes32","name":"latestConfigDigest","type":"bytes32"},{"internalType":"uint32","name":"latestEpoch","type":"uint32"},{"internalType":"bool","name":"paused","type":"bool"}],"internalType":"struct AutomationRegistryBase2_2.State","name":"state","type":"tuple"},{"components":[{"internalType":"uint32","name":"paymentPremiumPPB","type":"uint32"},{"internalType":"uint32","name":"flatFeeMicroLink","type":"uint32"},{"internalType":"uint32","name":"checkGasLimit","type":"uint32"},{"internalType":"uint24","name":"stalenessSeconds","type":"uint24"},{"internalType":"uint16","name":"gasCeilingMultiplier","type":"uint16"},{"internalType":"uint96","name":"minUpkeepSpend","type":"uint96"},{"internalType":"uint32","name":"maxPerformGas","type":"uint32"},{"internalType":"uint32","name":"maxCheckDataSize","type":"uint32"},{"internalType":"uint32","name":"maxPerformDataSize","type":"uint32"},{"internalType":"uint32","name":"maxRevertDataSize","type":"uint32"},{"internalType":"uint256","name":"fallbackGasPrice","type":"uint256"},{"internalType":"uint256","name":"fallbackLinkPrice","type":"uint256"},{"internalType":"address","name":"transcoder","type":"address"},{"internalType":"address[]","name":"registrars","type":"address[]"},{"internalType":"address","name":"upkeepPrivilegeManager","type":"address"},{"internalType":"bool","name":"reorgProtectionEnabled","type":"bool"}],"internalType":"struct AutomationRegistryBase2_2.OnchainConfig","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"address[]","name":"transmitters","type":"address[]"},{"internalType":"uint8","name":"f","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"query","type":"address"}],"name":"getTransmitterInfo","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint8","name":"index","type":"uint8"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"uint96","name":"lastCollected","type":"uint96"},{"internalType":"address","name":"payee","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepId","type":"uint256"}],"name":"getTriggerType","outputs":[{"internalType":"enum AutomationRegistryBase2_2.Trigger","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getUpkeep","outputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint32","name":"performGas","type":"uint32"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint64","name":"maxValidBlocknumber","type":"uint64"},{"internalType":"uint32","name":"lastPerformedBlockNumber","type":"uint32"},{"internalType":"uint96","name":"amountSpent","type":"uint96"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"internalType":"struct AutomationRegistryBase2_2.UpkeepInfo","name":"upkeepInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepId","type":"uint256"}],"name":"getUpkeepPrivilegeConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepId","type":"uint256"}],"name":"getUpkeepTriggerConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"dedupKey","type":"bytes32"}],"name":"hasDedupKey","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"pauseUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes","name":"newPrivilegeConfig","type":"bytes"}],"name":"setAdminPrivilegeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"}],"name":"setPayees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"peer","type":"address"},{"internalType":"enum AutomationRegistryBase2_2.MigrationPermission","name":"permission","type":"uint8"}],"name":"setPeerRegistryMigrationPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"newCheckData","type":"bytes"}],"name":"setUpkeepCheckData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint32","name":"gasLimit","type":"uint32"}],"name":"setUpkeepGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"config","type":"bytes"}],"name":"setUpkeepOffchainConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepId","type":"uint256"},{"internalType":"bytes","name":"newPrivilegeConfig","type":"bytes"}],"name":"setUpkeepPrivilegeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"transmitter","type":"address"},{"internalType":"address","name":"proposed","type":"address"}],"name":"transferPayeeship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposed","type":"address"}],"name":"transferUpkeepAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"unpauseUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upkeepTranscoderVersion","outputs":[{"internalType":"enum UpkeepFormat","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"upkeepVersion","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawOwnerFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawPayment","outputs":[],"stateMutability":"nonpayable","type":"function"}]
+[{"inputs":[{"internalType":"contract AutomationRegistryLogicB2_2","name":"logicA","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArrayHasNoEntries","type":"error"},{"inputs":[],"name":"CannotCancel","type":"error"},{"inputs":[],"name":"CheckDataExceedsLimit","type":"error"},{"inputs":[],"name":"ConfigDigestMismatch","type":"error"},{"inputs":[],"name":"DuplicateEntry","type":"error"},{"inputs":[],"name":"DuplicateSigners","type":"error"},{"inputs":[],"name":"GasLimitCanOnlyIncrease","type":"error"},{"inputs":[],"name":"GasLimitOutsideRange","type":"error"},{"inputs":[],"name":"IncorrectNumberOfFaultyOracles","type":"error"},{"inputs":[],"name":"IncorrectNumberOfSignatures","type":"error"},{"inputs":[],"name":"IncorrectNumberOfSigners","type":"error"},{"inputs":[],"name":"IndexOutOfRange","type":"error"},{"inputs":[],"name":"InsufficientFunds","type":"error"},{"inputs":[],"name":"InvalidDataLength","type":"error"},{"inputs":[],"name":"InvalidPayee","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidReport","type":"error"},{"inputs":[],"name":"InvalidSigner","type":"error"},{"inputs":[],"name":"InvalidTransmitter","type":"error"},{"inputs":[],"name":"InvalidTrigger","type":"error"},{"inputs":[],"name":"InvalidTriggerType","type":"error"},{"inputs":[],"name":"MaxCheckDataSizeCanOnlyIncrease","type":"error"},{"inputs":[],"name":"MaxPerformDataSizeCanOnlyIncrease","type":"error"},{"inputs":[],"name":"MigrationNotPermitted","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"OnlyActiveSigners","type":"error"},{"inputs":[],"name":"OnlyActiveTransmitters","type":"error"},{"inputs":[],"name":"OnlyCallableByAdmin","type":"error"},{"inputs":[],"name":"OnlyCallableByLINKToken","type":"error"},{"inputs":[],"name":"OnlyCallableByOwnerOrAdmin","type":"error"},{"inputs":[],"name":"OnlyCallableByOwnerOrRegistrar","type":"error"},{"inputs":[],"name":"OnlyCallableByPayee","type":"error"},{"inputs":[],"name":"OnlyCallableByProposedAdmin","type":"error"},{"inputs":[],"name":"OnlyCallableByProposedPayee","type":"error"},{"inputs":[],"name":"OnlyCallableByUpkeepPrivilegeManager","type":"error"},{"inputs":[],"name":"OnlyPausedUpkeep","type":"error"},{"inputs":[],"name":"OnlySimulatedBackend","type":"error"},{"inputs":[],"name":"OnlyUnpausedUpkeep","type":"error"},{"inputs":[],"name":"ParameterLengthError","type":"error"},{"inputs":[],"name":"PaymentGreaterThanAllLINK","type":"error"},{"inputs":[],"name":"ReentrantCall","type":"error"},{"inputs":[],"name":"RegistryPaused","type":"error"},{"inputs":[],"name":"RepeatedSigner","type":"error"},{"inputs":[],"name":"RepeatedTransmitter","type":"error"},{"inputs":[{"internalType":"bytes","name":"reason","type":"bytes"}],"name":"TargetCheckReverted","type":"error"},{"inputs":[],"name":"TooManyOracles","type":"error"},{"inputs":[],"name":"TranscoderNotSet","type":"error"},{"inputs":[],"name":"UpkeepAlreadyExists","type":"error"},{"inputs":[],"name":"UpkeepCancelled","type":"error"},{"inputs":[],"name":"UpkeepNotCanceled","type":"error"},{"inputs":[],"name":"UpkeepNotNeeded","type":"error"},{"inputs":[],"name":"ValueNotChanged","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"bytes","name":"privilegeConfig","type":"bytes"}],"name":"AdminPrivilegeConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"CancelledUpkeepReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newModule","type":"address"}],"name":"ChainSpecificModuleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"previousConfigBlockNumber","type":"uint32"},{"indexed":false,"internalType":"bytes32","name":"configDigest","type":"bytes32"},{"indexed":false,"internalType":"uint64","name":"configCount","type":"uint64"},{"indexed":false,"internalType":"address[]","name":"signers","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"transmitters","type":"address[]"},{"indexed":false,"internalType":"uint8","name":"f","type":"uint8"},{"indexed":false,"internalType":"bytes","name":"onchainConfig","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"offchainConfigVersion","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"ConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"dedupKey","type":"bytes32"}],"name":"DedupKeyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint96","name":"amount","type":"uint96"}],"name":"FundsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"FundsWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"InsufficientFundsUpkeepReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint96","name":"amount","type":"uint96"}],"name":"OwnerFundsWithdrawn","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"transmitters","type":"address[]"},{"indexed":false,"internalType":"address[]","name":"payees","type":"address[]"}],"name":"PayeesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"PayeeshipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"PayeeshipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"transmitter","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"address","name":"payee","type":"address"}],"name":"PaymentWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"ReorgedUpkeepReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"StaleUpkeepReport","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"configDigest","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"epoch","type":"uint32"}],"name":"Transmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"UpkeepAdminTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"UpkeepAdminTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint64","name":"atBlockHeight","type":"uint64"}],"name":"UpkeepCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newCheckData","type":"bytes"}],"name":"UpkeepCheckDataSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint96","name":"gasLimit","type":"uint96"}],"name":"UpkeepGasLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remainingBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"destination","type":"address"}],"name":"UpkeepMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"UpkeepOffchainConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"UpkeepPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"bool","name":"success","type":"bool"},{"indexed":false,"internalType":"uint96","name":"totalPayment","type":"uint96"},{"indexed":false,"internalType":"uint256","name":"gasUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"gasOverhead","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"trigger","type":"bytes"}],"name":"UpkeepPerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"privilegeConfig","type":"bytes"}],"name":"UpkeepPrivilegeConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startingBalance","type":"uint256"},{"indexed":false,"internalType":"address","name":"importedFrom","type":"address"}],"name":"UpkeepReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"performGas","type":"uint32"},{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"UpkeepRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"triggerConfig","type":"bytes"}],"name":"UpkeepTriggerConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"UpkeepUnpaused","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fallbackTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestConfigDetails","outputs":[{"internalType":"uint32","name":"configCount","type":"uint32"},{"internalType":"uint32","name":"blockNumber","type":"uint32"},{"internalType":"bytes32","name":"configDigest","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestConfigDigestAndEpoch","outputs":[{"internalType":"bool","name":"scanLogs","type":"bool"},{"internalType":"bytes32","name":"configDigest","type":"bytes32"},{"internalType":"uint32","name":"epoch","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"address[]","name":"transmitters","type":"address[]"},{"internalType":"uint8","name":"f","type":"uint8"},{"internalType":"bytes","name":"onchainConfigBytes","type":"bytes"},{"internalType":"uint64","name":"offchainConfigVersion","type":"uint64"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"address[]","name":"transmitters","type":"address[]"},{"internalType":"uint8","name":"f","type":"uint8"},{"components":[{"internalType":"uint32","name":"paymentPremiumPPB","type":"uint32"},{"internalType":"uint32","name":"flatFeeMicroLink","type":"uint32"},{"internalType":"uint32","name":"checkGasLimit","type":"uint32"},{"internalType":"uint24","name":"stalenessSeconds","type":"uint24"},{"internalType":"uint16","name":"gasCeilingMultiplier","type":"uint16"},{"internalType":"uint96","name":"minUpkeepSpend","type":"uint96"},{"internalType":"uint32","name":"maxPerformGas","type":"uint32"},{"internalType":"uint32","name":"maxCheckDataSize","type":"uint32"},{"internalType":"uint32","name":"maxPerformDataSize","type":"uint32"},{"internalType":"uint32","name":"maxRevertDataSize","type":"uint32"},{"internalType":"uint256","name":"fallbackGasPrice","type":"uint256"},{"internalType":"uint256","name":"fallbackLinkPrice","type":"uint256"},{"internalType":"address","name":"transcoder","type":"address"},{"internalType":"address[]","name":"registrars","type":"address[]"},{"internalType":"address","name":"upkeepPrivilegeManager","type":"address"},{"internalType":"contract IChainModule","name":"chainModule","type":"address"},{"internalType":"bool","name":"reorgProtectionEnabled","type":"bool"}],"internalType":"struct AutomationRegistryBase2_2.OnchainConfig","name":"onchainConfig","type":"tuple"},{"internalType":"uint64","name":"offchainConfigVersion","type":"uint64"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"setConfigTypeSafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"performData","type":"bytes"}],"name":"simulatePerformUpkeep","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"view","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":"rawReport","type":"bytes"},{"internalType":"bytes32[]","name":"rs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"ss","type":"bytes32[]"},{"internalType":"bytes32","name":"rawVs","type":"bytes32"}],"name":"transmit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract AutomationRegistryLogicB2_2","name":"logicB","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint96","name":"amount","type":"uint96"}],"name":"addFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"cancelUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes[]","name":"values","type":"bytes[]"},{"internalType":"bytes","name":"extraData","type":"bytes"}],"name":"checkCallback","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"},{"internalType":"enum AutomationRegistryBase2_2.UpkeepFailureReason","name":"upkeepFailureReason","type":"uint8"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"triggerData","type":"bytes"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"},{"internalType":"enum AutomationRegistryBase2_2.UpkeepFailureReason","name":"upkeepFailureReason","type":"uint8"},{"internalType":"uint256","name":"gasUsed","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"fastGasWei","type":"uint256"},{"internalType":"uint256","name":"linkNative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"checkUpkeep","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"},{"internalType":"enum AutomationRegistryBase2_2.UpkeepFailureReason","name":"upkeepFailureReason","type":"uint8"},{"internalType":"uint256","name":"gasUsed","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"fastGasWei","type":"uint256"},{"internalType":"uint256","name":"linkNative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"payload","type":"bytes"}],"name":"executeCallback","outputs":[{"internalType":"bool","name":"upkeepNeeded","type":"bool"},{"internalType":"bytes","name":"performData","type":"bytes"},{"internalType":"enum AutomationRegistryBase2_2.UpkeepFailureReason","name":"upkeepFailureReason","type":"uint8"},{"internalType":"uint256","name":"gasUsed","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"destination","type":"address"}],"name":"migrateUpkeeps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedUpkeeps","type":"bytes"}],"name":"receiveUpkeeps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"enum AutomationRegistryBase2_2.Trigger","name":"triggerType","type":"uint8"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"bytes","name":"triggerConfig","type":"bytes"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"registerUpkeep","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint32","name":"gasLimit","type":"uint32"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"name":"registerUpkeep","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"triggerConfig","type":"bytes"}],"name":"setUpkeepTriggerConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"link","type":"address"},{"internalType":"address","name":"linkNativeFeed","type":"address"},{"internalType":"address","name":"fastGasFeed","type":"address"},{"internalType":"address","name":"automationForwarderLogic","type":"address"},{"internalType":"address","name":"allowedReadOnlyAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"transmitter","type":"address"}],"name":"acceptPayeeship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"acceptUpkeepAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"name":"getActiveUpkeepIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"getAdminPrivilegeConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllowedReadOnlyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAutomationForwarderLogic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getBalance","outputs":[{"internalType":"uint96","name":"balance","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCancellationDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getChainModule","outputs":[{"internalType":"contract IChainModule","name":"chainModule","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConditionalGasOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getFastGasFeedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepID","type":"uint256"}],"name":"getForwarder","outputs":[{"internalType":"contract IAutomationForwarder","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLinkAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLinkNativeFeedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLogGasOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"enum AutomationRegistryBase2_2.Trigger","name":"triggerType","type":"uint8"},{"internalType":"uint32","name":"gasLimit","type":"uint32"}],"name":"getMaxPaymentForGas","outputs":[{"internalType":"uint96","name":"maxPayment","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMinBalance","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMinBalanceForUpkeep","outputs":[{"internalType":"uint96","name":"minBalance","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"peer","type":"address"}],"name":"getPeerRegistryMigrationPermission","outputs":[{"internalType":"enum AutomationRegistryBase2_2.MigrationPermission","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPerPerformByteGasOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getPerSignerGasOverhead","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getReorgProtectionEnabled","outputs":[{"internalType":"bool","name":"reorgProtectionEnabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"query","type":"address"}],"name":"getSignerInfo","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint8","name":"index","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getState","outputs":[{"components":[{"internalType":"uint32","name":"nonce","type":"uint32"},{"internalType":"uint96","name":"ownerLinkBalance","type":"uint96"},{"internalType":"uint256","name":"expectedLinkBalance","type":"uint256"},{"internalType":"uint96","name":"totalPremium","type":"uint96"},{"internalType":"uint256","name":"numUpkeeps","type":"uint256"},{"internalType":"uint32","name":"configCount","type":"uint32"},{"internalType":"uint32","name":"latestConfigBlockNumber","type":"uint32"},{"internalType":"bytes32","name":"latestConfigDigest","type":"bytes32"},{"internalType":"uint32","name":"latestEpoch","type":"uint32"},{"internalType":"bool","name":"paused","type":"bool"}],"internalType":"struct AutomationRegistryBase2_2.State","name":"state","type":"tuple"},{"components":[{"internalType":"uint32","name":"paymentPremiumPPB","type":"uint32"},{"internalType":"uint32","name":"flatFeeMicroLink","type":"uint32"},{"internalType":"uint32","name":"checkGasLimit","type":"uint32"},{"internalType":"uint24","name":"stalenessSeconds","type":"uint24"},{"internalType":"uint16","name":"gasCeilingMultiplier","type":"uint16"},{"internalType":"uint96","name":"minUpkeepSpend","type":"uint96"},{"internalType":"uint32","name":"maxPerformGas","type":"uint32"},{"internalType":"uint32","name":"maxCheckDataSize","type":"uint32"},{"internalType":"uint32","name":"maxPerformDataSize","type":"uint32"},{"internalType":"uint32","name":"maxRevertDataSize","type":"uint32"},{"internalType":"uint256","name":"fallbackGasPrice","type":"uint256"},{"internalType":"uint256","name":"fallbackLinkPrice","type":"uint256"},{"internalType":"address","name":"transcoder","type":"address"},{"internalType":"address[]","name":"registrars","type":"address[]"},{"internalType":"address","name":"upkeepPrivilegeManager","type":"address"}],"internalType":"struct AutomationRegistryBase2_2.OnchainConfigLegacy","name":"config","type":"tuple"},{"internalType":"address[]","name":"signers","type":"address[]"},{"internalType":"address[]","name":"transmitters","type":"address[]"},{"internalType":"uint8","name":"f","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"query","type":"address"}],"name":"getTransmitterInfo","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint8","name":"index","type":"uint8"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"uint96","name":"lastCollected","type":"uint96"},{"internalType":"address","name":"payee","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepId","type":"uint256"}],"name":"getTriggerType","outputs":[{"internalType":"enum AutomationRegistryBase2_2.Trigger","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getUpkeep","outputs":[{"components":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint32","name":"performGas","type":"uint32"},{"internalType":"bytes","name":"checkData","type":"bytes"},{"internalType":"uint96","name":"balance","type":"uint96"},{"internalType":"address","name":"admin","type":"address"},{"internalType":"uint64","name":"maxValidBlocknumber","type":"uint64"},{"internalType":"uint32","name":"lastPerformedBlockNumber","type":"uint32"},{"internalType":"uint96","name":"amountSpent","type":"uint96"},{"internalType":"bool","name":"paused","type":"bool"},{"internalType":"bytes","name":"offchainConfig","type":"bytes"}],"internalType":"struct AutomationRegistryBase2_2.UpkeepInfo","name":"upkeepInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepId","type":"uint256"}],"name":"getUpkeepPrivilegeConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepId","type":"uint256"}],"name":"getUpkeepTriggerConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"dedupKey","type":"bytes32"}],"name":"hasDedupKey","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"pauseUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoverFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"bytes","name":"newPrivilegeConfig","type":"bytes"}],"name":"setAdminPrivilegeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IChainModule","name":"newModule","type":"address"}],"name":"setChainSpecificModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"payees","type":"address[]"}],"name":"setPayees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"peer","type":"address"},{"internalType":"enum AutomationRegistryBase2_2.MigrationPermission","name":"permission","type":"uint8"}],"name":"setPeerRegistryMigrationPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"newCheckData","type":"bytes"}],"name":"setUpkeepCheckData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint32","name":"gasLimit","type":"uint32"}],"name":"setUpkeepGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"config","type":"bytes"}],"name":"setUpkeepOffchainConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"upkeepId","type":"uint256"},{"internalType":"bytes","name":"newPrivilegeConfig","type":"bytes"}],"name":"setUpkeepPrivilegeConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"transmitter","type":"address"},{"internalType":"address","name":"proposed","type":"address"}],"name":"transferPayeeship","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposed","type":"address"}],"name":"transferUpkeepAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"unpauseUpkeep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upkeepTranscoderVersion","outputs":[{"internalType":"enum UpkeepFormat","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"upkeepVersion","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawOwnerFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawPayment","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
diff --git a/contracts/src/v0.8/automation/dev/interfaces/v2_2/IChainModule.sol b/contracts/src/v0.8/automation/dev/interfaces/v2_2/IChainModule.sol
new file mode 100644
index 00000000000..dd5613fbf36
--- /dev/null
+++ b/contracts/src/v0.8/automation/dev/interfaces/v2_2/IChainModule.sol
@@ -0,0 +1,19 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.0;
+
+interface IChainModule {
+ // retrieve the native block number of a chain. e.g. L2 block number on Arbitrum
+ function blockNumber() external view returns (uint256);
+
+ // retrieve the native block hash of a chain.
+ function blockHash(uint256) external view returns (bytes32);
+
+ // retrieve the L1 data fee for a L2 transaction. it should return 0 for L1 chains and
+ // L2 chains which don't have L1 fee component. it uses msg.data to estimate L1 data so
+ // it must be used with a transaction.
+ function getCurrentL1Fee() external view returns (uint256);
+
+ // retrieve the L1 data fee for a L2 simulation. it should return 0 for L1 chains and
+ // L2 chains which don't have L1 fee component.
+ function getMaxL1Fee(uint256 dataSize) external view returns (uint256);
+}
diff --git a/contracts/src/v0.8/automation/dev/test/AutomationRegistry2_2.t.sol b/contracts/src/v0.8/automation/dev/test/AutomationRegistry2_2.t.sol
index 2bf62159ebd..6b05e4f6465 100644
--- a/contracts/src/v0.8/automation/dev/test/AutomationRegistry2_2.t.sol
+++ b/contracts/src/v0.8/automation/dev/test/AutomationRegistry2_2.t.sol
@@ -8,11 +8,13 @@ import {AutomationRegistryBase2_2} from "../v2_2/AutomationRegistryBase2_2.sol";
import {AutomationRegistryLogicA2_2} from "../v2_2/AutomationRegistryLogicA2_2.sol";
import {AutomationRegistryLogicB2_2} from "../v2_2/AutomationRegistryLogicB2_2.sol";
import {IAutomationRegistryMaster} from "../interfaces/v2_2/IAutomationRegistryMaster.sol";
+import {ChainModuleBase} from "../chains/ChainModuleBase.sol";
contract AutomationRegistry2_2_SetUp is BaseTest {
address internal constant LINK_ETH_FEED = 0x1111111111111111111111111111111111111110;
address internal constant FAST_GAS_FEED = 0x1111111111111111111111111111111111111112;
address internal constant LINK_TOKEN = 0x1111111111111111111111111111111111111113;
+ address internal constant ZERO_ADDRESS = address(0);
// Signer private keys used for these test
uint256 internal constant PRIVATE0 = 0x7b2e97fe057e6de99d6872a2ef2abf52c9b4469bc848c2465ac3fcd8d336e81d;
@@ -27,6 +29,8 @@ contract AutomationRegistry2_2_SetUp is BaseTest {
address[] internal s_valid_transmitters;
address[] internal s_registrars;
+ IAutomationRegistryMaster internal registryMaster;
+
function setUp() public override {
s_valid_transmitters = new address[](4);
for (uint160 i = 0; i < 4; ++i) {
@@ -41,37 +45,43 @@ contract AutomationRegistry2_2_SetUp is BaseTest {
s_registrars = new address[](1);
s_registrars[0] = 0x3a0eDE26aa188BFE00b9A0C9A431A1a0CA5f7966;
- }
- function deployRegistry2_2(AutomationRegistryBase2_2.Mode mode) public returns (IAutomationRegistryMaster) {
AutomationForwarderLogic forwarderLogic = new AutomationForwarderLogic();
AutomationRegistryLogicB2_2 logicB2_2 = new AutomationRegistryLogicB2_2(
- mode,
LINK_TOKEN,
LINK_ETH_FEED,
FAST_GAS_FEED,
- address(forwarderLogic)
+ address(forwarderLogic),
+ ZERO_ADDRESS
);
AutomationRegistryLogicA2_2 logicA2_2 = new AutomationRegistryLogicA2_2(logicB2_2);
- IAutomationRegistryMaster registry2_2 = IAutomationRegistryMaster(
+ registryMaster = IAutomationRegistryMaster(
address(new AutomationRegistry2_2(AutomationRegistryLogicB2_2(address(logicA2_2))))
);
- return registry2_2;
}
}
contract AutomationRegistry2_2_LatestConfigDetails is AutomationRegistry2_2_SetUp {
function testGet() public {
- IAutomationRegistryMaster registry = IAutomationRegistryMaster(
- address(deployRegistry2_2(AutomationRegistryBase2_2.Mode(0)))
- );
- (uint32 configCount, uint32 blockNumber, bytes32 configDigest) = registry.latestConfigDetails();
+ (uint32 configCount, uint32 blockNumber, bytes32 configDigest) = registryMaster.latestConfigDetails();
assertEq(configCount, 0);
assertEq(blockNumber, 0);
assertEq(configDigest, "");
}
}
+contract AutomationRegistry2_2_CheckUpkeep is AutomationRegistry2_2_SetUp {
+ function testPreventExecutionOnCheckUpkeep() public {
+ uint256 id = 1;
+ bytes memory triggerData = abi.encodePacked("trigger_data");
+
+ // The tx.origin is the DEFAULT_SENDER (0x1804c8AB1F12E6bbf3894d4083f33e07309d1f38) of foundry
+ // Expecting a revert since the tx.origin is not address(0)
+ vm.expectRevert(abi.encodeWithSelector(IAutomationRegistryMaster.OnlySimulatedBackend.selector));
+ registryMaster.checkUpkeep(id, triggerData);
+ }
+}
+
contract AutomationRegistry2_2_SetConfig is AutomationRegistry2_2_SetUp {
event ConfigSet(
uint32 previousConfigBlockNumber,
@@ -86,11 +96,9 @@ contract AutomationRegistry2_2_SetConfig is AutomationRegistry2_2_SetUp {
);
function testSetConfigSuccess() public {
- IAutomationRegistryMaster registry = IAutomationRegistryMaster(
- address(deployRegistry2_2(AutomationRegistryBase2_2.Mode(0)))
- );
- (uint32 configCount, , ) = registry.latestConfigDetails();
+ (uint32 configCount, , ) = registryMaster.latestConfigDetails();
assertEq(configCount, 0);
+ ChainModuleBase module = new ChainModuleBase();
AutomationRegistryBase2_2.OnchainConfig memory cfg = AutomationRegistryBase2_2.OnchainConfig({
paymentPremiumPPB: 10_000,
@@ -108,6 +116,7 @@ contract AutomationRegistry2_2_SetConfig is AutomationRegistry2_2_SetUp {
transcoder: 0xB1e66855FD67f6e85F0f0fA38cd6fBABdf00923c,
registrars: s_registrars,
upkeepPrivilegeManager: 0xD9c855F08A7e460691F41bBDDe6eC310bc0593D8,
+ chainModule: module,
reorgProtectionEnabled: true
});
bytes memory onchainConfigBytes = abi.encode(cfg);
@@ -117,7 +126,7 @@ contract AutomationRegistry2_2_SetConfig is AutomationRegistry2_2_SetUp {
bytes memory offchainConfigBytes = abi.encode(a, b);
bytes32 configDigest = _configDigestFromConfigData(
block.chainid,
- address(registry),
+ address(registryMaster),
++configCount,
s_valid_signers,
s_valid_transmitters,
@@ -140,7 +149,7 @@ contract AutomationRegistry2_2_SetConfig is AutomationRegistry2_2_SetUp {
offchainConfigBytes
);
- registry.setConfig(
+ registryMaster.setConfig(
s_valid_signers,
s_valid_transmitters,
F,
@@ -149,7 +158,7 @@ contract AutomationRegistry2_2_SetConfig is AutomationRegistry2_2_SetUp {
offchainConfigBytes
);
- (, , address[] memory signers, address[] memory transmitters, uint8 f) = registry.getState();
+ (, , address[] memory signers, address[] memory transmitters, uint8 f) = registryMaster.getState();
assertEq(signers, s_valid_signers);
assertEq(transmitters, s_valid_transmitters);
diff --git a/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistry2_2.sol b/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistry2_2.sol
index 77f11b22597..f988787d574 100644
--- a/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistry2_2.sol
+++ b/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistry2_2.sol
@@ -20,7 +20,7 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
/**
* @notice versions:
- * AutomationRegistry 2.2.0: moves chain-spicific integration code into a separate module
+ * AutomationRegistry 2.2.0: moves chain-specific integration code into a separate module
* KeeperRegistry 2.1.0: introduces support for log triggers
* removes the need for "wrapped perform data"
* KeeperRegistry 2.0.2: pass revert bytes as performData when target contract reverts
@@ -48,11 +48,11 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
AutomationRegistryLogicB2_2 logicA
)
AutomationRegistryBase2_2(
- logicA.getMode(),
logicA.getLinkAddress(),
logicA.getLinkNativeFeedAddress(),
logicA.getFastGasFeedAddress(),
- logicA.getAutomationForwarderLogic()
+ logicA.getAutomationForwarderLogic(),
+ logicA.getAllowedReadOnlyAddress()
)
Chainable(address(logicA))
{}
@@ -83,9 +83,22 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
_verifyReportSignature(reportContext, rawReport, rs, ss, rawVs);
Report memory report = _decodeReport(rawReport);
+
+ uint40 epochAndRound = uint40(uint256(reportContext[1]));
+ uint32 epoch = uint32(epochAndRound >> 8);
+
+ _handleReport(hotVars, report, gasOverhead);
+
+ if (epoch > hotVars.latestEpoch) {
+ s_hotVars.latestEpoch = epoch;
+ }
+ }
+
+ function _handleReport(HotVars memory hotVars, Report memory report, uint256 gasOverhead) private {
UpkeepTransmitInfo[] memory upkeepTransmitInfo = new UpkeepTransmitInfo[](report.upkeepIds.length);
uint16 numUpkeepsPassedChecks;
+ uint256 blocknumber = hotVars.chainModule.blockNumber();
for (uint256 i = 0; i < report.upkeepIds.length; i++) {
upkeepTransmitInfo[i].upkeep = s_upkeep[report.upkeepIds[i]];
upkeepTransmitInfo[i].triggerType = _getTriggerType(report.upkeepIds[i]);
@@ -100,6 +113,7 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
);
(upkeepTransmitInfo[i].earlyChecksPassed, upkeepTransmitInfo[i].dedupID) = _prePerformChecks(
report.upkeepIds[i],
+ blocknumber,
report.triggers[i],
upkeepTransmitInfo[i],
hotVars
@@ -122,7 +136,7 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
gasOverhead -= upkeepTransmitInfo[i].gasUsed;
// Store last perform block number / deduping key for upkeep
- _updateTriggerMarker(report.upkeepIds[i], upkeepTransmitInfo[i]);
+ _updateTriggerMarker(report.upkeepIds[i], blocknumber, upkeepTransmitInfo[i]);
}
// No upkeeps to be performed in this report
if (numUpkeepsPassedChecks == 0) {
@@ -132,8 +146,9 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
// This is the overall gas overhead that will be split across performed upkeeps
// Take upper bound of 16 gas per callData bytes, which is approximated to be reportLength
// Rest of msg.data is accounted for in accounting overheads
+ // NOTE in process of changing accounting, so pre-emptively changed reportLength to msg.data.length
gasOverhead =
- (gasOverhead - gasleft() + 16 * rawReport.length) +
+ (gasOverhead - gasleft() + 16 * msg.data.length) +
ACCOUNTING_FIXED_GAS_OVERHEAD +
(ACCOUNTING_PER_SIGNER_GAS_OVERHEAD * (hotVars.f + 1));
gasOverhead = gasOverhead / numUpkeepsPassedChecks + ACCOUNTING_PER_UPKEEP_GAS_OVERHEAD;
@@ -177,12 +192,6 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
// record payments
s_transmitters[msg.sender].balance += totalReimbursement;
s_hotVars.totalPremium += totalPremium;
-
- uint40 epochAndRound = uint40(uint256(reportContext[1]));
- uint32 epoch = uint32(epochAndRound >> 8);
- if (epoch > hotVars.latestEpoch) {
- s_hotVars.latestEpoch = epoch;
- }
}
/**
@@ -195,7 +204,9 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
function simulatePerformUpkeep(
uint256 id,
bytes calldata performData
- ) external cannotExecute returns (bool success, uint256 gasUsed) {
+ ) external returns (bool success, uint256 gasUsed) {
+ _preventExecution();
+
if (s_hotVars.paused) revert RegistryPaused();
Upkeep memory upkeep = s_upkeep[id];
(success, gasUsed) = _performUpkeep(upkeep.forwarder, upkeep.performGas, performData);
@@ -224,7 +235,7 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
/**
* @inheritdoc OCR2Abstract
- * @dev prefer the type-safe version of setConfig (below) whenever possible
+ * @dev prefer the type-safe version of setConfig (below) whenever possible. The OnchainConfig could differ between registry versions
*/
function setConfig(
address[] memory signers,
@@ -310,7 +321,8 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
reentrancyGuard: s_hotVars.reentrancyGuard,
totalPremium: totalPremium,
latestEpoch: 0, // DON restarts epoch
- reorgProtectionEnabled: onchainConfig.reorgProtectionEnabled
+ reorgProtectionEnabled: onchainConfig.reorgProtectionEnabled,
+ chainModule: onchainConfig.chainModule
});
s_storage = Storage({
@@ -331,7 +343,7 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
s_fallbackLinkPrice = onchainConfig.fallbackLinkPrice;
uint32 previousConfigBlockNumber = s_storage.latestConfigBlockNumber;
- s_storage.latestConfigBlockNumber = uint32(_blockNum());
+ s_storage.latestConfigBlockNumber = uint32(onchainConfig.chainModule.blockNumber());
s_storage.configCount += 1;
bytes memory onchainConfigBytes = abi.encode(onchainConfig);
diff --git a/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryBase2_2.sol b/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryBase2_2.sol
index e66b107cbd8..976c8dff80d 100644
--- a/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryBase2_2.sol
+++ b/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryBase2_2.sol
@@ -3,10 +3,6 @@ pragma solidity 0.8.19;
import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.7.3/contracts/utils/structs/EnumerableSet.sol";
import {Address} from "../../../vendor/openzeppelin-solidity/v4.7.3/contracts/utils/Address.sol";
-import {ArbGasInfo} from "../../../vendor/@arbitrum/nitro-contracts/src/precompiles/ArbGasInfo.sol";
-import {OVM_GasPriceOracle} from "../../../vendor/@eth-optimism/contracts/v0.8.9/contracts/L2/predeploys/OVM_GasPriceOracle.sol";
-import {ExecutionPrevention} from "../../ExecutionPrevention.sol";
-import {ArbSys} from "../../../vendor/@arbitrum/nitro-contracts/src/precompiles/ArbSys.sol";
import {StreamsLookupCompatibleInterface} from "../../interfaces/StreamsLookupCompatibleInterface.sol";
import {ILogAutomation, Log} from "../../interfaces/ILogAutomation.sol";
import {IAutomationForwarder} from "../../interfaces/IAutomationForwarder.sol";
@@ -15,13 +11,14 @@ import {AggregatorV3Interface} from "../../../shared/interfaces/AggregatorV3Inte
import {LinkTokenInterface} from "../../../shared/interfaces/LinkTokenInterface.sol";
import {KeeperCompatibleInterface} from "../../interfaces/KeeperCompatibleInterface.sol";
import {UpkeepFormat} from "../../interfaces/UpkeepTranscoderInterface.sol";
+import {IChainModule} from "../interfaces/v2_2/IChainModule.sol";
/**
* @notice Base Keeper Registry contract, contains shared logic between
* AutomationRegistry and AutomationRegistryLogic
* @dev all errors, events, and internal functions should live here
*/
-abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPrevention {
+abstract contract AutomationRegistryBase2_2 is ConfirmedOwner {
using Address for address;
using EnumerableSet for EnumerableSet.UintSet;
using EnumerableSet for EnumerableSet.AddressSet;
@@ -47,28 +44,21 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
*/
UpkeepFormat internal constant UPKEEP_TRANSCODER_VERSION_BASE = UpkeepFormat.V1;
uint8 internal constant UPKEEP_VERSION_BASE = 3;
- // L1_FEE_DATA_PADDING includes 35 bytes for L1 data padding for Optimism
- bytes internal constant L1_FEE_DATA_PADDING =
- "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
uint256 internal constant REGISTRY_CONDITIONAL_OVERHEAD = 90_000; // Used in maxPayment estimation, and in capping overheads during actual payment
- uint256 internal constant REGISTRY_LOG_OVERHEAD = 110_000; // Used only in maxPayment estimation, and in capping overheads during actual payment.
+ uint256 internal constant REGISTRY_LOG_OVERHEAD = 110_400; // Used only in maxPayment estimation, and in capping overheads during actual payment.
uint256 internal constant REGISTRY_PER_PERFORM_BYTE_GAS_OVERHEAD = 20; // Used only in maxPayment estimation, and in capping overheads during actual payment. Value scales with performData length.
uint256 internal constant REGISTRY_PER_SIGNER_GAS_OVERHEAD = 7_500; // Used only in maxPayment estimation, and in capping overheads during actual payment. Value scales with f.
- uint256 internal constant ACCOUNTING_FIXED_GAS_OVERHEAD = 27_500; // Used in actual payment. Fixed overhead per tx
+ uint256 internal constant ACCOUNTING_FIXED_GAS_OVERHEAD = 28_100; // Used in actual payment. Fixed overhead per tx
uint256 internal constant ACCOUNTING_PER_SIGNER_GAS_OVERHEAD = 1_100; // Used in actual payment. overhead per signer
- uint256 internal constant ACCOUNTING_PER_UPKEEP_GAS_OVERHEAD = 7_000; // Used in actual payment. overhead per upkeep performed
-
- OVM_GasPriceOracle internal constant OPTIMISM_ORACLE = OVM_GasPriceOracle(0x420000000000000000000000000000000000000F);
- ArbGasInfo internal constant ARB_NITRO_ORACLE = ArbGasInfo(0x000000000000000000000000000000000000006C);
- ArbSys internal constant ARB_SYS = ArbSys(0x0000000000000000000000000000000000000064);
+ uint256 internal constant ACCOUNTING_PER_UPKEEP_GAS_OVERHEAD = 7_200; // Used in actual payment. overhead per upkeep performed
LinkTokenInterface internal immutable i_link;
AggregatorV3Interface internal immutable i_linkNativeFeed;
AggregatorV3Interface internal immutable i_fastGasFeed;
- Mode internal immutable i_mode;
address internal immutable i_automationForwarderLogic;
+ address internal immutable i_allowedReadOnlyAddress;
/**
* @dev - The storage is gas optimised for one and only one function - transmit. All the storage accessed in transmit
@@ -138,6 +128,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
error OnlyCallableByProposedPayee();
error OnlyCallableByUpkeepPrivilegeManager();
error OnlyPausedUpkeep();
+ error OnlySimulatedBackend();
error OnlyUnpausedUpkeep();
error ParameterLengthError();
error PaymentGreaterThanAllLINK();
@@ -161,12 +152,6 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
BIDIRECTIONAL
}
- enum Mode {
- DEFAULT,
- ARBITRUM,
- OPTIMISM
- }
-
enum Trigger {
CONDITION,
LOG
@@ -186,7 +171,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
}
/**
- * @notice OnchainConfig of the registry
+ * @notice OnchainConfigLegacy of the registry
* @dev only used in params and return values
* @member paymentPremiumPPB payment premium rate oracles receive on top of
* being reimbursed for gas, measured in parts per billion
@@ -208,6 +193,51 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
* @member transcoder address of the transcoder contract
* @member registrars addresses of the registrar contracts
* @member upkeepPrivilegeManager address which can set privilege for upkeeps
+ */
+ struct OnchainConfigLegacy {
+ uint32 paymentPremiumPPB;
+ uint32 flatFeeMicroLink; // min 0.000001 LINK, max 4294 LINK
+ uint32 checkGasLimit;
+ uint24 stalenessSeconds;
+ uint16 gasCeilingMultiplier;
+ uint96 minUpkeepSpend;
+ uint32 maxPerformGas;
+ uint32 maxCheckDataSize;
+ uint32 maxPerformDataSize;
+ uint32 maxRevertDataSize;
+ uint256 fallbackGasPrice;
+ uint256 fallbackLinkPrice;
+ address transcoder;
+ address[] registrars;
+ address upkeepPrivilegeManager;
+ }
+
+ /**
+ * @notice OnchainConfig of the registry
+ * @dev used only in setConfig()
+ * @member paymentPremiumPPB payment premium rate oracles receive on top of
+ * being reimbursed for gas, measured in parts per billion
+ * @member flatFeeMicroLink flat fee paid to oracles for performing upkeeps,
+ * priced in MicroLink; can be used in conjunction with or independently of
+ * paymentPremiumPPB
+ * @member checkGasLimit gas limit when checking for upkeep
+ * @member stalenessSeconds number of seconds that is allowed for feed data to
+ * be stale before switching to the fallback pricing
+ * @member gasCeilingMultiplier multiplier to apply to the fast gas feed price
+ * when calculating the payment ceiling for keepers
+ * @member minUpkeepSpend minimum LINK that an upkeep must spend before cancelling
+ * @member maxPerformGas max performGas allowed for an upkeep on this registry
+ * @member maxCheckDataSize max length of checkData bytes
+ * @member maxPerformDataSize max length of performData bytes
+ * @member maxRevertDataSize max length of revertData bytes
+ * @member fallbackGasPrice gas price used if the gas price feed is stale
+ * @member fallbackLinkPrice LINK price used if the LINK price feed is stale
+ * @member transcoder address of the transcoder contract
+ * @member registrars addresses of the registrar contracts
+ * @member upkeepPrivilegeManager address which can set privilege for upkeeps
+ * @member reorgProtectionEnabled if this registry enables re-org protection checks
+ * @member chainSpecificModule the chain specific module
+ * @member chainModule the chain specific module
* @member reorgProtectionEnabled if this registry will enable re-org protection checks
*/
struct OnchainConfig {
@@ -226,6 +256,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
address transcoder;
address[] registrars;
address upkeepPrivilegeManager;
+ IChainModule chainModule;
bool reorgProtectionEnabled;
}
@@ -319,6 +350,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
bool paused; // │ pause switch for all upkeeps in the registry
bool reentrancyGuard; // ────────╯ guard against reentrancy
bool reorgProtectionEnabled; // if this registry should enable re-org protection mechanism
+ IChainModule chainModule; // the interface of chain specific module
}
/// @dev Config + State storage struct which is not on hot transmit path
@@ -409,6 +441,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
event AdminPrivilegeConfigSet(address indexed admin, bytes privilegeConfig);
event CancelledUpkeepReport(uint256 indexed id, bytes trigger);
+ event ChainSpecificModuleUpdated(address newModule);
event DedupKeyAdded(bytes32 indexed dedupKey);
event FundsAdded(uint256 indexed id, address indexed from, uint96 amount);
event FundsWithdrawn(uint256 indexed id, uint256 amount, address to);
@@ -445,23 +478,24 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
event Unpaused(address account);
/**
- * @param mode the contract mode of default, Arbitrum, or Optimism
* @param link address of the LINK Token
* @param linkNativeFeed address of the LINK/Native price feed
* @param fastGasFeed address of the Fast Gas price feed
+ * @param automationForwarderLogic the address of automation forwarder logic
+ * @param allowedReadOnlyAddress the address of the allowed read only address
*/
constructor(
- Mode mode,
address link,
address linkNativeFeed,
address fastGasFeed,
- address automationForwarderLogic
+ address automationForwarderLogic,
+ address allowedReadOnlyAddress
) ConfirmedOwner(msg.sender) {
- i_mode = mode;
i_link = LinkTokenInterface(link);
i_linkNativeFeed = AggregatorV3Interface(linkNativeFeed);
i_fastGasFeed = AggregatorV3Interface(fastGasFeed);
i_automationForwarderLogic = automationForwarderLogic;
+ i_allowedReadOnlyAddress = allowedReadOnlyAddress;
}
// ================================================================
@@ -513,8 +547,9 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
*/
function _createID(Trigger triggerType) internal view returns (uint256) {
bytes1 empty;
+ IChainModule chainModule = s_hotVars.chainModule;
bytes memory idBytes = abi.encodePacked(
- keccak256(abi.encode(_blockHash(_blockNum() - 1), address(this), s_storage.nonce))
+ keccak256(abi.encode(chainModule.blockHash((chainModule.blockNumber() - 1)), address(this), s_storage.nonce))
);
for (uint256 idx = 4; idx < 15; idx++) {
idBytes[idx] = empty;
@@ -578,30 +613,11 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
}
uint256 l1CostWei = 0;
- if (i_mode == Mode.OPTIMISM) {
- bytes memory txCallData = new bytes(0);
- if (isExecution) {
- txCallData = bytes.concat(msg.data, L1_FEE_DATA_PADDING);
- } else {
- // fee is 4 per 0 byte, 16 per non-zero byte. Worst case we can have
- // s_storage.maxPerformDataSize non zero-bytes. Instead of setting bytes to non-zero
- // we initialize 'new bytes' of length 4*maxPerformDataSize to cover for zero bytes.
- txCallData = new bytes(4 * s_storage.maxPerformDataSize);
- }
- l1CostWei = OPTIMISM_ORACLE.getL1Fee(txCallData);
- } else if (i_mode == Mode.ARBITRUM) {
- if (isExecution) {
- l1CostWei = ARB_NITRO_ORACLE.getCurrentTxL1GasFees();
- } else {
- // fee is 4 per 0 byte, 16 per non-zero byte - we assume all non-zero and
- // max data size to calculate max payment
- (, uint256 perL1CalldataUnit, , , , ) = ARB_NITRO_ORACLE.getPricesInWei();
- l1CostWei = perL1CalldataUnit * s_storage.maxPerformDataSize * 16;
- }
- }
- // if it's not performing upkeeps, use gas ceiling multiplier to estimate the upper bound
- if (!isExecution) {
- l1CostWei = hotVars.gasCeilingMultiplier * l1CostWei;
+ if (isExecution) {
+ l1CostWei = hotVars.chainModule.getCurrentL1Fee();
+ } else {
+ // if it's not performing upkeeps, use gas ceiling multiplier to estimate the upper bound
+ l1CostWei = hotVars.gasCeilingMultiplier * hotVars.chainModule.getMaxL1Fee(s_storage.maxPerformDataSize);
}
// Divide l1CostWei among all batched upkeeps. Spare change from division is not charged
l1CostWei = l1CostWei / numBatchedUpkeeps;
@@ -734,21 +750,23 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
*/
function _prePerformChecks(
uint256 upkeepId,
+ uint256 blocknumber,
bytes memory rawTrigger,
UpkeepTransmitInfo memory transmitInfo,
HotVars memory hotVars
) internal returns (bool, bytes32) {
bytes32 dedupID;
if (transmitInfo.triggerType == Trigger.CONDITION) {
- if (!_validateConditionalTrigger(upkeepId, rawTrigger, transmitInfo, hotVars)) return (false, dedupID);
+ if (!_validateConditionalTrigger(upkeepId, blocknumber, rawTrigger, transmitInfo, hotVars))
+ return (false, dedupID);
} else if (transmitInfo.triggerType == Trigger.LOG) {
bool valid;
- (valid, dedupID) = _validateLogTrigger(upkeepId, rawTrigger, hotVars);
+ (valid, dedupID) = _validateLogTrigger(upkeepId, blocknumber, rawTrigger, hotVars);
if (!valid) return (false, dedupID);
} else {
revert InvalidTriggerType();
}
- if (transmitInfo.upkeep.maxValidBlocknumber <= _blockNum()) {
+ if (transmitInfo.upkeep.maxValidBlocknumber <= blocknumber) {
// Can happen when an upkeep got cancelled after report was generated.
// However we have a CANCELLATION_DELAY of 50 blocks so shouldn't happen in practice
emit CancelledUpkeepReport(upkeepId, rawTrigger);
@@ -767,6 +785,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
*/
function _validateConditionalTrigger(
uint256 upkeepId,
+ uint256 blocknumber,
bytes memory rawTrigger,
UpkeepTransmitInfo memory transmitInfo,
HotVars memory hotVars
@@ -779,8 +798,8 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
}
if (
(hotVars.reorgProtectionEnabled &&
- (trigger.blockHash != bytes32("") && _blockHash(trigger.blockNum) != trigger.blockHash)) ||
- trigger.blockNum >= _blockNum()
+ (trigger.blockHash != bytes32("") && hotVars.chainModule.blockHash(trigger.blockNum) != trigger.blockHash)) ||
+ trigger.blockNum >= blocknumber
) {
// There are two cases of reorged report
// 1. trigger block number is in future: this is an edge case during extreme deep reorgs of chain
@@ -796,6 +815,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
function _validateLogTrigger(
uint256 upkeepId,
+ uint256 blocknumber,
bytes memory rawTrigger,
HotVars memory hotVars
) internal returns (bool, bytes32) {
@@ -803,8 +823,8 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
bytes32 dedupID = keccak256(abi.encodePacked(upkeepId, trigger.logBlockHash, trigger.txHash, trigger.logIndex));
if (
(hotVars.reorgProtectionEnabled &&
- (trigger.blockHash != bytes32("") && _blockHash(trigger.blockNum) != trigger.blockHash)) ||
- trigger.blockNum >= _blockNum()
+ (trigger.blockHash != bytes32("") && hotVars.chainModule.blockHash(trigger.blockNum) != trigger.blockHash)) ||
+ trigger.blockNum >= blocknumber
) {
// Reorg protection is same as conditional trigger upkeeps
emit ReorgedUpkeepReport(upkeepId, rawTrigger);
@@ -849,9 +869,13 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
* @dev updates a storage marker for this upkeep to prevent duplicate and out of order performances
* @dev for conditional triggers we set the latest block number, for log triggers we store a dedupID
*/
- function _updateTriggerMarker(uint256 upkeepID, UpkeepTransmitInfo memory upkeepTransmitInfo) internal {
+ function _updateTriggerMarker(
+ uint256 upkeepID,
+ uint256 blocknumber,
+ UpkeepTransmitInfo memory upkeepTransmitInfo
+ ) internal {
if (upkeepTransmitInfo.triggerType == Trigger.CONDITION) {
- s_upkeep[upkeepID].lastPerformedBlockNumber = uint32(_blockNum());
+ s_upkeep[upkeepID].lastPerformedBlockNumber = uint32(blocknumber);
} else if (upkeepTransmitInfo.triggerType == Trigger.LOG) {
s_dedupKeys[upkeepTransmitInfo.dedupID] = true;
emit DedupKeyAdded(upkeepTransmitInfo.dedupID);
@@ -925,34 +949,6 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
if (s_upkeep[upkeepId].maxValidBlocknumber != UINT32_MAX) revert UpkeepCancelled();
}
- /**
- * @dev returns the current block number in a chain agnostic manner
- */
- function _blockNum() internal view returns (uint256) {
- if (i_mode == Mode.ARBITRUM) {
- return ARB_SYS.arbBlockNumber();
- } else {
- return block.number;
- }
- }
-
- /**
- * @dev returns the blockhash of the provided block number in a chain agnostic manner
- * @param n the blocknumber to retrieve the blockhash for
- * @return blockhash the blockhash of block number n, or 0 if n is out queryable of range
- */
- function _blockHash(uint256 n) internal view returns (bytes32) {
- if (i_mode == Mode.ARBITRUM) {
- uint256 blockNum = ARB_SYS.arbBlockNumber();
- if (n >= blockNum || blockNum - n > 256) {
- return "";
- }
- return ARB_SYS.arbBlockHash(n);
- } else {
- return blockhash(n);
- }
- }
-
/**
* @dev replicates Open Zeppelin's ReentrancyGuard but optimized to fit our storage
*/
@@ -962,4 +958,13 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
_;
s_hotVars.reentrancyGuard = false;
}
+
+ /**
+ * @notice only allows a pre-configured address to initiate offchain read
+ */
+ function _preventExecution() internal view {
+ if (tx.origin != i_allowedReadOnlyAddress) {
+ revert OnlySimulatedBackend();
+ }
+ }
}
diff --git a/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryLogicA2_2.sol b/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryLogicA2_2.sol
index 52c6880fa4a..4663c172e67 100644
--- a/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryLogicA2_2.sol
+++ b/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryLogicA2_2.sol
@@ -26,11 +26,11 @@ contract AutomationRegistryLogicA2_2 is AutomationRegistryBase2_2, Chainable {
AutomationRegistryLogicB2_2 logicB
)
AutomationRegistryBase2_2(
- logicB.getMode(),
logicB.getLinkAddress(),
logicB.getLinkNativeFeedAddress(),
logicB.getFastGasFeedAddress(),
- logicB.getAutomationForwarderLogic()
+ logicB.getAutomationForwarderLogic(),
+ logicB.getAllowedReadOnlyAddress()
)
Chainable(address(logicB))
{}
@@ -49,7 +49,6 @@ contract AutomationRegistryLogicA2_2 is AutomationRegistryBase2_2, Chainable {
bytes memory triggerData
)
public
- cannotExecute
returns (
bool upkeepNeeded,
bytes memory performData,
@@ -60,6 +59,8 @@ contract AutomationRegistryLogicA2_2 is AutomationRegistryBase2_2, Chainable {
uint256 linkNative
)
{
+ _preventExecution();
+
Trigger triggerType = _getTriggerType(id);
HotVars memory hotVars = s_hotVars;
Upkeep memory upkeep = s_upkeep[id];
@@ -172,7 +173,6 @@ contract AutomationRegistryLogicA2_2 is AutomationRegistryBase2_2, Chainable {
bytes calldata extraData
)
external
- cannotExecute
returns (bool upkeepNeeded, bytes memory performData, UpkeepFailureReason upkeepFailureReason, uint256 gasUsed)
{
bytes memory payload = abi.encodeWithSelector(CHECK_CALLBACK_SELECTOR, values, extraData);
@@ -190,9 +190,10 @@ contract AutomationRegistryLogicA2_2 is AutomationRegistryBase2_2, Chainable {
bytes memory payload
)
public
- cannotExecute
returns (bool upkeepNeeded, bytes memory performData, UpkeepFailureReason upkeepFailureReason, uint256 gasUsed)
{
+ _preventExecution();
+
Upkeep memory upkeep = s_upkeep[id];
gasUsed = gasleft();
(bool success, bytes memory result) = upkeep.forwarder.getTarget().call{gas: s_storage.checkGasLimit}(payload);
@@ -285,10 +286,10 @@ contract AutomationRegistryLogicA2_2 is AutomationRegistryBase2_2, Chainable {
bool canceled = upkeep.maxValidBlocknumber != UINT32_MAX;
bool isOwner = msg.sender == owner();
- if (canceled && !(isOwner && upkeep.maxValidBlocknumber > _blockNum())) revert CannotCancel();
+ uint256 height = s_hotVars.chainModule.blockNumber();
+ if (canceled && !(isOwner && upkeep.maxValidBlocknumber > height)) revert CannotCancel();
if (!isOwner && msg.sender != s_upkeepAdmin[id]) revert OnlyCallableByOwnerOrAdmin();
- uint256 height = _blockNum();
if (!isOwner) {
height = height + CANCELLATION_DELAY;
}
diff --git a/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryLogicB2_2.sol b/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryLogicB2_2.sol
index de691b0f174..d7e1edf7bc8 100644
--- a/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryLogicB2_2.sol
+++ b/contracts/src/v0.8/automation/dev/v2_2/AutomationRegistryLogicB2_2.sol
@@ -6,6 +6,7 @@ import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.7.3/contra
import {Address} from "../../../vendor/openzeppelin-solidity/v4.7.3/contracts/utils/Address.sol";
import {UpkeepFormat} from "../../interfaces/UpkeepTranscoderInterface.sol";
import {IAutomationForwarder} from "../../interfaces/IAutomationForwarder.sol";
+import {IChainModule} from "../interfaces/v2_2/IChainModule.sol";
contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
using Address for address;
@@ -16,12 +17,12 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
* @dev see AutomationRegistry master contract for constructor description
*/
constructor(
- Mode mode,
address link,
address linkNativeFeed,
address fastGasFeed,
- address automationForwarderLogic
- ) AutomationRegistryBase2_2(mode, link, linkNativeFeed, fastGasFeed, automationForwarderLogic) {}
+ address automationForwarderLogic,
+ address allowedReadOnlyAddress
+ ) AutomationRegistryBase2_2(link, linkNativeFeed, fastGasFeed, automationForwarderLogic, allowedReadOnlyAddress) {}
// ================================================================
// | UPKEEP MANAGEMENT |
@@ -116,7 +117,7 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
if (to == ZERO_ADDRESS) revert InvalidRecipient();
Upkeep memory upkeep = s_upkeep[id];
if (s_upkeepAdmin[id] != msg.sender) revert OnlyCallableByAdmin();
- if (upkeep.maxValidBlocknumber > _blockNum()) revert UpkeepNotCanceled();
+ if (upkeep.maxValidBlocknumber > s_hotVars.chainModule.blockNumber()) revert UpkeepNotCanceled();
uint96 amountToWithdraw = s_upkeep[id].balance;
s_expectedLinkBalance = s_expectedLinkBalance - amountToWithdraw;
s_upkeep[id].balance = 0;
@@ -170,6 +171,14 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
// | OWNER / MANAGER ACTIONS |
// ================================================================
+ /**
+ * @notice sets the chain specific module
+ */
+ function setChainSpecificModule(IChainModule newModule) external onlyOwner {
+ s_hotVars.chainModule = newModule;
+ emit ChainSpecificModuleUpdated(address(newModule));
+ }
+
/**
* @notice sets the privilege config for an upkeep
*/
@@ -280,10 +289,6 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
return CANCELLATION_DELAY;
}
- function getMode() external view returns (Mode) {
- return i_mode;
- }
-
function getLinkAddress() external view returns (address) {
return address(i_link);
}
@@ -300,6 +305,10 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
return i_automationForwarderLogic;
}
+ function getAllowedReadOnlyAddress() external view returns (address) {
+ return i_allowedReadOnlyAddress;
+ }
+
function upkeepTranscoderVersion() public pure returns (UpkeepFormat) {
return UPKEEP_TRANSCODER_VERSION_BASE;
}
@@ -397,13 +406,14 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
/**
* @notice read the current state of the registry
+ * @dev this function is deprecated
*/
function getState()
external
view
returns (
State memory state,
- OnchainConfig memory config,
+ OnchainConfigLegacy memory config,
address[] memory signers,
address[] memory transmitters,
uint8 f
@@ -422,7 +432,7 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
paused: s_hotVars.paused
});
- config = OnchainConfig({
+ config = OnchainConfigLegacy({
paymentPremiumPPB: s_hotVars.paymentPremiumPPB,
flatFeeMicroLink: s_hotVars.flatFeeMicroLink,
checkGasLimit: s_storage.checkGasLimit,
@@ -437,13 +447,26 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
fallbackLinkPrice: s_fallbackLinkPrice,
transcoder: s_storage.transcoder,
registrars: s_registrars.values(),
- upkeepPrivilegeManager: s_storage.upkeepPrivilegeManager,
- reorgProtectionEnabled: s_hotVars.reorgProtectionEnabled
+ upkeepPrivilegeManager: s_storage.upkeepPrivilegeManager
});
return (state, config, s_signersList, s_transmittersList, s_hotVars.f);
}
+ /**
+ * @notice get the chain module
+ */
+ function getChainModule() external view returns (IChainModule chainModule) {
+ return s_hotVars.chainModule;
+ }
+
+ /**
+ * @notice if this registry has reorg protection enabled
+ */
+ function getReorgProtectionEnabled() external view returns (bool reorgProtectionEnabled) {
+ return s_hotVars.reorgProtectionEnabled;
+ }
+
/**
* @notice calculates the minimum balance required for an upkeep to remain eligible
* @param id the upkeep id to calculate minimum balance for
diff --git a/contracts/src/v0.8/llo-feeds/FeeManager.sol b/contracts/src/v0.8/llo-feeds/FeeManager.sol
index c9981045a4a..665940d4670 100644
--- a/contracts/src/v0.8/llo-feeds/FeeManager.sol
+++ b/contracts/src/v0.8/llo-feeds/FeeManager.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol";
import {IFeeManager} from "./interfaces/IFeeManager.sol";
diff --git a/contracts/src/v0.8/llo-feeds/RewardManager.sol b/contracts/src/v0.8/llo-feeds/RewardManager.sol
index 596755142e8..1929289a360 100644
--- a/contracts/src/v0.8/llo-feeds/RewardManager.sol
+++ b/contracts/src/v0.8/llo-feeds/RewardManager.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol";
import {IRewardManager} from "./interfaces/IRewardManager.sol";
diff --git a/contracts/src/v0.8/llo-feeds/Verifier.sol b/contracts/src/v0.8/llo-feeds/Verifier.sol
index 3e668c09ff0..c8858999dab 100644
--- a/contracts/src/v0.8/llo-feeds/Verifier.sol
+++ b/contracts/src/v0.8/llo-feeds/Verifier.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol";
import {IVerifier} from "./interfaces/IVerifier.sol";
diff --git a/contracts/src/v0.8/llo-feeds/VerifierProxy.sol b/contracts/src/v0.8/llo-feeds/VerifierProxy.sol
index a35c54573c1..c32a27178cc 100644
--- a/contracts/src/v0.8/llo-feeds/VerifierProxy.sol
+++ b/contracts/src/v0.8/llo-feeds/VerifierProxy.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {ConfirmedOwner} from "../shared/access/ConfirmedOwner.sol";
import {IVerifierProxy} from "./interfaces/IVerifierProxy.sol";
diff --git a/contracts/src/v0.8/llo-feeds/dev/ChannelConfigStore.sol b/contracts/src/v0.8/llo-feeds/dev/ChannelConfigStore.sol
new file mode 100644
index 00000000000..ca24b775398
--- /dev/null
+++ b/contracts/src/v0.8/llo-feeds/dev/ChannelConfigStore.sol
@@ -0,0 +1,104 @@
+// SPDX-License-Identifier: UNLICENSED
+pragma solidity ^0.8.19;
+
+import {ConfirmedOwner} from "../../shared/access/ConfirmedOwner.sol";
+import {IChannelConfigStore} from "./interfaces/IChannelConfigStore.sol";
+import {TypeAndVersionInterface} from "../../interfaces/TypeAndVersionInterface.sol";
+
+contract ChannelConfigStore is ConfirmedOwner, IChannelConfigStore, TypeAndVersionInterface {
+ mapping(uint32 => ChannelDefinition) private s_channelDefinitions;
+
+ // mapping(bytes32 => ChannelConfiguration) private s_channelProductionConfigurations;
+ // mapping(bytes32 => ChannelConfiguration) private s_channelStagingConfigurations;
+
+ event NewChannelDefinition(uint32 channelId, ChannelDefinition channelDefinition);
+ event ChannelDefinitionRemoved(uint32 channelId);
+ // event NewProductionConfig(ChannelConfiguration channelConfig);
+ // event NewStagingConfig(ChannelConfiguration channelConfig);
+ event PromoteStagingConfig(uint32 channelId);
+
+ error OnlyCallableByEOA();
+ error StagingConfigAlreadyPromoted();
+ error EmptyStreamIDs();
+ error ZeroReportFormat();
+ error ZeroChainSelector();
+ error ChannelDefinitionNotFound();
+
+ constructor() ConfirmedOwner(msg.sender) {}
+
+ // function setStagingConfig(bytes32 configDigest, ChannelConfiguration calldata channelConfig) external onlyOwner {
+ // s_channelStagingConfigurations[channelId] = channelConfig;
+
+ // emit NewStagingConfig(channelConfig);
+ // }
+
+ //// this will trigger the following:
+ //// - offchain ShouldRetireCache will start returning true for the old (production)
+ //// protocol instance
+ //// - once the old production instance retires it will generate a handover
+ //// retirement report
+ //// - the staging instance will become the new production instance once
+ //// any honest oracle that is on both instances forward the retirement
+ //// report from the old instance to the new instace via the
+ //// PredecessorRetirementReportCache
+ ////
+ //// Note: the promotion flow only works if the previous production instance
+ //// is working correctly & generating reports. If that's not the case, the
+ //// owner is expected to "setProductionConfig" directly instead. This will
+ //// cause "gaps" to be created, but that seems unavoidable in such a scenario.
+ // function promoteStagingConfig(bytes32 configDigest) external onlyOwner {
+ // ChannelConfiguration memory stagingConfig = s_channelStagingConfigurations[channelId];
+
+ // if(stagingConfig.channelConfigId.length == 0) {
+ // revert StagingConfigAlreadyPromoted();
+ // }
+
+ // s_channelProductionConfigurations[channelId] = s_channelStagingConfigurations[channelId];
+
+ // emit PromoteStagingConfig(channelId);
+ // }
+
+ function addChannel(uint32 channelId, ChannelDefinition calldata channelDefinition) external onlyOwner {
+ if (channelDefinition.streamIDs.length == 0) {
+ revert EmptyStreamIDs();
+ }
+
+ if (channelDefinition.chainSelector == 0) {
+ revert ZeroChainSelector();
+ }
+
+ if (channelDefinition.reportFormat == 0) {
+ revert ZeroReportFormat();
+ }
+
+ s_channelDefinitions[channelId] = channelDefinition;
+
+ emit NewChannelDefinition(channelId, channelDefinition);
+ }
+
+ function removeChannel(uint32 channelId) external onlyOwner {
+ if (s_channelDefinitions[channelId].streamIDs.length == 0) {
+ revert ChannelDefinitionNotFound();
+ }
+
+ delete s_channelDefinitions[channelId];
+
+ emit ChannelDefinitionRemoved(channelId);
+ }
+
+ function getChannelDefinitions(uint32 channelId) external view returns (ChannelDefinition memory) {
+ if (msg.sender != tx.origin) {
+ revert OnlyCallableByEOA();
+ }
+
+ return s_channelDefinitions[channelId];
+ }
+
+ function typeAndVersion() external pure override returns (string memory) {
+ return "ChannelConfigStore 0.0.0";
+ }
+
+ function supportsInterface(bytes4 interfaceId) external pure returns (bool) {
+ return interfaceId == type(IChannelConfigStore).interfaceId;
+ }
+}
diff --git a/contracts/src/v0.8/llo-feeds/dev/ChannelVerifier.sol b/contracts/src/v0.8/llo-feeds/dev/ChannelVerifier.sol
new file mode 100644
index 00000000000..424022dc441
--- /dev/null
+++ b/contracts/src/v0.8/llo-feeds/dev/ChannelVerifier.sol
@@ -0,0 +1,536 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.19;
+
+import {ConfirmedOwner} from "../../shared/access/ConfirmedOwner.sol";
+import {TypeAndVersionInterface} from "../../interfaces/TypeAndVersionInterface.sol";
+import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
+import {Common} from "../libraries/Common.sol";
+import {IChannelVerifier} from "./interfaces/IChannelVerifier.sol";
+
+// OCR2 standard
+uint256 constant MAX_NUM_ORACLES = 31;
+
+/*
+ * The verifier contract is used to verify offchain reports signed
+ * by DONs. A report consists of a price, block number and feed Id. It
+ * represents the observed price of an asset at a specified block number for
+ * a feed. The verifier contract is used to verify that such reports have
+ * been signed by the correct signers.
+ **/
+contract ChannelVerifier is IChannelVerifier, ConfirmedOwner, TypeAndVersionInterface {
+ // The first byte of the mask can be 0, because we only ever have 31 oracles
+ uint256 internal constant ORACLE_MASK = 0x0001010101010101010101010101010101010101010101010101010101010101;
+
+ enum Role {
+ // Default role for an oracle address. This means that the oracle address
+ // is not a signer
+ Unset,
+ // Role given to an oracle address that is allowed to sign feed data
+ Signer
+ }
+
+ struct Signer {
+ // Index of oracle in a configuration
+ uint8 index;
+ // The oracle's role
+ Role role;
+ }
+
+ struct Config {
+ // Fault tolerance
+ uint8 f;
+ // Marks whether or not a configuration is active
+ bool isActive;
+ // Map of signer addresses to oracles
+ mapping(address => Signer) oracles;
+ }
+
+ struct VerifierState {
+ // The number of times a new configuration
+ /// has been set
+ uint32 configCount;
+ // The block number of the block the last time
+ /// the configuration was updated.
+ uint32 latestConfigBlockNumber;
+ // The latest epoch a report was verified for
+ uint32 latestEpoch;
+ /// The latest config digest set
+ bytes32 latestConfigDigest;
+ /// List of deactivated feeds
+ mapping(bytes32 => bool) deactivatedFeeds;
+ /// The historical record of all previously set configs by feedId
+ mapping(bytes32 => Config) s_verificationDataConfigs;
+ }
+
+ /// @notice This event is emitted when a new report is verified.
+ /// It is used to keep a historical record of verified reports.
+ event ReportVerified(bytes32 indexed feedId, address requester);
+
+ /// @notice This event is emitted whenever a new configuration is set. It triggers a new run of the offchain reporting protocol.
+ event ConfigSet(
+ uint32 previousConfigBlockNumber,
+ bytes32 configDigest,
+ uint64 configCount,
+ address[] signers,
+ bytes32[] offchainTransmitters,
+ uint8 f,
+ bytes onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes offchainConfig
+ );
+
+ /// @notice This event is emitted whenever a configuration is deactivated
+ event ConfigDeactivated(bytes32 configDigest);
+
+ /// @notice This event is emitted whenever a configuration is activated
+ event ConfigActivated(bytes32 configDigest);
+
+ /// @notice This event is emitted whenever a feed is activated
+ event FeedActivated(bytes32 indexed feedId);
+
+ /// @notice This event is emitted whenever a feed is deactivated
+ event FeedDeactivated(bytes32 indexed feedId);
+
+ /// @notice This error is thrown whenever an address tries
+ /// to exeecute a transaction that it is not authorized to do so
+ error AccessForbidden();
+
+ /// @notice This error is thrown whenever a zero address is passed
+ error ZeroAddress();
+
+ /// @notice This error is thrown whenever the feed ID passed in
+ /// a signed report is empty
+ error FeedIdEmpty();
+
+ /// @notice This error is thrown whenever the config digest
+ /// is empty
+ error DigestEmpty();
+
+ /// @notice This error is thrown whenever the config digest
+ /// passed in has not been set in this verifier
+ /// @param configDigest The config digest that has not been set
+ error DigestNotSet(bytes32 configDigest);
+
+ /// @notice This error is thrown whenever the config digest
+ /// has been deactivated
+ /// @param configDigest The config digest that is inactive
+ error DigestInactive(bytes32 configDigest);
+
+ /// @notice This error is thrown whenever trying to set a config
+ /// with a fault tolerance of 0
+ error FaultToleranceMustBePositive();
+
+ /// @notice This error is thrown whenever a report is signed
+ /// with more than the max number of signers
+ /// @param numSigners The number of signers who have signed the report
+ /// @param maxSigners The maximum number of signers that can sign a report
+ error ExcessSigners(uint256 numSigners, uint256 maxSigners);
+
+ /// @notice This error is thrown whenever a report is signed
+ /// with less than the minimum number of signers
+ /// @param numSigners The number of signers who have signed the report
+ /// @param minSigners The minimum number of signers that need to sign a report
+ error InsufficientSigners(uint256 numSigners, uint256 minSigners);
+
+ /// @notice This error is thrown whenever a report is signed
+ /// with an incorrect number of signers
+ /// @param numSigners The number of signers who have signed the report
+ /// @param expectedNumSigners The expected number of signers that need to sign
+ /// a report
+ error IncorrectSignatureCount(uint256 numSigners, uint256 expectedNumSigners);
+
+ /// @notice This error is thrown whenever the R and S signer components
+ /// have different lengths
+ /// @param rsLength The number of r signature components
+ /// @param ssLength The number of s signature components
+ error MismatchedSignatures(uint256 rsLength, uint256 ssLength);
+
+ /// @notice This error is thrown whenever setting a config with duplicate signatures
+ error NonUniqueSignatures();
+
+ /// @notice This error is thrown whenever a report fails to verify due to bad or duplicate signatures
+ error BadVerification();
+
+ /// @notice This error is thrown whenever the admin tries to deactivate
+ /// the latest config digest
+ /// @param configDigest The latest config digest
+ error CannotDeactivateLatestConfig(bytes32 configDigest);
+
+ /// @notice This error is thrown whenever the feed ID passed in is deactivated
+ /// @param feedId The feed ID
+ error InactiveFeed(bytes32 feedId);
+
+ /// @notice This error is thrown whenever the feed ID passed in is not found
+ /// @param feedId The feed ID
+ error InvalidFeed(bytes32 feedId);
+
+ /// @notice The address of the verifier proxy
+ address private immutable i_verifierProxyAddr;
+
+ /// @notice Verifier states keyed on Feed ID
+ VerifierState internal s_feedVerifierState;
+
+ /// @param verifierProxyAddr The address of the VerifierProxy contract
+ constructor(address verifierProxyAddr) ConfirmedOwner(msg.sender) {
+ if (verifierProxyAddr == address(0)) revert ZeroAddress();
+ i_verifierProxyAddr = verifierProxyAddr;
+ }
+
+ modifier checkConfigValid(uint256 numSigners, uint256 f) {
+ if (f == 0) revert FaultToleranceMustBePositive();
+ if (numSigners > MAX_NUM_ORACLES) revert ExcessSigners(numSigners, MAX_NUM_ORACLES);
+ if (numSigners <= 3 * f) revert InsufficientSigners(numSigners, 3 * f + 1);
+ _;
+ }
+
+ /// @inheritdoc IERC165
+ function supportsInterface(bytes4 interfaceId) external pure override returns (bool isVerifier) {
+ return interfaceId == this.verify.selector;
+ }
+
+ /// @inheritdoc TypeAndVersionInterface
+ function typeAndVersion() external pure override returns (string memory) {
+ return "ChannelVerifier 0.0.0";
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function verify(
+ bytes calldata signedReport,
+ address sender
+ ) external override returns (bytes memory verifierResponse) {
+ if (msg.sender != i_verifierProxyAddr) revert AccessForbidden();
+ (
+ bytes32[3] memory reportContext,
+ bytes memory reportData,
+ bytes32[] memory rs,
+ bytes32[] memory ss,
+ bytes32 rawVs
+ ) = abi.decode(signedReport, (bytes32[3], bytes, bytes32[], bytes32[], bytes32));
+
+ // The feed ID is the first 32 bytes of the report data.
+ bytes32 feedId = bytes32(reportData);
+
+ // If the feed has been deactivated, do not verify the report
+ if (s_feedVerifierState.deactivatedFeeds[feedId]) {
+ revert InactiveFeed(feedId);
+ }
+
+ // reportContext consists of:
+ // reportContext[0]: ConfigDigest
+ // reportContext[1]: 27 byte padding, 4-byte epoch and 1-byte round
+ // reportContext[2]: ExtraHash
+ bytes32 configDigest = reportContext[0];
+ Config storage s_config = s_feedVerifierState.s_verificationDataConfigs[configDigest];
+
+ _validateReport(configDigest, rs, ss, s_config);
+ _updateEpoch(reportContext, s_feedVerifierState);
+
+ bytes32 hashedReport = keccak256(reportData);
+
+ _verifySignatures(hashedReport, reportContext, rs, ss, rawVs, s_config);
+ emit ReportVerified(feedId, sender);
+
+ return reportData;
+ }
+
+ /// @notice Validates parameters of the report
+ /// @param configDigest Config digest from the report
+ /// @param rs R components from the report
+ /// @param ss S components from the report
+ /// @param config Config for the given feed ID keyed on the config digest
+ function _validateReport(
+ bytes32 configDigest,
+ bytes32[] memory rs,
+ bytes32[] memory ss,
+ Config storage config
+ ) private view {
+ uint8 expectedNumSignatures = config.f + 1;
+
+ if (!config.isActive) revert DigestInactive(configDigest);
+ if (rs.length != expectedNumSignatures) revert IncorrectSignatureCount(rs.length, expectedNumSignatures);
+ if (rs.length != ss.length) revert MismatchedSignatures(rs.length, ss.length);
+ }
+
+ /**
+ * @notice Conditionally update the epoch for a feed
+ * @param reportContext Report context containing the epoch and round
+ * @param feedVerifierState Feed verifier state to conditionally update
+ */
+ function _updateEpoch(bytes32[3] memory reportContext, VerifierState storage feedVerifierState) private {
+ uint40 epochAndRound = uint40(uint256(reportContext[1]));
+ uint32 epoch = uint32(epochAndRound >> 8);
+ if (epoch > feedVerifierState.latestEpoch) {
+ feedVerifierState.latestEpoch = epoch;
+ }
+ }
+
+ /// @notice Verifies that a report has been signed by the correct
+ /// signers and that enough signers have signed the reports.
+ /// @param hashedReport The keccak256 hash of the raw report's bytes
+ /// @param reportContext The context the report was signed in
+ /// @param rs ith element is the R components of the ith signature on report. Must have at most MAX_NUM_ORACLES entries
+ /// @param ss ith element is the S components of the ith signature on report. Must have at most MAX_NUM_ORACLES entries
+ /// @param rawVs ith element is the the V component of the ith signature
+ /// @param s_config The config digest the report was signed for
+ function _verifySignatures(
+ bytes32 hashedReport,
+ bytes32[3] memory reportContext,
+ bytes32[] memory rs,
+ bytes32[] memory ss,
+ bytes32 rawVs,
+ Config storage s_config
+ ) private view {
+ bytes32 h = keccak256(abi.encodePacked(hashedReport, reportContext));
+ // i-th byte counts number of sigs made by i-th signer
+ uint256 signedCount;
+
+ Signer memory o;
+ address signerAddress;
+ uint256 numSigners = rs.length;
+ for (uint256 i; i < numSigners; ++i) {
+ signerAddress = ecrecover(h, uint8(rawVs[i]) + 27, rs[i], ss[i]);
+ o = s_config.oracles[signerAddress];
+ if (o.role != Role.Signer) revert BadVerification();
+ unchecked {
+ signedCount += 1 << (8 * o.index);
+ }
+ }
+
+ if (signedCount & ORACLE_MASK != signedCount) revert BadVerification();
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function setConfig(
+ address[] memory signers,
+ bytes32[] memory offchainTransmitters,
+ uint8 f,
+ bytes memory onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes memory offchainConfig,
+ Common.AddressAndWeight[] memory recipientAddressesAndWeights
+ ) external override checkConfigValid(signers.length, f) onlyOwner {
+ _setConfig(
+ block.chainid,
+ address(this),
+ 0, // 0 defaults to feedConfig.configCount + 1
+ signers,
+ offchainTransmitters,
+ f,
+ onchainConfig,
+ offchainConfigVersion,
+ offchainConfig,
+ recipientAddressesAndWeights
+ );
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function setConfigFromSource(
+ uint256 sourceChainId,
+ address sourceAddress,
+ uint32 newConfigCount,
+ address[] memory signers,
+ bytes32[] memory offchainTransmitters,
+ uint8 f,
+ bytes memory onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes memory offchainConfig,
+ Common.AddressAndWeight[] memory recipientAddressesAndWeights
+ ) external override checkConfigValid(signers.length, f) onlyOwner {
+ _setConfig(
+ sourceChainId,
+ sourceAddress,
+ newConfigCount,
+ signers,
+ offchainTransmitters,
+ f,
+ onchainConfig,
+ offchainConfigVersion,
+ offchainConfig,
+ recipientAddressesAndWeights
+ );
+ }
+
+ /// @notice Sets config based on the given arguments
+ /// @param sourceChainId Chain ID of source config
+ /// @param sourceAddress Address of source config Verifier
+ /// @param newConfigCount Optional param to force the new config count
+ /// @param signers addresses with which oracles sign the reports
+ /// @param offchainTransmitters CSA key for the ith Oracle
+ /// @param f number of faulty oracles the system can tolerate
+ /// @param onchainConfig serialized configuration used by the contract (and possibly oracles)
+ /// @param offchainConfigVersion version number for offchainEncoding schema
+ /// @param offchainConfig serialized configuration used by the oracles exclusively and only passed through the contract
+ /// @param recipientAddressesAndWeights the addresses and weights of all the recipients to receive rewards
+ function _setConfig(
+ uint256 sourceChainId,
+ address sourceAddress,
+ uint32 newConfigCount,
+ address[] memory signers,
+ bytes32[] memory offchainTransmitters,
+ uint8 f,
+ bytes memory onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes memory offchainConfig,
+ Common.AddressAndWeight[] memory recipientAddressesAndWeights
+ ) internal {
+ // Increment the number of times a config has been set first
+ if (newConfigCount > 0) s_feedVerifierState.configCount = newConfigCount;
+ else s_feedVerifierState.configCount++;
+
+ bytes32 configDigest = _configDigestFromConfigData(
+ sourceChainId,
+ sourceAddress,
+ s_feedVerifierState.configCount,
+ signers,
+ offchainTransmitters,
+ f,
+ onchainConfig,
+ offchainConfigVersion,
+ offchainConfig
+ );
+
+ s_feedVerifierState.s_verificationDataConfigs[configDigest].f = f;
+ s_feedVerifierState.s_verificationDataConfigs[configDigest].isActive = true;
+ for (uint8 i; i < signers.length; ++i) {
+ address signerAddr = signers[i];
+ if (signerAddr == address(0)) revert ZeroAddress();
+
+ // All signer roles are unset by default for a new config digest.
+ // Here the contract checks to see if a signer's address has already
+ // been set to ensure that the group of signer addresses that will
+ // sign reports with the config digest are unique.
+ bool isSignerAlreadySet = s_feedVerifierState.s_verificationDataConfigs[configDigest].oracles[signerAddr].role !=
+ Role.Unset;
+ if (isSignerAlreadySet) revert NonUniqueSignatures();
+ s_feedVerifierState.s_verificationDataConfigs[configDigest].oracles[signerAddr] = Signer({
+ role: Role.Signer,
+ index: i
+ });
+ }
+
+ recipientAddressesAndWeights; // silence unused var warning
+ // IVerifierProxy(i_verifierProxyAddr).setVerifier(
+ // feedVerifierState.latestConfigDigest,
+ // configDigest,
+ // recipientAddressesAndWeights
+ // );
+
+ emit ConfigSet(
+ s_feedVerifierState.latestConfigBlockNumber,
+ configDigest,
+ s_feedVerifierState.configCount,
+ signers,
+ offchainTransmitters,
+ f,
+ onchainConfig,
+ offchainConfigVersion,
+ offchainConfig
+ );
+
+ s_feedVerifierState.latestEpoch = 0;
+ s_feedVerifierState.latestConfigBlockNumber = uint32(block.number);
+ s_feedVerifierState.latestConfigDigest = configDigest;
+ }
+
+ /// @notice Generates the config digest from config data
+ /// @param sourceChainId Chain ID of source config
+ /// @param sourceAddress Address of source config Verifier
+ /// @param configCount ordinal number of this config setting among all config settings over the life of this contract
+ /// @param signers ith element is address ith oracle uses to sign a report
+ /// @param offchainTransmitters ith element is address ith oracle used to transmit reports (in this case used for flexible additional field, such as CSA pub keys)
+ /// @param f maximum number of faulty/dishonest oracles the protocol can tolerate while still working correctly
+ /// @param onchainConfig serialized configuration used by the contract (and possibly oracles)
+ /// @param offchainConfigVersion version of the serialization format used for "offchainConfig" parameter
+ /// @param offchainConfig serialized configuration used by the oracles exclusively and only passed through the contract
+ /// @dev This function is a modified version of the method from OCR2Abstract
+ function _configDigestFromConfigData(
+ uint256 sourceChainId,
+ address sourceAddress,
+ uint64 configCount,
+ address[] memory signers,
+ bytes32[] memory offchainTransmitters,
+ uint8 f,
+ bytes memory onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes memory offchainConfig
+ ) internal pure returns (bytes32) {
+ uint256 h = uint256(
+ keccak256(
+ abi.encode(
+ sourceChainId,
+ sourceAddress,
+ configCount,
+ signers,
+ offchainTransmitters,
+ f,
+ onchainConfig,
+ offchainConfigVersion,
+ offchainConfig
+ )
+ )
+ );
+ uint256 prefixMask = type(uint256).max << (256 - 16); // 0xFFFF00..00
+ // 0x0009 corresponds to ConfigDigestPrefixLLO in libocr
+ uint256 prefix = 0x0009 << (256 - 16); // 0x000900..00
+ return bytes32((prefix & prefixMask) | (h & ~prefixMask));
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function activateConfig(bytes32 configDigest) external onlyOwner {
+ if (configDigest == bytes32("")) revert DigestEmpty();
+ if (s_feedVerifierState.s_verificationDataConfigs[configDigest].f == 0) revert DigestNotSet(configDigest);
+ s_feedVerifierState.s_verificationDataConfigs[configDigest].isActive = true;
+ emit ConfigActivated(configDigest);
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function deactivateConfig(bytes32 configDigest) external onlyOwner {
+ if (configDigest == bytes32("")) revert DigestEmpty();
+ if (s_feedVerifierState.s_verificationDataConfigs[configDigest].f == 0) revert DigestNotSet(configDigest);
+ if (configDigest == s_feedVerifierState.latestConfigDigest) {
+ revert CannotDeactivateLatestConfig(configDigest);
+ }
+ s_feedVerifierState.s_verificationDataConfigs[configDigest].isActive = false;
+ emit ConfigDeactivated(configDigest);
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function activateFeed(bytes32 feedId) external onlyOwner {
+ if (s_feedVerifierState.deactivatedFeeds[feedId]) return;
+
+ s_feedVerifierState.deactivatedFeeds[feedId] = false;
+ emit FeedActivated(feedId);
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function deactivateFeed(bytes32 feedId) external onlyOwner {
+ if (s_feedVerifierState.deactivatedFeeds[feedId] == false) return;
+
+ s_feedVerifierState.deactivatedFeeds[feedId] = true;
+ emit FeedDeactivated(feedId);
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function latestConfigDigestAndEpoch()
+ external
+ view
+ override
+ returns (bool scanLogs, bytes32 configDigest, uint32 epoch)
+ {
+ return (false, s_feedVerifierState.latestConfigDigest, s_feedVerifierState.latestEpoch);
+ }
+
+ /// @inheritdoc IChannelVerifier
+ function latestConfigDetails()
+ external
+ view
+ override
+ returns (uint32 configCount, uint32 blockNumber, bytes32 configDigest)
+ {
+ return (
+ s_feedVerifierState.configCount,
+ s_feedVerifierState.latestConfigBlockNumber,
+ s_feedVerifierState.latestConfigDigest
+ );
+ }
+}
diff --git a/contracts/src/v0.8/llo-feeds/dev/interfaces/IChannelConfigStore.sol b/contracts/src/v0.8/llo-feeds/dev/interfaces/IChannelConfigStore.sol
new file mode 100644
index 00000000000..97fafc2cb5c
--- /dev/null
+++ b/contracts/src/v0.8/llo-feeds/dev/interfaces/IChannelConfigStore.sol
@@ -0,0 +1,32 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.19;
+
+import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
+
+interface IChannelConfigStore is IERC165 {
+ // function setStagingConfig(bytes32 configDigest, ChannelConfiguration calldata channelConfig) external;
+
+ // function promoteStagingConfig(bytes32 configDigest) external;
+
+ function addChannel(uint32 channelId, ChannelDefinition calldata channelDefinition) external;
+
+ function removeChannel(uint32 channelId) external;
+
+ function getChannelDefinitions(uint32 channelId) external view returns (ChannelDefinition memory);
+
+ // struct ChannelConfiguration {
+ // bytes32 configDigest;
+ // }
+
+ struct ChannelDefinition {
+ // e.g. evm, solana, CosmWasm, kalechain, etc...
+ bytes8 reportFormat;
+ // Specifies the chain on which this channel can be verified. Currently uses
+ // CCIP chain selectors, but lots of other schemes are possible as well.
+ uint64 chainSelector;
+ // We assume that StreamIDs is always non-empty and that the 0-th stream
+ // contains the verification price in LINK and the 1-st stream contains the
+ // verification price in the native coin.
+ uint32[] streamIDs;
+ }
+}
diff --git a/contracts/src/v0.8/llo-feeds/dev/interfaces/IChannelVerifier.sol b/contracts/src/v0.8/llo-feeds/dev/interfaces/IChannelVerifier.sol
new file mode 100644
index 00000000000..6bab5912a70
--- /dev/null
+++ b/contracts/src/v0.8/llo-feeds/dev/interfaces/IChannelVerifier.sol
@@ -0,0 +1,111 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.19;
+
+import {IERC165} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
+import {Common} from "../../libraries/Common.sol";
+
+interface IChannelVerifier is IERC165 {
+ /**
+ * @notice Verifies that the data encoded has been signed
+ * correctly by routing to the correct verifier.
+ * @param signedReport The encoded data to be verified.
+ * @param sender The address that requested to verify the contract.
+ * This is only used for logging purposes.
+ * @dev Verification is typically only done through the proxy contract so
+ * we can't just use msg.sender to log the requester as the msg.sender
+ * contract will always be the proxy.
+ * @return verifierResponse The encoded verified response.
+ */
+ function verify(bytes calldata signedReport, address sender) external returns (bytes memory verifierResponse);
+
+ /**
+ * @notice sets offchain reporting protocol configuration incl. participating oracles
+ * @param signers addresses with which oracles sign the reports
+ * @param offchainTransmitters CSA key for the ith Oracle
+ * @param f number of faulty oracles the system can tolerate
+ * @param onchainConfig serialized configuration used by the contract (and possibly oracles)
+ * @param offchainConfigVersion version number for offchainEncoding schema
+ * @param offchainConfig serialized configuration used by the oracles exclusively and only passed through the contract
+ * @param recipientAddressesAndWeights the addresses and weights of all the recipients to receive rewards
+ */
+ function setConfig(
+ address[] memory signers,
+ bytes32[] memory offchainTransmitters,
+ uint8 f,
+ bytes memory onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes memory offchainConfig,
+ Common.AddressAndWeight[] memory recipientAddressesAndWeights
+ ) external;
+
+ /**
+ * @notice identical to `setConfig` except with args for sourceChainId and sourceAddress
+ * @param sourceChainId Chain ID of source config
+ * @param sourceAddress Address of source config Verifier
+ * @param newConfigCount Param to force the new config count
+ * @param signers addresses with which oracles sign the reports
+ * @param offchainTransmitters CSA key for the ith Oracle
+ * @param f number of faulty oracles the system can tolerate
+ * @param onchainConfig serialized configuration used by the contract (and possibly oracles)
+ * @param offchainConfigVersion version number for offchainEncoding schema
+ * @param offchainConfig serialized configuration used by the oracles exclusively and only passed through the contract
+ * @param recipientAddressesAndWeights the addresses and weights of all the recipients to receive rewards
+ */
+ function setConfigFromSource(
+ uint256 sourceChainId,
+ address sourceAddress,
+ uint32 newConfigCount,
+ address[] memory signers,
+ bytes32[] memory offchainTransmitters,
+ uint8 f,
+ bytes memory onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes memory offchainConfig,
+ Common.AddressAndWeight[] memory recipientAddressesAndWeights
+ ) external;
+
+ /**
+ * @notice Activates the configuration for a config digest
+ * @param configDigest The config digest to activate
+ * @dev This function can be called by the contract admin to activate a configuration.
+ */
+ function activateConfig(bytes32 configDigest) external;
+
+ /**
+ * @notice Deactivates the configuration for a config digest
+ * @param configDigest The config digest to deactivate
+ * @dev This function can be called by the contract admin to deactivate an incorrect configuration.
+ */
+ function deactivateConfig(bytes32 configDigest) external;
+
+ /**
+ * @notice Activates the given feed
+ * @param feedId Feed ID to activated
+ * @dev This function can be called by the contract admin to activate a feed
+ */
+ function activateFeed(bytes32 feedId) external;
+
+ /**
+ * @notice Deactivates the given feed
+ * @param feedId Feed ID to deactivated
+ * @dev This function can be called by the contract admin to deactivate a feed
+ */
+ function deactivateFeed(bytes32 feedId) external;
+
+ /**
+ * @notice returns the latest config digest and epoch
+ * @return scanLogs indicates whether to rely on the configDigest and epoch
+ * returned or whether to scan logs for the Transmitted event instead.
+ * @return configDigest
+ * @return epoch
+ */
+ function latestConfigDigestAndEpoch() external view returns (bool scanLogs, bytes32 configDigest, uint32 epoch);
+
+ /**
+ * @notice information about current offchain reporting protocol configuration
+ * @return configCount ordinal number of current config, out of all configs applied to this contract so far
+ * @return blockNumber block at which this config was set
+ * @return configDigest domain-separation tag for current config
+ */
+ function latestConfigDetails() external view returns (uint32 configCount, uint32 blockNumber, bytes32 configDigest);
+}
diff --git a/contracts/src/v0.8/llo-feeds/dev/test/mocks/ExposedChannelVerifier.sol b/contracts/src/v0.8/llo-feeds/dev/test/mocks/ExposedChannelVerifier.sol
new file mode 100644
index 00000000000..650b3b4a81e
--- /dev/null
+++ b/contracts/src/v0.8/llo-feeds/dev/test/mocks/ExposedChannelVerifier.sol
@@ -0,0 +1,66 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.19;
+
+// ExposedChannelVerifier exposes certain internal Verifier
+// methods/structures so that golang code can access them, and we get
+// reliable type checking on their usage
+contract ExposedChannelVerifier {
+ constructor() {}
+
+ function _configDigestFromConfigData(
+ uint256 chainId,
+ address contractAddress,
+ uint64 configCount,
+ address[] memory signers,
+ bytes32[] memory offchainTransmitters,
+ uint8 f,
+ bytes memory onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes memory offchainConfig
+ ) internal pure returns (bytes32) {
+ uint256 h = uint256(
+ keccak256(
+ abi.encode(
+ chainId,
+ contractAddress,
+ configCount,
+ signers,
+ offchainTransmitters,
+ f,
+ onchainConfig,
+ offchainConfigVersion,
+ offchainConfig
+ )
+ )
+ );
+ uint256 prefixMask = type(uint256).max << (256 - 16); // 0xFFFF00..00
+ // 0x0009 corresponds to ConfigDigestPrefixLLO in libocr
+ uint256 prefix = 0x0009 << (256 - 16); // 0x000900..00
+ return bytes32((prefix & prefixMask) | (h & ~prefixMask));
+ }
+
+ function exposedConfigDigestFromConfigData(
+ uint256 _chainId,
+ address _contractAddress,
+ uint64 _configCount,
+ address[] memory _signers,
+ bytes32[] memory _offchainTransmitters,
+ uint8 _f,
+ bytes calldata _onchainConfig,
+ uint64 _encodedConfigVersion,
+ bytes memory _encodedConfig
+ ) public pure returns (bytes32) {
+ return
+ _configDigestFromConfigData(
+ _chainId,
+ _contractAddress,
+ _configCount,
+ _signers,
+ _offchainTransmitters,
+ _f,
+ _onchainConfig,
+ _encodedConfigVersion,
+ _encodedConfig
+ );
+ }
+}
diff --git a/contracts/src/v0.8/llo-feeds/dev/test/mocks/ExposedVerifier.sol b/contracts/src/v0.8/llo-feeds/dev/test/mocks/ExposedVerifier.sol
new file mode 100644
index 00000000000..1c004bf3846
--- /dev/null
+++ b/contracts/src/v0.8/llo-feeds/dev/test/mocks/ExposedVerifier.sol
@@ -0,0 +1,69 @@
+// SPDX-License-Identifier: MIT
+pragma solidity 0.8.19;
+
+// ExposedVerifier exposes certain internal Verifier
+// methods/structures so that golang code can access them, and we get
+// reliable type checking on their usage
+contract ExposedVerifier {
+ constructor() {}
+
+ function _configDigestFromConfigData(
+ bytes32 feedId,
+ uint256 chainId,
+ address contractAddress,
+ uint64 configCount,
+ address[] memory signers,
+ bytes32[] memory offchainTransmitters,
+ uint8 f,
+ bytes memory onchainConfig,
+ uint64 offchainConfigVersion,
+ bytes memory offchainConfig
+ ) internal pure returns (bytes32) {
+ uint256 h = uint256(
+ keccak256(
+ abi.encode(
+ feedId,
+ chainId,
+ contractAddress,
+ configCount,
+ signers,
+ offchainTransmitters,
+ f,
+ onchainConfig,
+ offchainConfigVersion,
+ offchainConfig
+ )
+ )
+ );
+ uint256 prefixMask = type(uint256).max << (256 - 16); // 0xFFFF00..00
+ uint256 prefix = 0x0006 << (256 - 16); // 0x000600..00
+ return bytes32((prefix & prefixMask) | (h & ~prefixMask));
+ }
+
+ function exposedConfigDigestFromConfigData(
+ bytes32 _feedId,
+ uint256 _chainId,
+ address _contractAddress,
+ uint64 _configCount,
+ address[] memory _signers,
+ bytes32[] memory _offchainTransmitters,
+ uint8 _f,
+ bytes calldata _onchainConfig,
+ uint64 _encodedConfigVersion,
+ bytes memory _encodedConfig
+ ) public pure returns (bytes32) {
+ return
+ _configDigestFromConfigData(
+ _feedId,
+ _chainId,
+ _contractAddress,
+ _configCount,
+ _signers,
+ _offchainTransmitters,
+ _f,
+ _onchainConfig,
+ _encodedConfigVersion,
+ _encodedConfig
+ );
+ }
+}
diff --git a/contracts/src/v0.8/llo-feeds/interfaces/IFeeManager.sol b/contracts/src/v0.8/llo-feeds/interfaces/IFeeManager.sol
index e006f0254eb..4095607b911 100644
--- a/contracts/src/v0.8/llo-feeds/interfaces/IFeeManager.sol
+++ b/contracts/src/v0.8/llo-feeds/interfaces/IFeeManager.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
diff --git a/contracts/src/v0.8/llo-feeds/interfaces/IRewardManager.sol b/contracts/src/v0.8/llo-feeds/interfaces/IRewardManager.sol
index 7a4d4216715..5a6e03f1c9a 100644
--- a/contracts/src/v0.8/llo-feeds/interfaces/IRewardManager.sol
+++ b/contracts/src/v0.8/llo-feeds/interfaces/IRewardManager.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
diff --git a/contracts/src/v0.8/llo-feeds/interfaces/IVerifier.sol b/contracts/src/v0.8/llo-feeds/interfaces/IVerifier.sol
index 9e1e6d314cd..617d702d3f8 100644
--- a/contracts/src/v0.8/llo-feeds/interfaces/IVerifier.sol
+++ b/contracts/src/v0.8/llo-feeds/interfaces/IVerifier.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
diff --git a/contracts/src/v0.8/llo-feeds/interfaces/IVerifierFeeManager.sol b/contracts/src/v0.8/llo-feeds/interfaces/IVerifierFeeManager.sol
index 323b8a2cf00..522db952e5d 100644
--- a/contracts/src/v0.8/llo-feeds/interfaces/IVerifierFeeManager.sol
+++ b/contracts/src/v0.8/llo-feeds/interfaces/IVerifierFeeManager.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {IERC165} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC165.sol";
import {Common} from "../libraries/Common.sol";
diff --git a/contracts/src/v0.8/llo-feeds/interfaces/IVerifierProxy.sol b/contracts/src/v0.8/llo-feeds/interfaces/IVerifierProxy.sol
index d86bb46dd9c..2eb1b4aff4b 100644
--- a/contracts/src/v0.8/llo-feeds/interfaces/IVerifierProxy.sol
+++ b/contracts/src/v0.8/llo-feeds/interfaces/IVerifierProxy.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {Common} from "../libraries/Common.sol";
import {AccessControllerInterface} from "../../shared/interfaces/AccessControllerInterface.sol";
diff --git a/contracts/src/v0.8/llo-feeds/libraries/ByteUtil.sol b/contracts/src/v0.8/llo-feeds/libraries/ByteUtil.sol
index 53f79b6dc42..c1b59a94a81 100644
--- a/contracts/src/v0.8/llo-feeds/libraries/ByteUtil.sol
+++ b/contracts/src/v0.8/llo-feeds/libraries/ByteUtil.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
/*
* @title ByteUtil
diff --git a/contracts/src/v0.8/llo-feeds/libraries/Common.sol b/contracts/src/v0.8/llo-feeds/libraries/Common.sol
index fe04a9af71b..f732ced004b 100644
--- a/contracts/src/v0.8/llo-feeds/libraries/Common.sol
+++ b/contracts/src/v0.8/llo-feeds/libraries/Common.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
/*
* @title Common
diff --git a/contracts/src/v0.8/llo-feeds/test/ByteUtilTest.t.sol b/contracts/src/v0.8/llo-feeds/test/ByteUtilTest.t.sol
index b4e87364ac9..21bd957e4e1 100644
--- a/contracts/src/v0.8/llo-feeds/test/ByteUtilTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/ByteUtilTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {Test} from "forge-std/Test.sol";
import {ByteUtil} from "../libraries/ByteUtil.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager/BaseFeeManager.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager/BaseFeeManager.t.sol
index db0b3d8b3d9..edde26b2ee1 100644
--- a/contracts/src/v0.8/llo-feeds/test/fee-manager/BaseFeeManager.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/fee-manager/BaseFeeManager.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {Test} from "forge-std/Test.sol";
import {FeeManager} from "../../FeeManager.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.general.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.general.t.sol
index e2c9916f663..571d34823f4 100644
--- a/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.general.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.general.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import "./BaseFeeManager.t.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.getFeeAndReward.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.getFeeAndReward.t.sol
index 6a24806353d..299a7f09d51 100644
--- a/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.getFeeAndReward.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.getFeeAndReward.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {Common} from "../../libraries/Common.sol";
import "./BaseFeeManager.t.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.processFee.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.processFee.t.sol
index e0093b88a4f..f8c1d47d4d0 100644
--- a/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.processFee.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.processFee.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {Common} from "../../libraries/Common.sol";
import "./BaseFeeManager.t.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.processFeeBulk.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.processFeeBulk.t.sol
index 3570b8824a8..fa77b98d3cf 100644
--- a/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.processFeeBulk.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/fee-manager/FeeManager.processFeeBulk.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import "./BaseFeeManager.t.sol";
import {IRewardManager} from "../../interfaces/IRewardManager.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/gas/Gas_VerifierTest.t.sol b/contracts/src/v0.8/llo-feeds/test/gas/Gas_VerifierTest.t.sol
index 6938437b013..29b488fb328 100644
--- a/contracts/src/v0.8/llo-feeds/test/gas/Gas_VerifierTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/gas/Gas_VerifierTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTest, BaseTestWithConfiguredVerifierAndFeeManager} from "../verifier/BaseVerifierTest.t.sol";
import {SimpleWriteAccessController} from "../../../shared/access/SimpleWriteAccessController.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/mocks/ErroredVerifier.sol b/contracts/src/v0.8/llo-feeds/test/mocks/ErroredVerifier.sol
index 770b7b809d0..01cb1a50611 100644
--- a/contracts/src/v0.8/llo-feeds/test/mocks/ErroredVerifier.sol
+++ b/contracts/src/v0.8/llo-feeds/test/mocks/ErroredVerifier.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {IVerifier} from "../../interfaces/IVerifier.sol";
import {Common} from "../../libraries/Common.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/mocks/ExposedVerifier.sol b/contracts/src/v0.8/llo-feeds/test/mocks/ExposedVerifier.sol
index 88089cc66a2..1c004bf3846 100644
--- a/contracts/src/v0.8/llo-feeds/test/mocks/ExposedVerifier.sol
+++ b/contracts/src/v0.8/llo-feeds/test/mocks/ExposedVerifier.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
// ExposedVerifier exposes certain internal Verifier
// methods/structures so that golang code can access them, and we get
diff --git a/contracts/src/v0.8/llo-feeds/test/mocks/FeeManagerProxy.sol b/contracts/src/v0.8/llo-feeds/test/mocks/FeeManagerProxy.sol
index e39f1a021f7..16935f69d6b 100644
--- a/contracts/src/v0.8/llo-feeds/test/mocks/FeeManagerProxy.sol
+++ b/contracts/src/v0.8/llo-feeds/test/mocks/FeeManagerProxy.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: MIT
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import "../../interfaces/IFeeManager.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/reward-manager/BaseRewardManager.t.sol b/contracts/src/v0.8/llo-feeds/test/reward-manager/BaseRewardManager.t.sol
index a9953d73c74..65481513f0d 100644
--- a/contracts/src/v0.8/llo-feeds/test/reward-manager/BaseRewardManager.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/reward-manager/BaseRewardManager.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {Test} from "forge-std/Test.sol";
import {ERC20Mock} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/mocks/ERC20Mock.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.claim.t.sol b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.claim.t.sol
index a6c98c03031..5f07d36c72c 100644
--- a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.claim.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.claim.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseRewardManagerTest} from "./BaseRewardManager.t.sol";
import {Common} from "../../libraries/Common.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.general.t.sol b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.general.t.sol
index e7bc43dc81d..7fde76d5281 100644
--- a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.general.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.general.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseRewardManagerTest} from "./BaseRewardManager.t.sol";
import {RewardManager} from "../../RewardManager.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.payRecipients.t.sol b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.payRecipients.t.sol
index 0f94805da69..89fac663ba3 100644
--- a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.payRecipients.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.payRecipients.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseRewardManagerTest} from "./BaseRewardManager.t.sol";
import {IRewardManager} from "../../interfaces/IRewardManager.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.setRecipients.t.sol b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.setRecipients.t.sol
index a8cf6260f5c..1cf5b51f621 100644
--- a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.setRecipients.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.setRecipients.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseRewardManagerTest} from "./BaseRewardManager.t.sol";
import {Common} from "../../libraries/Common.sol";
@@ -31,6 +31,21 @@ contract RewardManagerSetRecipientsTest is BaseRewardManagerTest {
setRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
}
+ function test_setRewardRecipientWithZeroWeight() public {
+ //array of recipients
+ Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](5);
+
+ //init each recipient with even weights
+ recipients[0] = Common.AddressAndWeight(DEFAULT_RECIPIENT_1, ONE_PERCENT * 25);
+ recipients[1] = Common.AddressAndWeight(DEFAULT_RECIPIENT_2, ONE_PERCENT * 25);
+ recipients[2] = Common.AddressAndWeight(DEFAULT_RECIPIENT_3, ONE_PERCENT * 25);
+ recipients[3] = Common.AddressAndWeight(DEFAULT_RECIPIENT_4, ONE_PERCENT * 25);
+ recipients[4] = Common.AddressAndWeight(DEFAULT_RECIPIENT_5, 0);
+
+ //set the recipients
+ setRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
+ }
+
function test_setRewardRecipientWithZeroAddress() public {
//array of recipients
Common.AddressAndWeight[] memory recipients = getPrimaryRecipients();
diff --git a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.updateRewardRecipients.t.sol b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.updateRewardRecipients.t.sol
index b1836e0fb93..6c51a0fbfdd 100644
--- a/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.updateRewardRecipients.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/reward-manager/RewardManager.updateRewardRecipients.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseRewardManagerTest} from "./BaseRewardManager.t.sol";
import {Common} from "../../libraries/Common.sol";
@@ -105,6 +105,131 @@ contract RewardManagerUpdateRewardRecipientsTest is BaseRewardManagerTest {
updateRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
}
+ function test_updateRecipientsToDifferentSet() public {
+ //create a list of containing recipients from the primary configured set, and new recipients
+ Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](getPrimaryRecipients().length + 4);
+ for (uint256 i; i < getPrimaryRecipients().length; i++) {
+ //copy the recipient and set the weight to 0 which implies the recipient is being replaced
+ recipients[i] = Common.AddressAndWeight(getPrimaryRecipients()[i].addr, 0);
+ }
+
+ //add the new recipients individually
+ recipients[4] = Common.AddressAndWeight(DEFAULT_RECIPIENT_5, ONE_PERCENT * 25);
+ recipients[5] = Common.AddressAndWeight(DEFAULT_RECIPIENT_6, ONE_PERCENT * 25);
+ recipients[6] = Common.AddressAndWeight(DEFAULT_RECIPIENT_7, ONE_PERCENT * 25);
+ recipients[7] = Common.AddressAndWeight(DEFAULT_RECIPIENT_8, ONE_PERCENT * 25);
+
+ //updating a recipient should force the funds to be paid out for the primary recipients
+ updateRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
+ }
+
+ function test_updateRecipientsToDifferentPartialSet() public {
+ //create a list of containing recipients from the primary configured set, and new recipients
+ Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](getPrimaryRecipients().length + 2);
+ for (uint256 i; i < getPrimaryRecipients().length; i++) {
+ //copy the recipient and set the weight to 0 which implies the recipient is being replaced
+ recipients[i] = Common.AddressAndWeight(getPrimaryRecipients()[i].addr, 0);
+ }
+
+ //add the new recipients individually
+ recipients[4] = Common.AddressAndWeight(DEFAULT_RECIPIENT_5, FIFTY_PERCENT);
+ recipients[5] = Common.AddressAndWeight(DEFAULT_RECIPIENT_6, FIFTY_PERCENT);
+
+ //updating a recipient should force the funds to be paid out for the primary recipients
+ updateRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
+ }
+
+ function test_updateRecipientsToDifferentLargerSet() public {
+ //create a list of containing recipients from the primary configured set, and new recipients
+ Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](getPrimaryRecipients().length + 5);
+ for (uint256 i; i < getPrimaryRecipients().length; i++) {
+ //copy the recipient and set the weight to 0 which implies the recipient is being replaced
+ recipients[i] = Common.AddressAndWeight(getPrimaryRecipients()[i].addr, 0);
+ }
+
+ //add the new recipients individually
+ recipients[4] = Common.AddressAndWeight(DEFAULT_RECIPIENT_5, TEN_PERCENT * 2);
+ recipients[5] = Common.AddressAndWeight(DEFAULT_RECIPIENT_6, TEN_PERCENT * 2);
+ recipients[6] = Common.AddressAndWeight(DEFAULT_RECIPIENT_7, TEN_PERCENT * 2);
+ recipients[7] = Common.AddressAndWeight(DEFAULT_RECIPIENT_8, TEN_PERCENT * 2);
+ recipients[8] = Common.AddressAndWeight(DEFAULT_RECIPIENT_9, TEN_PERCENT * 2);
+
+ //updating a recipient should force the funds to be paid out for the primary recipients
+ updateRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
+ }
+
+ function test_updateRecipientsUpdateAndRemoveExistingForLargerSet() public {
+ //create a list of containing recipients from the primary configured set, and new recipients
+ Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](9);
+
+ //update the existing recipients
+ recipients[0] = Common.AddressAndWeight(getPrimaryRecipients()[0].addr, 0);
+ recipients[1] = Common.AddressAndWeight(getPrimaryRecipients()[1].addr, 0);
+ recipients[2] = Common.AddressAndWeight(getPrimaryRecipients()[2].addr, TEN_PERCENT * 3);
+ recipients[3] = Common.AddressAndWeight(getPrimaryRecipients()[3].addr, TEN_PERCENT * 3);
+
+ //add the new recipients individually
+ recipients[4] = Common.AddressAndWeight(DEFAULT_RECIPIENT_5, TEN_PERCENT);
+ recipients[5] = Common.AddressAndWeight(DEFAULT_RECIPIENT_6, TEN_PERCENT);
+ recipients[6] = Common.AddressAndWeight(DEFAULT_RECIPIENT_7, TEN_PERCENT);
+ recipients[7] = Common.AddressAndWeight(DEFAULT_RECIPIENT_8, TEN_PERCENT);
+ recipients[8] = Common.AddressAndWeight(DEFAULT_RECIPIENT_9, TEN_PERCENT);
+
+ //should revert as the weight does not equal 100%
+ vm.expectRevert(INVALID_WEIGHT_ERROR_SELECTOR);
+
+ //updating a recipient should force the funds to be paid out for the primary recipients
+ updateRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
+ }
+
+ function test_updateRecipientsUpdateAndRemoveExistingForSmallerSet() public {
+ //create a list of containing recipients from the primary configured set, and new recipients
+ Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](5);
+
+ //update the existing recipients
+ recipients[0] = Common.AddressAndWeight(getPrimaryRecipients()[0].addr, 0);
+ recipients[1] = Common.AddressAndWeight(getPrimaryRecipients()[1].addr, 0);
+ recipients[2] = Common.AddressAndWeight(getPrimaryRecipients()[2].addr, TEN_PERCENT * 3);
+ recipients[3] = Common.AddressAndWeight(getPrimaryRecipients()[3].addr, TEN_PERCENT * 2);
+
+ //add the new recipients individually
+ recipients[4] = Common.AddressAndWeight(DEFAULT_RECIPIENT_5, TEN_PERCENT * 5);
+
+ //updating a recipient should force the funds to be paid out for the primary recipients
+ updateRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
+ }
+
+ function test_updateRecipientsToDifferentSetWithInvalidWeights() public {
+ //create a list of containing recipients from the primary configured set, and new recipients
+ Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](getPrimaryRecipients().length + 2);
+ for (uint256 i; i < getPrimaryRecipients().length; i++) {
+ //copy the recipient and set the weight to 0 which implies the recipient is being replaced
+ recipients[i] = Common.AddressAndWeight(getPrimaryRecipients()[i].addr, 0);
+ }
+
+ //add the new recipients individually
+ recipients[4] = Common.AddressAndWeight(DEFAULT_RECIPIENT_5, TEN_PERCENT * 5);
+ recipients[5] = Common.AddressAndWeight(DEFAULT_RECIPIENT_6, TEN_PERCENT);
+
+ //should revert as the weight will not equal 100%
+ vm.expectRevert(INVALID_WEIGHT_ERROR_SELECTOR);
+
+ //updating a recipient should force the funds to be paid out for the primary recipients
+ updateRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
+ }
+
+ function test_updatePartialRecipientsToSubset() public {
+ //create a list of containing recipients from the primary configured set, and new recipients
+ Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](4);
+ recipients[0] = Common.AddressAndWeight(DEFAULT_RECIPIENT_1, 0);
+ recipients[1] = Common.AddressAndWeight(DEFAULT_RECIPIENT_2, 0);
+ recipients[2] = Common.AddressAndWeight(DEFAULT_RECIPIENT_3, TEN_PERCENT * 5);
+ recipients[3] = Common.AddressAndWeight(DEFAULT_RECIPIENT_4, TEN_PERCENT * 5);
+
+ //updating a recipient should force the funds to be paid out for the primary recipients
+ updateRewardRecipients(PRIMARY_POOL_ID, recipients, ADMIN);
+ }
+
function test_updatePartialRecipientsWithUnderWeightSet() public {
//create a list of containing recipients from the primary configured set, and new recipients
Common.AddressAndWeight[] memory recipients = new Common.AddressAndWeight[](4);
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/BaseVerifierTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/BaseVerifierTest.t.sol
index 34e2090115d..daf31875036 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/BaseVerifierTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/BaseVerifierTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {Test} from "forge-std/Test.sol";
import {VerifierProxy} from "../../VerifierProxy.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierActivateConfigTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierActivateConfigTest.t.sol
index 8838beded9d..f53c26ba192 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierActivateConfigTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierActivateConfigTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTestWithConfiguredVerifierAndFeeManager, BaseTestWithMultipleConfiguredDigests} from "./BaseVerifierTest.t.sol";
import {Verifier} from "../../Verifier.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierDeactivateFeedTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierDeactivateFeedTest.t.sol
index 70e65a60300..97647c88635 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierDeactivateFeedTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierDeactivateFeedTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTestWithConfiguredVerifierAndFeeManager, BaseTestWithMultipleConfiguredDigests} from "./BaseVerifierTest.t.sol";
import {Verifier} from "../../Verifier.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyConstructorTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyConstructorTest.t.sol
index 8410d655897..b085dc8a651 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyConstructorTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyConstructorTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTest} from "./BaseVerifierTest.t.sol";
import {VerifierProxy} from "../../VerifierProxy.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyInitializeVerifierTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyInitializeVerifierTest.t.sol
index f73d93af18c..e02b14fe56e 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyInitializeVerifierTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyInitializeVerifierTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTest} from "./BaseVerifierTest.t.sol";
import {VerifierProxy} from "../../VerifierProxy.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxySetAccessControllerTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxySetAccessControllerTest.t.sol
index c9799e375c9..04889e0d5f4 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxySetAccessControllerTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxySetAccessControllerTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTest} from "./BaseVerifierTest.t.sol";
import {AccessControllerInterface} from "../../../shared/interfaces/AccessControllerInterface.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxySetVerifierTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxySetVerifierTest.t.sol
index 17fc49979e7..ea23f880ba7 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxySetVerifierTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxySetVerifierTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTestWithConfiguredVerifierAndFeeManager} from "./BaseVerifierTest.t.sol";
import {IVerifier} from "../../interfaces/IVerifier.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyTest.t.sol
index 9b5f94acd4b..ea7e02d7409 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTestWithConfiguredVerifierAndFeeManager} from "./BaseVerifierTest.t.sol";
import {VerifierProxy} from "../../VerifierProxy.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyUnsetVerifierTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyUnsetVerifierTest.t.sol
index 95a42e52edc..746aa955748 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyUnsetVerifierTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierProxyUnsetVerifierTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTest, BaseTestWithConfiguredVerifierAndFeeManager} from "./BaseVerifierTest.t.sol";
import {VerifierProxy} from "../../VerifierProxy.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierSetConfigFromSourceTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierSetConfigFromSourceTest.t.sol
index ba3acce0eec..0cd5902161d 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierSetConfigFromSourceTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierSetConfigFromSourceTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTest, BaseTestWithMultipleConfiguredDigests} from "./BaseVerifierTest.t.sol";
import {Common} from "../../libraries/Common.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierSetConfigTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierSetConfigTest.t.sol
index 374a976786b..a4e15dcdd4c 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierSetConfigTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierSetConfigTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTest, BaseTestWithMultipleConfiguredDigests} from "./BaseVerifierTest.t.sol";
import {Verifier} from "../../Verifier.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierTest.t.sol
index 290eaa1d568..2857b8f4d3d 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTest} from "./BaseVerifierTest.t.sol";
import {Verifier} from "../../Verifier.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierTestBillingReport.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierTestBillingReport.t.sol
index 52281298d48..ad67a239ba8 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierTestBillingReport.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierTestBillingReport.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTestWithConfiguredVerifierAndFeeManager} from "./BaseVerifierTest.t.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierUnsetConfigTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierUnsetConfigTest.t.sol
index 41c484a8787..cc3c33331df 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierUnsetConfigTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierUnsetConfigTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTestWithMultipleConfiguredDigests} from "./BaseVerifierTest.t.sol";
import {Verifier} from "../../Verifier.sol";
diff --git a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierVerifyTest.t.sol b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierVerifyTest.t.sol
index 34e02bcfb95..db7be5ca543 100644
--- a/contracts/src/v0.8/llo-feeds/test/verifier/VerifierVerifyTest.t.sol
+++ b/contracts/src/v0.8/llo-feeds/test/verifier/VerifierVerifyTest.t.sol
@@ -1,5 +1,5 @@
// SPDX-License-Identifier: UNLICENSED
-pragma solidity 0.8.16;
+pragma solidity 0.8.19;
import {BaseTestWithConfiguredVerifierAndFeeManager} from "./BaseVerifierTest.t.sol";
import {Verifier} from "../../Verifier.sol";
diff --git a/contracts/src/v0.8/tests/MockChainModule.sol b/contracts/src/v0.8/tests/MockChainModule.sol
new file mode 100644
index 00000000000..192e86e9a88
--- /dev/null
+++ b/contracts/src/v0.8/tests/MockChainModule.sol
@@ -0,0 +1,28 @@
+// SPDX-License-Identifier: BUSL-1.1
+pragma solidity ^0.8.16;
+
+import {IChainModule} from "../automation/dev/interfaces/v2_2/IChainModule.sol";
+
+contract MockChainModule is IChainModule {
+ //uint256 internal blockNum;
+
+ function blockNumber() external view returns (uint256) {
+ return 1256;
+ }
+
+ function blockHash(uint256 blocknumber) external view returns (bytes32) {
+ require(1000 >= blocknumber, "block too old");
+
+ return keccak256(abi.encode(blocknumber));
+ }
+
+ function getCurrentL1Fee() external view returns (uint256) {
+ return 0;
+ }
+
+ // retrieve the L1 data fee for a L2 simulation. it should return 0 for L1 chains and
+ // L2 chains which don't have L1 fee component.
+ function getMaxL1Fee(uint256 dataSize) external view returns (uint256) {
+ return 0;
+ }
+}
diff --git a/contracts/src/v0.8/vendor/@scroll-tech/contracts/src/L2/predeploys/IScrollL1GasPriceOracle.sol b/contracts/src/v0.8/vendor/@scroll-tech/contracts/src/L2/predeploys/IScrollL1GasPriceOracle.sol
new file mode 100644
index 00000000000..95b88e98456
--- /dev/null
+++ b/contracts/src/v0.8/vendor/@scroll-tech/contracts/src/L2/predeploys/IScrollL1GasPriceOracle.sol
@@ -0,0 +1,55 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.16;
+
+interface IScrollL1GasPriceOracle {
+ /**********
+ * Events *
+ **********/
+
+ /// @notice Emitted when current fee overhead is updated.
+ /// @param overhead The current fee overhead updated.
+ event OverheadUpdated(uint256 overhead);
+
+ /// @notice Emitted when current fee scalar is updated.
+ /// @param scalar The current fee scalar updated.
+ event ScalarUpdated(uint256 scalar);
+
+ /// @notice Emitted when current l1 base fee is updated.
+ /// @param l1BaseFee The current l1 base fee updated.
+ event L1BaseFeeUpdated(uint256 l1BaseFee);
+
+ /*************************
+ * Public View Functions *
+ *************************/
+
+ /// @notice Return the current l1 fee overhead.
+ function overhead() external view returns (uint256);
+
+ /// @notice Return the current l1 fee scalar.
+ function scalar() external view returns (uint256);
+
+ /// @notice Return the latest known l1 base fee.
+ function l1BaseFee() external view returns (uint256);
+
+ /// @notice Computes the L1 portion of the fee based on the size of the rlp encoded input
+ /// transaction, the current L1 base fee, and the various dynamic parameters.
+ /// @param data Unsigned fully RLP-encoded transaction to get the L1 fee for.
+ /// @return L1 fee that should be paid for the tx
+ function getL1Fee(bytes memory data) external view returns (uint256);
+
+ /// @notice Computes the amount of L1 gas used for a transaction. Adds the overhead which
+ /// represents the per-transaction gas overhead of posting the transaction and state
+ /// roots to L1. Adds 74 bytes of padding to account for the fact that the input does
+ /// not have a signature.
+ /// @param data Unsigned fully RLP-encoded transaction to get the L1 gas for.
+ /// @return Amount of L1 gas used to publish the transaction.
+ function getL1GasUsed(bytes memory data) external view returns (uint256);
+
+ /*****************************
+ * Public Mutating Functions *
+ *****************************/
+
+ /// @notice Allows whitelisted caller to modify the l1 base fee.
+ /// @param _l1BaseFee New l1 base fee.
+ function setL1BaseFee(uint256 _l1BaseFee) external;
+}
\ No newline at end of file
diff --git a/contracts/src/v0.8/vrf/dev/BatchVRFCoordinatorV2Plus.sol b/contracts/src/v0.8/vrf/dev/BatchVRFCoordinatorV2Plus.sol
index 06c44d4dcd1..3e6a5095bc7 100644
--- a/contracts/src/v0.8/vrf/dev/BatchVRFCoordinatorV2Plus.sol
+++ b/contracts/src/v0.8/vrf/dev/BatchVRFCoordinatorV2Plus.sol
@@ -29,7 +29,7 @@ contract BatchVRFCoordinatorV2Plus {
// solhint-disable-next-line custom-errors
require(proofs.length == rcs.length, "input array arg lengths mismatch");
for (uint256 i = 0; i < proofs.length; i++) {
- try COORDINATOR.fulfillRandomWords(proofs[i], rcs[i]) returns (uint96 /* payment */) {
+ try COORDINATOR.fulfillRandomWords(proofs[i], rcs[i], false) returns (uint96 /* payment */) {
continue;
} catch Error(string memory reason) {
uint256 requestId = _getRequestIdFromProof(proofs[i]);
@@ -62,6 +62,7 @@ contract BatchVRFCoordinatorV2Plus {
interface IVRFCoordinatorV2Plus {
function fulfillRandomWords(
VRFTypes.Proof memory proof,
- VRFTypes.RequestCommitmentV2Plus memory rc
+ VRFTypes.RequestCommitmentV2Plus memory rc,
+ bool onlyPremium
) external returns (uint96);
}
diff --git a/contracts/src/v0.8/vrf/dev/SubscriptionAPI.sol b/contracts/src/v0.8/vrf/dev/SubscriptionAPI.sol
index 9d4acecdef9..8a634f904a8 100644
--- a/contracts/src/v0.8/vrf/dev/SubscriptionAPI.sol
+++ b/contracts/src/v0.8/vrf/dev/SubscriptionAPI.sol
@@ -114,15 +114,32 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
// 6685 + // Positive static costs of argument encoding etc. note that it varies by +/- x*12 for every x bytes of non-zero data in the proof.
// Total: 37,185 gas.
uint32 gasAfterPaymentCalculation;
+ // Flat fee charged per fulfillment in millionths of native.
+ // So fee range is [0, 2^32/10^6].
+ uint32 fulfillmentFlatFeeNativePPM;
+ // Discount relative to fulfillmentFlatFeeNativePPM for link payment in millionths of native
+ // Should not exceed fulfillmentFlatFeeNativePPM
+ // So fee range is [0, 2^32/10^6].
+ uint32 fulfillmentFlatFeeLinkDiscountPPM;
+ // nativePremiumPercentage is the percentage of the total gas costs that is added to the final premium for native payment
+ // nativePremiumPercentage = 10 means 10% of the total gas costs is added. only integral percentage is allowed
+ uint8 nativePremiumPercentage;
+ // linkPremiumPercentage is the percentage of total gas costs that is added to the final premium for link payment
+ // linkPremiumPercentage = 10 means 10% of the total gas costs is added. only integral percentage is allowed
+ uint8 linkPremiumPercentage;
}
Config public s_config;
error Reentrant();
modifier nonReentrant() {
+ _nonReentrant();
+ _;
+ }
+
+ function _nonReentrant() internal view {
if (s_config.reentrancyLock) {
revert Reentrant();
}
- _;
}
constructor() ConfirmedOwner(msg.sender) {}
@@ -148,10 +165,11 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
* @dev notably can be called even if there are pending requests, outstanding ones may fail onchain
*/
function ownerCancelSubscription(uint256 subId) external onlyOwner {
- if (s_subscriptionConfigs[subId].owner == address(0)) {
+ address owner = s_subscriptionConfigs[subId].owner;
+ if (owner == address(0)) {
revert InvalidSubscription();
}
- _cancelSubscriptionHelper(subId, s_subscriptionConfigs[subId].owner);
+ _cancelSubscriptionHelper(subId, owner);
}
/**
@@ -289,14 +307,15 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
override
returns (uint96 balance, uint96 nativeBalance, uint64 reqCount, address owner, address[] memory consumers)
{
- if (s_subscriptionConfigs[subId].owner == address(0)) {
+ owner = s_subscriptionConfigs[subId].owner;
+ if (owner == address(0)) {
revert InvalidSubscription();
}
return (
s_subscriptions[subId].balance,
s_subscriptions[subId].nativeBalance,
s_subscriptions[subId].reqCount,
- s_subscriptionConfigs[subId].owner,
+ owner,
s_subscriptionConfigs[subId].consumers
);
}
@@ -307,13 +326,14 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
function getActiveSubscriptionIds(
uint256 startIndex,
uint256 maxCount
- ) external view override returns (uint256[] memory) {
+ ) external view override returns (uint256[] memory ids) {
uint256 numSubs = s_subIds.length();
if (startIndex >= numSubs) revert IndexOutOfRange();
uint256 endIndex = startIndex + maxCount;
endIndex = endIndex > numSubs || maxCount == 0 ? numSubs : endIndex;
- uint256[] memory ids = new uint256[](endIndex - startIndex);
- for (uint256 idx = 0; idx < ids.length; idx++) {
+ uint256 idsLength = endIndex - startIndex;
+ ids = new uint256[](idsLength);
+ for (uint256 idx = 0; idx < idsLength; ++idx) {
ids[idx] = s_subIds.at(idx + startIndex);
}
return ids;
@@ -322,13 +342,14 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
/**
* @inheritdoc IVRFSubscriptionV2Plus
*/
- function createSubscription() external override nonReentrant returns (uint256) {
+ function createSubscription() external override nonReentrant returns (uint256 subId) {
// Generate a subscription id that is globally unique.
- uint256 subId = uint256(
- keccak256(abi.encodePacked(msg.sender, blockhash(block.number - 1), address(this), s_currentSubNonce))
+ uint64 currentSubNonce = s_currentSubNonce;
+ subId = uint256(
+ keccak256(abi.encodePacked(msg.sender, blockhash(block.number - 1), address(this), currentSubNonce))
);
// Increment the subscription nonce counter.
- s_currentSubNonce++;
+ s_currentSubNonce = currentSubNonce + 1;
// Initialize storage variables.
address[] memory consumers = new address[](0);
s_subscriptions[subId] = Subscription({balance: 0, nativeBalance: 0, reqCount: 0});
@@ -352,8 +373,9 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
address newOwner
) external override onlySubOwner(subId) nonReentrant {
// Proposing to address(0) would never be claimable so don't need to check.
- if (s_subscriptionConfigs[subId].requestedOwner != newOwner) {
- s_subscriptionConfigs[subId].requestedOwner = newOwner;
+ SubscriptionConfig storage subscriptionConfig = s_subscriptionConfigs[subId];
+ if (subscriptionConfig.requestedOwner != newOwner) {
+ subscriptionConfig.requestedOwner = newOwner;
emit SubscriptionOwnerTransferRequested(subId, msg.sender, newOwner);
}
}
@@ -362,13 +384,13 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
* @inheritdoc IVRFSubscriptionV2Plus
*/
function acceptSubscriptionOwnerTransfer(uint256 subId) external override nonReentrant {
- if (s_subscriptionConfigs[subId].owner == address(0)) {
+ address oldOwner = s_subscriptionConfigs[subId].owner;
+ if (oldOwner == address(0)) {
revert InvalidSubscription();
}
if (s_subscriptionConfigs[subId].requestedOwner != msg.sender) {
revert MustBeRequestedOwner(s_subscriptionConfigs[subId].requestedOwner);
}
- address oldOwner = s_subscriptionConfigs[subId].owner;
s_subscriptionConfigs[subId].owner = msg.sender;
s_subscriptionConfigs[subId].requestedOwner = address(0);
emit SubscriptionOwnerTransferred(subId, oldOwner, msg.sender);
@@ -379,36 +401,42 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
*/
function addConsumer(uint256 subId, address consumer) external override onlySubOwner(subId) nonReentrant {
// Already maxed, cannot add any more consumers.
- if (s_subscriptionConfigs[subId].consumers.length == MAX_CONSUMERS) {
+ address[] storage consumers = s_subscriptionConfigs[subId].consumers;
+ if (consumers.length == MAX_CONSUMERS) {
revert TooManyConsumers();
}
- if (s_consumers[consumer][subId] != 0) {
+ mapping(uint256 => uint64) storage nonces = s_consumers[consumer];
+ if (nonces[subId] != 0) {
// Idempotence - do nothing if already added.
// Ensures uniqueness in s_subscriptions[subId].consumers.
return;
}
// Initialize the nonce to 1, indicating the consumer is allocated.
- s_consumers[consumer][subId] = 1;
- s_subscriptionConfigs[subId].consumers.push(consumer);
+ nonces[subId] = 1;
+ consumers.push(consumer);
emit SubscriptionConsumerAdded(subId, consumer);
}
function _deleteSubscription(uint256 subId) internal returns (uint96 balance, uint96 nativeBalance) {
- SubscriptionConfig memory subConfig = s_subscriptionConfigs[subId];
- Subscription memory sub = s_subscriptions[subId];
- balance = sub.balance;
- nativeBalance = sub.nativeBalance;
+ address[] storage consumers = s_subscriptionConfigs[subId].consumers;
+ balance = s_subscriptions[subId].balance;
+ nativeBalance = s_subscriptions[subId].nativeBalance;
// Note bounded by MAX_CONSUMERS;
// If no consumers, does nothing.
- for (uint256 i = 0; i < subConfig.consumers.length; i++) {
- delete s_consumers[subConfig.consumers[i]][subId];
+ uint256 consumersLength = consumers.length;
+ for (uint256 i = 0; i < consumersLength; ++i) {
+ delete s_consumers[consumers[i]][subId];
}
delete s_subscriptionConfigs[subId];
delete s_subscriptions[subId];
s_subIds.remove(subId);
- s_totalBalance -= balance;
- s_totalNativeBalance -= nativeBalance;
+ if (balance != 0) {
+ s_totalBalance -= balance;
+ }
+ if (nativeBalance != 0) {
+ s_totalNativeBalance -= nativeBalance;
+ }
return (balance, nativeBalance);
}
@@ -431,6 +459,11 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
}
modifier onlySubOwner(uint256 subId) {
+ _onlySubOwner(subId);
+ _;
+ }
+
+ function _onlySubOwner(uint256 subId) internal view {
address owner = s_subscriptionConfigs[subId].owner;
if (owner == address(0)) {
revert InvalidSubscription();
@@ -438,6 +471,5 @@ abstract contract SubscriptionAPI is ConfirmedOwner, IERC677Receiver, IVRFSubscr
if (msg.sender != owner) {
revert MustBeSubOwner(owner);
}
- _;
}
}
diff --git a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol
index a265cea4ed9..4bd7c1bd20c 100644
--- a/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol
+++ b/contracts/src/v0.8/vrf/dev/VRFCoordinatorV2_5.sol
@@ -30,12 +30,14 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
error ProvingKeyAlreadyRegistered(bytes32 keyHash);
error NoSuchProvingKey(bytes32 keyHash);
error InvalidLinkWeiPrice(int256 linkWei);
+ error LinkDiscountTooHigh(uint32 flatFeeLinkDiscountPPM, uint32 flatFeeNativePPM);
error InsufficientGasForConsumer(uint256 have, uint256 want);
error NoCorrespondingRequest();
error IncorrectCommitment();
error BlockhashNotInStore(uint256 blockNum);
error PaymentTooLarge();
error InvalidExtraArgsTag();
+ error GasPriceExceeded(uint256 gasPrice, uint256 maxGas);
struct RequestCommitment {
uint64 blockNum;
uint256 subId;
@@ -44,11 +46,18 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
address sender;
bytes extraArgs;
}
- mapping(bytes32 => bool) /* keyHash */ /* exists */ public s_provingKeys;
+
+ struct ProvingKey {
+ bool exists; // proving key exists
+ uint64 maxGas; // gas lane max gas price for fulfilling requests
+ }
+
+ mapping(bytes32 => ProvingKey) /* keyHash */ /* provingKey */ public s_provingKeys;
bytes32[] public s_provingKeyHashes;
mapping(uint256 => bytes32) /* requestID */ /* commitment */ public s_requestCommitments;
- event ProvingKeyRegistered(bytes32 keyHash);
- event ProvingKeyDeregistered(bytes32 keyHash);
+ event ProvingKeyRegistered(bytes32 keyHash, uint64 maxGas);
+ event ProvingKeyDeregistered(bytes32 keyHash, uint64 maxGas);
+
event RandomWordsRequested(
bytes32 indexed keyHash,
uint256 requestId,
@@ -66,27 +75,22 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
uint256 outputSeed,
uint256 indexed subId,
uint96 payment,
- bool success
+ bool success,
+ bool onlyPremium
);
int256 public s_fallbackWeiPerUnitLink;
- FeeConfig public s_feeConfig;
- struct FeeConfig {
- // Flat fee charged per fulfillment in millionths of link
- // So fee range is [0, 2^32/10^6].
- uint32 fulfillmentFlatFeeLinkPPM;
- // Flat fee charged per fulfillment in millionths of native.
- // So fee range is [0, 2^32/10^6].
- uint32 fulfillmentFlatFeeNativePPM;
- }
event ConfigSet(
uint16 minimumRequestConfirmations,
uint32 maxGasLimit,
uint32 stalenessSeconds,
uint32 gasAfterPaymentCalculation,
int256 fallbackWeiPerUnitLink,
- FeeConfig feeConfig
+ uint32 fulfillmentFlatFeeNativePPM,
+ uint32 fulfillmentFlatFeeLinkDiscountPPM,
+ uint8 nativePremiumPercentage,
+ uint8 linkPremiumPercentage
);
constructor(address blockhashStore) SubscriptionAPI() {
@@ -97,14 +101,14 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
* @notice Registers a proving key to.
* @param publicProvingKey key that oracle can use to submit vrf fulfillments
*/
- function registerProvingKey(uint256[2] calldata publicProvingKey) external onlyOwner {
+ function registerProvingKey(uint256[2] calldata publicProvingKey, uint64 maxGas) external onlyOwner {
bytes32 kh = hashOfKey(publicProvingKey);
- if (s_provingKeys[kh]) {
+ if (s_provingKeys[kh].exists) {
revert ProvingKeyAlreadyRegistered(kh);
}
- s_provingKeys[kh] = true;
+ s_provingKeys[kh] = ProvingKey({exists: true, maxGas: maxGas});
s_provingKeyHashes.push(kh);
- emit ProvingKeyRegistered(kh);
+ emit ProvingKeyRegistered(kh, maxGas);
}
/**
@@ -113,19 +117,21 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
*/
function deregisterProvingKey(uint256[2] calldata publicProvingKey) external onlyOwner {
bytes32 kh = hashOfKey(publicProvingKey);
- if (!s_provingKeys[kh]) {
+ ProvingKey memory key = s_provingKeys[kh];
+ if (!key.exists) {
revert NoSuchProvingKey(kh);
}
delete s_provingKeys[kh];
- for (uint256 i = 0; i < s_provingKeyHashes.length; i++) {
+ uint256 s_provingKeyHashesLength = s_provingKeyHashes.length;
+ for (uint256 i = 0; i < s_provingKeyHashesLength; ++i) {
if (s_provingKeyHashes[i] == kh) {
- bytes32 last = s_provingKeyHashes[s_provingKeyHashes.length - 1];
// Copy last element and overwrite kh to be deleted with it
- s_provingKeyHashes[i] = last;
+ s_provingKeyHashes[i] = s_provingKeyHashes[s_provingKeyHashesLength - 1];
s_provingKeyHashes.pop();
+ break;
}
}
- emit ProvingKeyDeregistered(kh);
+ emit ProvingKeyDeregistered(kh, key.maxGas);
}
/**
@@ -143,7 +149,10 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
* @param stalenessSeconds if the native/link feed is more stale then this, use the fallback price
* @param gasAfterPaymentCalculation gas used in doing accounting after completing the gas measurement
* @param fallbackWeiPerUnitLink fallback native/link price in the case of a stale feed
- * @param feeConfig fee configuration
+ * @param fulfillmentFlatFeeNativePPM flat fee in native for native payment
+ * @param fulfillmentFlatFeeLinkDiscountPPM flat fee discount for link payment in native
+ * @param nativePremiumPercentage native premium percentage
+ * @param linkPremiumPercentage link premium percentage
*/
function setConfig(
uint16 minimumRequestConfirmations,
@@ -151,7 +160,10 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
uint32 stalenessSeconds,
uint32 gasAfterPaymentCalculation,
int256 fallbackWeiPerUnitLink,
- FeeConfig memory feeConfig
+ uint32 fulfillmentFlatFeeNativePPM,
+ uint32 fulfillmentFlatFeeLinkDiscountPPM,
+ uint8 nativePremiumPercentage,
+ uint8 linkPremiumPercentage
) external onlyOwner {
if (minimumRequestConfirmations > MAX_REQUEST_CONFIRMATIONS) {
revert InvalidRequestConfirmations(
@@ -163,14 +175,20 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
if (fallbackWeiPerUnitLink <= 0) {
revert InvalidLinkWeiPrice(fallbackWeiPerUnitLink);
}
+ if (fulfillmentFlatFeeNativePPM > 0 && fulfillmentFlatFeeLinkDiscountPPM >= fulfillmentFlatFeeNativePPM) {
+ revert LinkDiscountTooHigh(fulfillmentFlatFeeLinkDiscountPPM, fulfillmentFlatFeeNativePPM);
+ }
s_config = Config({
minimumRequestConfirmations: minimumRequestConfirmations,
maxGasLimit: maxGasLimit,
stalenessSeconds: stalenessSeconds,
gasAfterPaymentCalculation: gasAfterPaymentCalculation,
- reentrancyLock: false
+ reentrancyLock: false,
+ fulfillmentFlatFeeNativePPM: fulfillmentFlatFeeNativePPM,
+ fulfillmentFlatFeeLinkDiscountPPM: fulfillmentFlatFeeLinkDiscountPPM,
+ nativePremiumPercentage: nativePremiumPercentage,
+ linkPremiumPercentage: linkPremiumPercentage
});
- s_feeConfig = feeConfig;
s_fallbackWeiPerUnitLink = fallbackWeiPerUnitLink;
emit ConfigSet(
minimumRequestConfirmations,
@@ -178,20 +196,13 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
stalenessSeconds,
gasAfterPaymentCalculation,
fallbackWeiPerUnitLink,
- s_feeConfig
+ fulfillmentFlatFeeNativePPM,
+ fulfillmentFlatFeeLinkDiscountPPM,
+ nativePremiumPercentage,
+ linkPremiumPercentage
);
}
- /**
- * @notice Get configuration relevant for making requests
- * @return minimumRequestConfirmations global min for request confirmations
- * @return maxGasLimit global max for request gas limit
- * @return s_provingKeyHashes list of registered key hashes
- */
- function getRequestConfig() external view returns (uint16, uint32, bytes32[] memory) {
- return (s_config.minimumRequestConfirmations, s_config.maxGasLimit, s_provingKeyHashes);
- }
-
/// @dev Convert the extra args bytes into a struct
/// @param extraArgs The extra args bytes
/// @return The extra args struct
@@ -231,17 +242,19 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
*/
function requestRandomWords(
VRFV2PlusClient.RandomWordsRequest calldata req
- ) external override nonReentrant returns (uint256) {
+ ) external override nonReentrant returns (uint256 requestId) {
// Input validation using the subscription storage.
- if (s_subscriptionConfigs[req.subId].owner == address(0)) {
+ uint256 subId = req.subId;
+ if (s_subscriptionConfigs[subId].owner == address(0)) {
revert InvalidSubscription();
}
// Its important to ensure that the consumer is in fact who they say they
// are, otherwise they could use someone else's subscription balance.
// A nonce of 0 indicates consumer is not allocated to the sub.
- uint64 currentNonce = s_consumers[msg.sender][req.subId];
- if (currentNonce == 0) {
- revert InvalidConsumer(req.subId, msg.sender);
+ mapping(uint256 => uint64) storage nonces = s_consumers[msg.sender];
+ uint64 nonce = nonces[subId];
+ if (nonce == 0) {
+ revert InvalidConsumer(subId, msg.sender);
}
// Input validation using the config storage word.
if (
@@ -263,19 +276,20 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
if (req.numWords > MAX_NUM_WORDS) {
revert NumWordsTooBig(req.numWords, MAX_NUM_WORDS);
}
+
// Note we do not check whether the keyHash is valid to save gas.
// The consequence for users is that they can send requests
// for invalid keyHashes which will simply not be fulfilled.
- uint64 nonce = currentNonce + 1;
- (uint256 requestId, uint256 preSeed) = _computeRequestId(req.keyHash, msg.sender, req.subId, nonce);
+ ++nonce;
+ uint256 preSeed;
+ (requestId, preSeed) = _computeRequestId(req.keyHash, msg.sender, subId, nonce);
- VRFV2PlusClient.ExtraArgsV1 memory extraArgs = _fromBytes(req.extraArgs);
- bytes memory extraArgsBytes = VRFV2PlusClient._argsToBytes(extraArgs);
+ bytes memory extraArgsBytes = VRFV2PlusClient._argsToBytes(_fromBytes(req.extraArgs));
s_requestCommitments[requestId] = keccak256(
abi.encode(
requestId,
ChainSpecificUtil._getBlockNumber(),
- req.subId,
+ subId,
req.callbackGasLimit,
req.numWords,
msg.sender,
@@ -286,14 +300,14 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
req.keyHash,
requestId,
preSeed,
- req.subId,
+ subId,
req.requestConfirmations,
req.callbackGasLimit,
req.numWords,
extraArgsBytes,
msg.sender
);
- s_consumers[msg.sender][req.subId] = nonce;
+ nonces[subId] = nonce;
return requestId;
}
@@ -342,7 +356,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
}
struct Output {
- bytes32 keyHash;
+ ProvingKey provingKey;
uint256 requestId;
uint256 randomness;
}
@@ -352,8 +366,9 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
RequestCommitment memory rc
) internal view returns (Output memory) {
bytes32 keyHash = hashOfKey(proof.pk);
+ ProvingKey memory key = s_provingKeys[keyHash];
// Only registered proving keys are permitted.
- if (!s_provingKeys[keyHash]) {
+ if (!key.exists) {
revert NoSuchProvingKey(keyHash);
}
uint256 requestId = uint256(keccak256(abi.encode(keyHash, proof.seed)));
@@ -379,28 +394,29 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
// The seed actually used by the VRF machinery, mixing in the blockhash
uint256 actualSeed = uint256(keccak256(abi.encodePacked(proof.seed, blockHash)));
uint256 randomness = VRF._randomValueFromVRFProof(proof, actualSeed); // Reverts on failure
- return Output(keyHash, requestId, randomness);
+ return Output(key, requestId, randomness);
}
- /*
- * @notice Fulfill a randomness request
- * @param proof contains the proof and randomness
- * @param rc request commitment pre-image, committed to at request time
- * @return payment amount billed to the subscription
- * @dev simulated offchain to determine if sufficient balance is present to fulfill the request
- */
- function fulfillRandomWords(Proof memory proof, RequestCommitment memory rc) external nonReentrant returns (uint96) {
- uint256 startGas = gasleft();
- Output memory output = _getRandomnessFromProof(proof, rc);
-
- uint256[] memory randomWords = new uint256[](rc.numWords);
- for (uint256 i = 0; i < rc.numWords; i++) {
- randomWords[i] = uint256(keccak256(abi.encode(output.randomness, i)));
+ function _getValidatedGasPrice(bool onlyPremium, uint64 gasLaneMaxGas) internal view returns (uint256 gasPrice) {
+ if (tx.gasprice > gasLaneMaxGas) {
+ if (onlyPremium) {
+ // if only the premium amount needs to be billed, then the premium is capped by the gas lane max
+ return uint256(gasLaneMaxGas);
+ } else {
+ // Ensure gas price does not exceed the gas lane max gas price
+ revert GasPriceExceeded(tx.gasprice, gasLaneMaxGas);
+ }
}
+ return tx.gasprice;
+ }
- delete s_requestCommitments[output.requestId];
+ function _deliverRandomness(
+ uint256 requestId,
+ RequestCommitment memory rc,
+ uint256[] memory randomWords
+ ) internal returns (bool success) {
VRFConsumerBaseV2Plus v;
- bytes memory resp = abi.encodeWithSelector(v.rawFulfillRandomWords.selector, output.requestId, randomWords);
+ bytes memory resp = abi.encodeWithSelector(v.rawFulfillRandomWords.selector, requestId, randomWords);
// Call with explicitly the amount of callback gas requested
// Important to not let them exhaust the gas budget and avoid oracle payment.
// Do not allow any non-view/non-pure coordinator functions to be called
@@ -408,94 +424,120 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
// Note that _callWithExactGas will revert if we do not have sufficient gas
// to give the callee their requested amount.
s_config.reentrancyLock = true;
- bool success = _callWithExactGas(rc.callbackGasLimit, rc.sender, resp);
+ success = _callWithExactGas(rc.callbackGasLimit, rc.sender, resp);
s_config.reentrancyLock = false;
+ return success;
+ }
+
+ /*
+ * @notice Fulfill a randomness request.
+ * @param proof contains the proof and randomness
+ * @param rc request commitment pre-image, committed to at request time
+ * @param onlyPremium only charge premium
+ * @return payment amount billed to the subscription
+ * @dev simulated offchain to determine if sufficient balance is present to fulfill the request
+ */
+ function fulfillRandomWords(
+ Proof memory proof,
+ RequestCommitment memory rc,
+ bool onlyPremium
+ ) external nonReentrant returns (uint96 payment) {
+ uint256 startGas = gasleft();
+ Output memory output = _getRandomnessFromProof(proof, rc);
+ uint256 gasPrice = _getValidatedGasPrice(onlyPremium, output.provingKey.maxGas);
+
+ uint256[] memory randomWords;
+ uint256 randomness = output.randomness;
+ // stack too deep error
+ {
+ uint256 numWords = rc.numWords;
+ randomWords = new uint256[](numWords);
+ for (uint256 i = 0; i < numWords; ++i) {
+ randomWords[i] = uint256(keccak256(abi.encode(randomness, i)));
+ }
+ }
+
+ uint256 requestId = output.requestId;
+ delete s_requestCommitments[requestId];
+ bool success = _deliverRandomness(requestId, rc, randomWords);
// Increment the req count for the subscription.
- uint64 reqCount = s_subscriptions[rc.subId].reqCount;
- s_subscriptions[rc.subId].reqCount = reqCount + 1;
+ uint256 subId = rc.subId;
+ ++s_subscriptions[subId].reqCount;
// stack too deep error
{
bool nativePayment = uint8(rc.extraArgs[rc.extraArgs.length - 1]) == 1;
+
// We want to charge users exactly for how much gas they use in their callback.
// The gasAfterPaymentCalculation is meant to cover these additional operations where we
- // decrement the subscription balance and increment the withdrawable balance.
- uint96 payment = _calculatePaymentAmount(
- startGas,
- s_config.gasAfterPaymentCalculation,
- tx.gasprice,
- nativePayment
- );
- if (nativePayment) {
- if (s_subscriptions[rc.subId].nativeBalance < payment) {
- revert InsufficientBalance();
- }
- s_subscriptions[rc.subId].nativeBalance -= payment;
- s_withdrawableNative += payment;
- } else {
- if (s_subscriptions[rc.subId].balance < payment) {
- revert InsufficientBalance();
- }
- s_subscriptions[rc.subId].balance -= payment;
- s_withdrawableTokens += payment;
- }
+ // decrement the subscription balance and increment the oracles withdrawable balance.
+ payment = _calculatePaymentAmount(startGas, gasPrice, nativePayment, onlyPremium);
- // Include payment in the event for tracking costs.
- // event RandomWordsFulfilled(uint256 indexed requestId, uint256 outputSeed, uint96 payment, bytes extraArgs, bool success);
- emit RandomWordsFulfilled(output.requestId, output.randomness, rc.subId, payment, success);
+ _chargePayment(payment, nativePayment, subId);
+ }
- return payment;
+ // Include payment in the event for tracking costs.
+ emit RandomWordsFulfilled(requestId, randomness, subId, payment, success, onlyPremium);
+
+ return payment;
+ }
+
+ function _chargePayment(uint96 payment, bool nativePayment, uint256 subId) internal {
+ Subscription storage subcription = s_subscriptions[subId];
+ if (nativePayment) {
+ uint96 prevBal = subcription.nativeBalance;
+ if (prevBal < payment) {
+ revert InsufficientBalance();
+ }
+ subcription.nativeBalance = prevBal - payment;
+ s_withdrawableNative += payment;
+ } else {
+ uint96 prevBal = subcription.balance;
+ if (prevBal < payment) {
+ revert InsufficientBalance();
+ }
+ subcription.balance = prevBal - payment;
+ s_withdrawableTokens += payment;
}
}
function _calculatePaymentAmount(
uint256 startGas,
- uint256 gasAfterPaymentCalculation,
uint256 weiPerUnitGas,
- bool nativePayment
- ) internal view returns (uint96) {
+ bool nativePayment,
+ bool onlyPremium
+ ) internal returns (uint96) {
if (nativePayment) {
- return
- _calculatePaymentAmountNative(
- startGas,
- gasAfterPaymentCalculation,
- s_feeConfig.fulfillmentFlatFeeNativePPM,
- weiPerUnitGas
- );
- }
- return
- _calculatePaymentAmountLink(
- startGas,
- gasAfterPaymentCalculation,
- s_feeConfig.fulfillmentFlatFeeLinkPPM,
- weiPerUnitGas
- );
+ return _calculatePaymentAmountNative(startGas, weiPerUnitGas, onlyPremium);
+ }
+ return _calculatePaymentAmountLink(startGas, weiPerUnitGas, onlyPremium);
}
function _calculatePaymentAmountNative(
uint256 startGas,
- uint256 gasAfterPaymentCalculation,
- uint32 fulfillmentFlatFeePPM,
- uint256 weiPerUnitGas
- ) internal view returns (uint96) {
+ uint256 weiPerUnitGas,
+ bool onlyPremium
+ ) internal returns (uint96) {
// Will return non-zero on chains that have this enabled
uint256 l1CostWei = ChainSpecificUtil._getCurrentTxL1GasFees(msg.data);
// calculate the payment without the premium
- uint256 baseFeeWei = weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft());
- // calculate the flat fee in wei
- uint256 flatFeeWei = 1e12 * uint256(fulfillmentFlatFeePPM);
- // return the final fee with the flat fee and l1 cost (if applicable) added
- return uint96(baseFeeWei + flatFeeWei + l1CostWei);
+ uint256 baseFeeWei = weiPerUnitGas * (s_config.gasAfterPaymentCalculation + startGas - gasleft());
+ // calculate flat fee in native
+ uint256 flatFeeWei = 1e12 * uint256(s_config.fulfillmentFlatFeeNativePPM);
+ if (onlyPremium) {
+ return uint96((((l1CostWei + baseFeeWei) * (s_config.nativePremiumPercentage)) / 100) + flatFeeWei);
+ } else {
+ return uint96((((l1CostWei + baseFeeWei) * (100 + s_config.nativePremiumPercentage)) / 100) + flatFeeWei);
+ }
}
// Get the amount of gas used for fulfillment
function _calculatePaymentAmountLink(
uint256 startGas,
- uint256 gasAfterPaymentCalculation,
- uint32 fulfillmentFlatFeeLinkPPM,
- uint256 weiPerUnitGas
- ) internal view returns (uint96) {
+ uint256 weiPerUnitGas,
+ bool onlyPremium
+ ) internal returns (uint96) {
int256 weiPerUnitLink;
weiPerUnitLink = _getFeedData();
if (weiPerUnitLink <= 0) {
@@ -504,23 +546,31 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
// Will return non-zero on chains that have this enabled
uint256 l1CostWei = ChainSpecificUtil._getCurrentTxL1GasFees(msg.data);
// (1e18 juels/link) ((wei/gas * gas) + l1wei) / (wei/link) = juels
- uint256 paymentNoFee = (1e18 * (weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft()) + l1CostWei)) /
+ uint256 paymentNoFee = (1e18 *
+ (weiPerUnitGas * (s_config.gasAfterPaymentCalculation + startGas - gasleft()) + l1CostWei)) /
uint256(weiPerUnitLink);
- uint256 fee = 1e12 * uint256(fulfillmentFlatFeeLinkPPM);
- if (paymentNoFee > (1e27 - fee)) {
+ // calculate the flat fee in wei
+ uint256 flatFeeWei = 1e12 *
+ uint256(s_config.fulfillmentFlatFeeNativePPM - s_config.fulfillmentFlatFeeLinkDiscountPPM);
+ uint256 flatFeeJuels = (1e18 * flatFeeWei) / uint256(weiPerUnitLink);
+ uint256 payment;
+ if (onlyPremium) {
+ payment = ((paymentNoFee * (s_config.linkPremiumPercentage)) / 100 + flatFeeJuels);
+ } else {
+ payment = ((paymentNoFee * (100 + s_config.linkPremiumPercentage)) / 100 + flatFeeJuels);
+ }
+ if (payment > 1e27) {
revert PaymentTooLarge(); // Payment + fee cannot be more than all of the link in existence.
}
- return uint96(paymentNoFee + fee);
+ return uint96(payment);
}
- function _getFeedData() private view returns (int256) {
+ function _getFeedData() private view returns (int256 weiPerUnitLink) {
uint32 stalenessSeconds = s_config.stalenessSeconds;
- bool staleFallback = stalenessSeconds > 0;
uint256 timestamp;
- int256 weiPerUnitLink;
(, weiPerUnitLink, , timestamp, ) = LINK_NATIVE_FEED.latestRoundData();
// solhint-disable-next-line not-rely-on-time
- if (staleFallback && stalenessSeconds < block.timestamp - timestamp) {
+ if (stalenessSeconds > 0 && stalenessSeconds < block.timestamp - timestamp) {
weiPerUnitLink = s_fallbackWeiPerUnitLink;
}
return weiPerUnitLink;
@@ -530,15 +580,16 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
* @inheritdoc IVRFSubscriptionV2Plus
*/
function pendingRequestExists(uint256 subId) public view override returns (bool) {
- SubscriptionConfig memory subConfig = s_subscriptionConfigs[subId];
- for (uint256 i = 0; i < subConfig.consumers.length; i++) {
- for (uint256 j = 0; j < s_provingKeyHashes.length; j++) {
- (uint256 reqId, ) = _computeRequestId(
- s_provingKeyHashes[j],
- subConfig.consumers[i],
- subId,
- s_consumers[subConfig.consumers[i]][subId]
- );
+ address[] storage consumers = s_subscriptionConfigs[subId].consumers;
+ uint256 consumersLength = consumers.length;
+ if (consumersLength == 0) {
+ return false;
+ }
+ uint256 provingKeyHashesLength = s_provingKeyHashes.length;
+ for (uint256 i = 0; i < consumersLength; ++i) {
+ address consumer = consumers[i];
+ for (uint256 j = 0; j < provingKeyHashesLength; ++j) {
+ (uint256 reqId, ) = _computeRequestId(s_provingKeyHashes[j], consumer, subId, s_consumers[consumer][subId]);
if (s_requestCommitments[reqId] != 0) {
return true;
}
@@ -560,7 +611,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
// Note bounded by MAX_CONSUMERS
address[] memory consumers = s_subscriptionConfigs[subId].consumers;
uint256 lastConsumerIndex = consumers.length - 1;
- for (uint256 i = 0; i < consumers.length; i++) {
+ for (uint256 i = 0; i < consumers.length; ++i) {
if (consumers[i] == consumer) {
address last = consumers[lastConsumerIndex];
// Storage write to preserve last element
@@ -618,7 +669,8 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
}
function _isTargetRegistered(address target) internal view returns (bool) {
- for (uint256 i = 0; i < s_migrationTargets.length; i++) {
+ uint256 migrationTargetsLength = s_migrationTargets.length;
+ for (uint256 i = 0; i < migrationTargetsLength; ++i) {
if (s_migrationTargets[i] == target) {
return true;
}
@@ -636,10 +688,9 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
function deregisterMigratableCoordinator(address target) external onlyOwner {
uint256 nTargets = s_migrationTargets.length;
- for (uint256 i = 0; i < nTargets; i++) {
+ for (uint256 i = 0; i < nTargets; ++i) {
if (s_migrationTargets[i] == target) {
s_migrationTargets[i] = s_migrationTargets[nTargets - 1];
- s_migrationTargets[nTargets - 1] = target;
s_migrationTargets.pop();
emit CoordinatorDeregistered(target);
return;
@@ -659,7 +710,7 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
require(!pendingRequestExists(subId), "Pending request exists");
V1MigrationData memory migrationData = V1MigrationData({
- fromVersion: migrationVersion(),
+ fromVersion: 1,
subId: subId,
subOwner: owner,
consumers: consumers,
@@ -679,15 +730,11 @@ contract VRFCoordinatorV2_5 is VRF, SubscriptionAPI, IVRFCoordinatorV2Plus {
// despite the fact that we follow best practices this is still probably safest
// to prevent any re-entrancy possibilities.
s_config.reentrancyLock = true;
- for (uint256 i = 0; i < consumers.length; i++) {
+ for (uint256 i = 0; i < consumers.length; ++i) {
IVRFMigratableConsumerV2Plus(consumers[i]).setCoordinator(newCoordinator);
}
s_config.reentrancyLock = false;
emit MigrationCompleted(newCoordinator, subId);
}
-
- function migrationVersion() public pure returns (uint8 version) {
- return 1;
- }
}
diff --git a/contracts/src/v0.8/vrf/dev/interfaces/IVRFCoordinatorV2PlusInternal.sol b/contracts/src/v0.8/vrf/dev/interfaces/IVRFCoordinatorV2PlusInternal.sol
index e8fba69fc45..81d609a84af 100644
--- a/contracts/src/v0.8/vrf/dev/interfaces/IVRFCoordinatorV2PlusInternal.sol
+++ b/contracts/src/v0.8/vrf/dev/interfaces/IVRFCoordinatorV2PlusInternal.sol
@@ -28,7 +28,8 @@ interface IVRFCoordinatorV2PlusInternal is IVRFCoordinatorV2Plus {
uint256 outputSeed,
uint256 indexed subId,
uint96 payment,
- bool success
+ bool success,
+ bool onlyPremium
);
struct RequestCommitment {
@@ -55,7 +56,11 @@ interface IVRFCoordinatorV2PlusInternal is IVRFCoordinatorV2Plus {
// solhint-disable-next-line func-name-mixedcase
function s_requestCommitments(uint256 requestID) external view returns (bytes32);
- function fulfillRandomWords(Proof memory proof, RequestCommitment memory rc) external returns (uint96);
+ function fulfillRandomWords(
+ Proof memory proof,
+ RequestCommitment memory rc,
+ bool onlyPremium
+ ) external returns (uint96);
// solhint-disable-next-line func-name-mixedcase
function LINK_NATIVE_FEED() external view returns (address);
diff --git a/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol b/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol
index ded916699b8..80f74372f15 100644
--- a/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol
+++ b/contracts/src/v0.8/vrf/dev/testhelpers/ExposedVRFCoordinatorV2_5.sol
@@ -65,4 +65,13 @@ contract ExposedVRFCoordinatorV2_5 is VRFCoordinatorV2_5 {
function getWithdrawableNativeTestingOnlyXXX() external view returns (uint96) {
return s_withdrawableNative;
}
+
+ function calculatePaymentAmount(
+ uint256 startGas,
+ uint256 weiPerUnitGas,
+ bool nativePayment,
+ bool onlyPremium
+ ) external returns (uint96) {
+ return _calculatePaymentAmount(startGas, weiPerUnitGas, nativePayment, onlyPremium);
+ }
}
diff --git a/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol b/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol
index ca29adac87c..608536518fb 100644
--- a/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol
+++ b/contracts/src/v0.8/vrf/dev/testhelpers/VRFCoordinatorV2PlusUpgradedVersion.sol
@@ -99,7 +99,8 @@ contract VRFCoordinatorV2PlusUpgradedVersion is
uint32 stalenessSeconds,
uint32 gasAfterPaymentCalculation,
int256 fallbackWeiPerUnitLink,
- FeeConfig feeConfig
+ uint8 nativePremiumPercentage,
+ uint8 linkPremiumPercentage
);
constructor(address blockhashStore) SubscriptionAPI() {
@@ -135,7 +136,8 @@ contract VRFCoordinatorV2PlusUpgradedVersion is
* @param stalenessSeconds if the native/link feed is more stale then this, use the fallback price
* @param gasAfterPaymentCalculation gas used in doing accounting after completing the gas measurement
* @param fallbackWeiPerUnitLink fallback native/link price in the case of a stale feed
- * @param feeConfig fee configuration
+ * @param nativePremiumPercentage native premium percentage
+ * @param linkPremiumPercentage link premium percentage
*/
function setConfig(
uint16 minimumRequestConfirmations,
@@ -143,7 +145,10 @@ contract VRFCoordinatorV2PlusUpgradedVersion is
uint32 stalenessSeconds,
uint32 gasAfterPaymentCalculation,
int256 fallbackWeiPerUnitLink,
- FeeConfig memory feeConfig
+ uint32 fulfillmentFlatFeeNativePPM,
+ uint32 fulfillmentFlatFeeLinkDiscountPPM,
+ uint8 nativePremiumPercentage,
+ uint8 linkPremiumPercentage
) external onlyOwner {
if (minimumRequestConfirmations > MAX_REQUEST_CONFIRMATIONS) {
revert InvalidRequestConfirmations(
@@ -160,9 +165,12 @@ contract VRFCoordinatorV2PlusUpgradedVersion is
maxGasLimit: maxGasLimit,
stalenessSeconds: stalenessSeconds,
gasAfterPaymentCalculation: gasAfterPaymentCalculation,
- reentrancyLock: false
+ reentrancyLock: false,
+ fulfillmentFlatFeeNativePPM: fulfillmentFlatFeeNativePPM,
+ fulfillmentFlatFeeLinkDiscountPPM: fulfillmentFlatFeeLinkDiscountPPM,
+ nativePremiumPercentage: nativePremiumPercentage,
+ linkPremiumPercentage: linkPremiumPercentage
});
- s_feeConfig = feeConfig;
s_fallbackWeiPerUnitLink = fallbackWeiPerUnitLink;
emit ConfigSet(
minimumRequestConfirmations,
@@ -170,7 +178,8 @@ contract VRFCoordinatorV2PlusUpgradedVersion is
stalenessSeconds,
gasAfterPaymentCalculation,
fallbackWeiPerUnitLink,
- s_feeConfig
+ nativePremiumPercentage,
+ linkPremiumPercentage
);
}
@@ -381,7 +390,11 @@ contract VRFCoordinatorV2PlusUpgradedVersion is
* @return payment amount billed to the subscription
* @dev simulated offchain to determine if sufficient balance is present to fulfill the request
*/
- function fulfillRandomWords(Proof memory proof, RequestCommitment memory rc) external nonReentrant returns (uint96) {
+ function fulfillRandomWords(
+ Proof memory proof,
+ RequestCommitment memory rc,
+ bool
+ ) external nonReentrant returns (uint96) {
uint256 startGas = gasleft();
Output memory output = _getRandomnessFromProof(proof, rc);
diff --git a/contracts/test/v0.8/automation/AutomationRegistry2_2.test.ts b/contracts/test/v0.8/automation/AutomationRegistry2_2.test.ts
index 740e4ac1c27..8d022ddfe64 100644
--- a/contracts/test/v0.8/automation/AutomationRegistry2_2.test.ts
+++ b/contracts/test/v0.8/automation/AutomationRegistry2_2.test.ts
@@ -21,15 +21,21 @@ import { UpkeepMock__factory as UpkeepMockFactory } from '../../../typechain/fac
import { UpkeepAutoFunder__factory as UpkeepAutoFunderFactory } from '../../../typechain/factories/UpkeepAutoFunder__factory'
import { MockArbGasInfo__factory as MockArbGasInfoFactory } from '../../../typechain/factories/MockArbGasInfo__factory'
import { MockOVMGasPriceOracle__factory as MockOVMGasPriceOracleFactory } from '../../../typechain/factories/MockOVMGasPriceOracle__factory'
+import { ChainModuleBase__factory as ChainModuleBaseFactory } from '../../../typechain/factories/ChainModuleBase__factory'
+import { ArbitrumModule__factory as ArbitrumModuleFactory } from '../../../typechain/factories/ArbitrumModule__factory'
+import { OptimismModule__factory as OptimismModuleFactory } from '../../../typechain/factories/OptimismModule__factory'
import { ILogAutomation__factory as ILogAutomationactory } from '../../../typechain/factories/ILogAutomation__factory'
import { IAutomationForwarder__factory as IAutomationForwarderFactory } from '../../../typechain/factories/IAutomationForwarder__factory'
import { MockArbSys__factory as MockArbSysFactory } from '../../../typechain/factories/MockArbSys__factory'
import { AutomationUtils2_2 as AutomationUtils } from '../../../typechain/AutomationUtils2_2'
+import { MockArbGasInfo } from '../../../typechain/MockArbGasInfo'
+import { MockOVMGasPriceOracle } from '../../../typechain/MockOVMGasPriceOracle'
import { StreamsLookupUpkeep } from '../../../typechain/StreamsLookupUpkeep'
import { MockV3Aggregator } from '../../../typechain/MockV3Aggregator'
import { UpkeepMock } from '../../../typechain/UpkeepMock'
-import { MockArbGasInfo } from '../../../typechain/MockArbGasInfo'
-import { MockOVMGasPriceOracle } from '../../../typechain/MockOVMGasPriceOracle'
+import { ChainModuleBase } from '../../../typechain/ChainModuleBase'
+import { ArbitrumModule } from '../../../typechain/ArbitrumModule'
+import { OptimismModule } from '../../../typechain/OptimismModule'
import { UpkeepTranscoder } from '../../../typechain/UpkeepTranscoder'
import { UpkeepAutoFunder } from '../../../typechain'
import {
@@ -63,13 +69,6 @@ enum UpkeepFailureReason {
REGISTRY_PAUSED,
}
-// copied from AutomationRegistryInterface2_2.sol
-enum Mode {
- DEFAULT,
- ARBITRUM,
- OPTIMISM,
-}
-
// copied from AutomationRegistryBase2_2.sol
enum Trigger {
CONDITION,
@@ -112,7 +111,7 @@ const emptyBytes32 =
'0x0000000000000000000000000000000000000000000000000000000000000000'
const transmitGasOverhead = 1_000_000
-const checkGasOverhead = 400_000
+const checkGasOverhead = 400_000 + 3_500 // 3_500 for the overhead to call chain module
const stalenessSeconds = BigNumber.from(43820)
const gasCeilingMultiplier = BigNumber.from(2)
@@ -137,11 +136,14 @@ let logTriggerConfig: string
// Smart contract factories
let linkTokenFactory: ContractFactory
+let mockArbGasInfoFactory: MockArbGasInfoFactory
+let mockOVMGasPriceOracleFactory: MockOVMGasPriceOracleFactory
let mockV3AggregatorFactory: MockV3AggregatorFactory
let upkeepMockFactory: UpkeepMockFactory
let upkeepAutoFunderFactory: UpkeepAutoFunderFactory
-let mockArbGasInfoFactory: MockArbGasInfoFactory
-let mockOVMGasPriceOracleFactory: MockOVMGasPriceOracleFactory
+let chainModuleBaseFactory: ChainModuleBaseFactory
+let arbitrumModuleFactory: ArbitrumModuleFactory
+let optimismModuleFactory: OptimismModuleFactory
let streamsLookupUpkeepFactory: StreamsLookupUpkeepFactory
let personas: Personas
@@ -154,12 +156,15 @@ let arbRegistry: IAutomationRegistry // arbitrum registry
let opRegistry: IAutomationRegistry // optimism registry
let mgRegistry: IAutomationRegistry // "migrate registry" used in migration tests
let blankRegistry: IAutomationRegistry // used to test initial configurations
+let mockArbGasInfo: MockArbGasInfo
+let mockOVMGasPriceOracle: MockOVMGasPriceOracle
let mock: UpkeepMock
let autoFunderUpkeep: UpkeepAutoFunder
let ltUpkeep: MockContract
let transcoder: UpkeepTranscoder
-let mockArbGasInfo: MockArbGasInfo
-let mockOVMGasPriceOracle: MockOVMGasPriceOracle
+let chainModuleBase: ChainModuleBase
+let arbitrumModule: ArbitrumModule
+let optimismModule: OptimismModule
let streamsLookupUpkeep: StreamsLookupUpkeep
let automationUtils: AutomationUtils
@@ -418,7 +423,11 @@ describe('AutomationRegistry2_2', () => {
let signers: Wallet[]
let signerAddresses: string[]
let config: any
+ let arbConfig: any
+ let opConfig: any
let baseConfig: Parameters
+ let arbConfigParams: Parameters
+ let opConfigParams: Parameters
let upkeepManager: string
before(async () => {
@@ -434,13 +443,16 @@ describe('AutomationRegistry2_2', () => {
mockV3AggregatorFactory = (await ethers.getContractFactory(
'src/v0.8/tests/MockV3Aggregator.sol:MockV3Aggregator',
)) as unknown as MockV3AggregatorFactory
- upkeepMockFactory = await ethers.getContractFactory('UpkeepMock')
- upkeepAutoFunderFactory =
- await ethers.getContractFactory('UpkeepAutoFunder')
mockArbGasInfoFactory = await ethers.getContractFactory('MockArbGasInfo')
mockOVMGasPriceOracleFactory = await ethers.getContractFactory(
'MockOVMGasPriceOracle',
)
+ upkeepMockFactory = await ethers.getContractFactory('UpkeepMock')
+ upkeepAutoFunderFactory =
+ await ethers.getContractFactory('UpkeepAutoFunder')
+ chainModuleBaseFactory = await ethers.getContractFactory('ChainModuleBase')
+ arbitrumModuleFactory = await ethers.getContractFactory('ArbitrumModule')
+ optimismModuleFactory = await ethers.getContractFactory('OptimismModule')
streamsLookupUpkeepFactory = await ethers.getContractFactory(
'StreamsLookupUpkeep',
)
@@ -565,6 +577,7 @@ describe('AutomationRegistry2_2', () => {
const verifyMaxPayment = async (
registry: IAutomationRegistry,
+ chainModuleAddress: string,
l1CostWei?: BigNumber,
) => {
type TestCase = {
@@ -628,6 +641,7 @@ describe('AutomationRegistry2_2', () => {
transcoder: transcoder.address,
registrars: [],
upkeepPrivilegeManager: upkeepManager,
+ chainModule: chainModuleAddress,
reorgProtectionEnabled: true,
}),
offchainVersion,
@@ -830,6 +844,9 @@ describe('AutomationRegistry2_2', () => {
mockOVMGasPriceOracle = await mockOVMGasPriceOracleFactory
.connect(owner)
.deploy()
+ chainModuleBase = await chainModuleBaseFactory.connect(owner).deploy()
+ arbitrumModule = await arbitrumModuleFactory.connect(owner).deploy()
+ optimismModule = await optimismModuleFactory.connect(owner).deploy()
streamsLookupUpkeep = await streamsLookupUpkeepFactory
.connect(owner)
.deploy(
@@ -881,9 +898,15 @@ describe('AutomationRegistry2_2', () => {
transcoder: transcoder.address,
registrars: [],
upkeepPrivilegeManager: upkeepManager,
+ chainModule: chainModuleBase.address,
reorgProtectionEnabled: true,
}
+ arbConfig = { ...config }
+ arbConfig.chainModule = arbitrumModule.address
+ opConfig = { ...config }
+ opConfig.chainModule = optimismModule.address
+
baseConfig = [
signerAddresses,
keeperAddresses,
@@ -892,45 +915,61 @@ describe('AutomationRegistry2_2', () => {
offchainVersion,
offchainBytes,
]
+ arbConfigParams = [
+ signerAddresses,
+ keeperAddresses,
+ f,
+ encodeConfig(arbConfig),
+ offchainVersion,
+ offchainBytes,
+ ]
+ opConfigParams = [
+ signerAddresses,
+ keeperAddresses,
+ f,
+ encodeConfig(opConfig),
+ offchainVersion,
+ offchainBytes,
+ ]
registry = await deployRegistry22(
owner,
- Mode.DEFAULT,
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
arbRegistry = await deployRegistry22(
owner,
- Mode.ARBITRUM,
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
opRegistry = await deployRegistry22(
owner,
- Mode.OPTIMISM,
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
mgRegistry = await deployRegistry22(
owner,
- Mode.DEFAULT,
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
blankRegistry = await deployRegistry22(
owner,
- Mode.DEFAULT,
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
registryConditionalOverhead = await registry.getConditionalGasOverhead()
@@ -940,8 +979,11 @@ describe('AutomationRegistry2_2', () => {
await registry.getPerPerformByteGasOverhead()
cancellationDelay = (await registry.getCancellationDelay()).toNumber()
+ await registry.connect(owner).setConfig(...baseConfig)
+ await mgRegistry.connect(owner).setConfig(...baseConfig)
+ await arbRegistry.connect(owner).setConfig(...arbConfigParams)
+ await opRegistry.connect(owner).setConfig(...opConfigParams)
for (const reg of [registry, arbRegistry, opRegistry, mgRegistry]) {
- await reg.connect(owner).setConfig(...baseConfig)
await reg.connect(owner).setPayees(payees)
await linkToken.connect(admin).approve(reg.address, toWei('1000'))
await linkToken.connect(owner).approve(reg.address, toWei('1000'))
@@ -953,13 +995,9 @@ describe('AutomationRegistry2_2', () => {
.transfer(await admin.getAddress(), toWei('1000'))
let tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
upkeepId = await getUpkeepID(tx)
autoFunderUpkeep = await upkeepAutoFunderFactory
@@ -967,27 +1005,17 @@ describe('AutomationRegistry2_2', () => {
.deploy(linkToken.address, registry.address)
tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- autoFunderUpkeep.address,
- performGas,
- autoFunderUpkeep.address,
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](autoFunderUpkeep.address, performGas, autoFunderUpkeep.address, randomBytes, '0x')
afUpkeepId = await getUpkeepID(tx)
ltUpkeep = await deployMockContract(owner, ILogAutomationactory.abi)
tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,uint8,bytes,bytes,bytes)'](
- ltUpkeep.address,
- performGas,
- await admin.getAddress(),
- Trigger.LOG,
- '0x',
- logTriggerConfig,
- emptyBytes,
- )
+ [
+ 'registerUpkeep(address,uint32,address,uint8,bytes,bytes,bytes)'
+ ](ltUpkeep.address, performGas, await admin.getAddress(), Trigger.LOG, '0x', logTriggerConfig, emptyBytes)
logUpkeepId = await getUpkeepID(tx)
await autoFunderUpkeep.setUpkeepId(afUpkeepId)
@@ -998,13 +1026,9 @@ describe('AutomationRegistry2_2', () => {
tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- streamsLookupUpkeep.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](streamsLookupUpkeep.address, performGas, await admin.getAddress(), randomBytes, '0x')
streamsLookupUpkeepId = await getUpkeepID(tx)
}
@@ -1022,13 +1046,9 @@ describe('AutomationRegistry2_2', () => {
await mock.setPerformGasToBurn(BigNumber.from('0'))
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const condUpkeepId = await getUpkeepID(tx)
passingConditionalUpkeepIds.push(condUpkeepId)
@@ -1041,15 +1061,9 @@ describe('AutomationRegistry2_2', () => {
await mock.setPerformGasToBurn(BigNumber.from('0'))
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,uint8,bytes,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- Trigger.LOG,
- '0x',
- logTriggerConfig,
- emptyBytes,
- )
+ [
+ 'registerUpkeep(address,uint32,address,uint8,bytes,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), Trigger.LOG, '0x', logTriggerConfig, emptyBytes)
const logUpkeepId = await getUpkeepID(tx)
passingLogUpkeepIds.push(logUpkeepId)
@@ -1062,13 +1076,9 @@ describe('AutomationRegistry2_2', () => {
await mock.setPerformGasToBurn(BigNumber.from('0'))
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const failingUpkeepId = await getUpkeepID(tx)
failingUpkeepIds.push(failingUpkeepId)
}
@@ -1550,13 +1560,9 @@ describe('AutomationRegistry2_2', () => {
let tx = await arbRegistry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const testUpkeepId = await getUpkeepID(tx)
await arbRegistry.connect(owner).addFunds(testUpkeepId, toWei('100'))
@@ -1878,747 +1884,721 @@ describe('AutomationRegistry2_2', () => {
},
)
- describeMaybe(
- 'Gas benchmarking conditional upkeeps [ @skip-coverage ]',
- function () {
- const fs = [1, 10]
- fs.forEach(function (newF) {
- it(
- 'When f=' +
- newF +
- ' calculates gas overhead appropriately within a margin for different scenarios',
- async () => {
- // Perform the upkeep once to remove non-zero storage slots and have predictable gas measurement
- let tx = await getTransmitTx(registry, keeper1, [upkeepId])
- await tx.wait()
-
- // Different test scenarios
- let longBytes = '0x'
- for (let i = 0; i < maxPerformDataSize.toNumber(); i++) {
- longBytes += '11'
- }
- const upkeepSuccessArray = [true, false]
- const performGasArray = [5000, performGas]
- const performDataArray = ['0x', longBytes]
-
- for (const i in upkeepSuccessArray) {
- for (const j in performGasArray) {
- for (const k in performDataArray) {
- const upkeepSuccess = upkeepSuccessArray[i]
- const performGas = performGasArray[j]
- const performData = performDataArray[k]
-
- await mock.setCanPerform(upkeepSuccess)
- await mock.setPerformGasToBurn(performGas)
- await registry
- .connect(owner)
- .setConfigTypeSafe(
- signerAddresses,
- keeperAddresses,
- newF,
- config,
- offchainVersion,
- offchainBytes,
- )
- tx = await getTransmitTx(registry, keeper1, [upkeepId], {
- numSigners: newF + 1,
- performData,
- })
- const receipt = await tx.wait()
- const upkeepPerformedLogs =
- parseUpkeepPerformedLogs(receipt)
- // exactly 1 Upkeep Performed should be emitted
- assert.equal(upkeepPerformedLogs.length, 1)
- const upkeepPerformedLog = upkeepPerformedLogs[0]
-
- const upkeepGasUsed = upkeepPerformedLog.args.gasUsed
- const chargedGasOverhead =
- upkeepPerformedLog.args.gasOverhead
- const actualGasOverhead =
- receipt.gasUsed.sub(upkeepGasUsed)
-
- assert.isTrue(upkeepGasUsed.gt(BigNumber.from('0')))
- assert.isTrue(chargedGasOverhead.gt(BigNumber.from('0')))
-
- console.log(
- 'Gas Benchmarking conditional upkeeps:',
- 'upkeepSuccess=',
- upkeepSuccess,
- 'performGas=',
- performGas.toString(),
- 'performData length=',
- performData.length / 2 - 1,
- 'sig verification ( f =',
+ describe.skip('Gas benchmarking conditional upkeeps [ @skip-coverage ]', function () {
+ const fs = [1, 10]
+ fs.forEach(function (newF) {
+ it(
+ 'When f=' +
+ newF +
+ ' calculates gas overhead appropriately within a margin for different scenarios',
+ async () => {
+ // Perform the upkeep once to remove non-zero storage slots and have predictable gas measurement
+ let tx = await getTransmitTx(registry, keeper1, [upkeepId])
+ await tx.wait()
+
+ // Different test scenarios
+ let longBytes = '0x'
+ for (let i = 0; i < maxPerformDataSize.toNumber(); i++) {
+ longBytes += '11'
+ }
+ const upkeepSuccessArray = [true, false]
+ const performGasArray = [5000, performGas]
+ const performDataArray = ['0x', longBytes]
+
+ for (const i in upkeepSuccessArray) {
+ for (const j in performGasArray) {
+ for (const k in performDataArray) {
+ const upkeepSuccess = upkeepSuccessArray[i]
+ const performGas = performGasArray[j]
+ const performData = performDataArray[k]
+
+ await mock.setCanPerform(upkeepSuccess)
+ await mock.setPerformGasToBurn(performGas)
+ await registry
+ .connect(owner)
+ .setConfigTypeSafe(
+ signerAddresses,
+ keeperAddresses,
newF,
- '): calculated overhead: ',
- chargedGasOverhead.toString(),
- ' actual overhead: ',
- actualGasOverhead.toString(),
- ' margin over gasUsed: ',
- chargedGasOverhead.sub(actualGasOverhead).toString(),
+ config,
+ offchainVersion,
+ offchainBytes,
)
-
- // Overhead should not get capped
- const gasOverheadCap = registryConditionalOverhead
- .add(
- registryPerSignerGasOverhead.mul(
- BigNumber.from(newF + 1),
- ),
- )
- .add(
- BigNumber.from(
- registryPerPerformByteGasOverhead.toNumber() *
- performData.length,
- ),
- )
- const gasCapMinusOverhead =
- gasOverheadCap.sub(chargedGasOverhead)
- assert.isTrue(
- gasCapMinusOverhead.gt(BigNumber.from(0)),
- 'Gas overhead got capped. Verify gas overhead variables in test match those in the registry. To not have the overheads capped increase REGISTRY_GAS_OVERHEAD by atleast ' +
- gasCapMinusOverhead.toString(),
+ tx = await getTransmitTx(registry, keeper1, [upkeepId], {
+ numSigners: newF + 1,
+ performData,
+ })
+ const receipt = await tx.wait()
+ const upkeepPerformedLogs =
+ parseUpkeepPerformedLogs(receipt)
+ // exactly 1 Upkeep Performed should be emitted
+ assert.equal(upkeepPerformedLogs.length, 1)
+ const upkeepPerformedLog = upkeepPerformedLogs[0]
+
+ const upkeepGasUsed = upkeepPerformedLog.args.gasUsed
+ const chargedGasOverhead =
+ upkeepPerformedLog.args.gasOverhead
+ const actualGasOverhead = receipt.gasUsed.sub(upkeepGasUsed)
+
+ assert.isTrue(upkeepGasUsed.gt(BigNumber.from('0')))
+ assert.isTrue(chargedGasOverhead.gt(BigNumber.from('0')))
+
+ console.log(
+ 'Gas Benchmarking conditional upkeeps:',
+ 'upkeepSuccess=',
+ upkeepSuccess,
+ 'performGas=',
+ performGas.toString(),
+ 'performData length=',
+ performData.length / 2 - 1,
+ 'sig verification ( f =',
+ newF,
+ '): calculated overhead: ',
+ chargedGasOverhead.toString(),
+ ' actual overhead: ',
+ actualGasOverhead.toString(),
+ ' margin over gasUsed: ',
+ chargedGasOverhead.sub(actualGasOverhead).toString(),
+ )
+
+ // Overhead should not get capped
+ const gasOverheadCap = registryConditionalOverhead
+ .add(
+ registryPerSignerGasOverhead.mul(
+ BigNumber.from(newF + 1),
+ ),
)
- // total gas charged should be greater than tx gas but within gasCalculationMargin
- assert.isTrue(
- chargedGasOverhead.gt(actualGasOverhead),
- 'Gas overhead calculated is too low, increase account gas variables (ACCOUNTING_FIXED_GAS_OVERHEAD/ACCOUNTING_PER_SIGNER_GAS_OVERHEAD) by atleast ' +
- actualGasOverhead.sub(chargedGasOverhead).toString(),
+ .add(
+ BigNumber.from(
+ registryPerPerformByteGasOverhead.toNumber() *
+ performData.length,
+ ),
)
-
- assert.isTrue(
+ const gasCapMinusOverhead =
+ gasOverheadCap.sub(chargedGasOverhead)
+ assert.isTrue(
+ gasCapMinusOverhead.gt(BigNumber.from(0)),
+ 'Gas overhead got capped. Verify gas overhead variables in test match those in the registry. To not have the overheads capped increase REGISTRY_GAS_OVERHEAD by atleast ' +
+ gasCapMinusOverhead.toString(),
+ )
+ // total gas charged should be greater than tx gas but within gasCalculationMargin
+ assert.isTrue(
+ chargedGasOverhead.gt(actualGasOverhead),
+ 'Gas overhead calculated is too low, increase account gas variables (ACCOUNTING_FIXED_GAS_OVERHEAD/ACCOUNTING_PER_SIGNER_GAS_OVERHEAD) by atleast ' +
+ actualGasOverhead.sub(chargedGasOverhead).toString(),
+ )
+
+ assert.isTrue(
+ chargedGasOverhead
+ .sub(actualGasOverhead)
+ .lt(gasCalculationMargin),
+ ),
+ 'Gas overhead calculated is too high, decrease account gas variables (ACCOUNTING_FIXED_GAS_OVERHEAD/ACCOUNTING_PER_SIGNER_GAS_OVERHEAD) by atleast ' +
chargedGasOverhead
- .sub(actualGasOverhead)
- .lt(gasCalculationMargin),
- ),
- 'Gas overhead calculated is too high, decrease account gas variables (ACCOUNTING_FIXED_GAS_OVERHEAD/ACCOUNTING_PER_SIGNER_GAS_OVERHEAD) by atleast ' +
- chargedGasOverhead
- .sub(chargedGasOverhead)
- .sub(gasCalculationMargin)
- .toString()
- }
+ .sub(chargedGasOverhead)
+ .sub(gasCalculationMargin)
+ .toString()
}
}
- },
- )
- })
- },
- )
+ }
+ },
+ )
+ })
+ })
- describeMaybe(
- 'Gas benchmarking log upkeeps [ @skip-coverage ]',
- function () {
- const fs = [1, 10]
- fs.forEach(function (newF) {
- it(
- 'When f=' +
- newF +
- ' calculates gas overhead appropriately within a margin',
- async () => {
- // Perform the upkeep once to remove non-zero storage slots and have predictable gas measurement
- let tx = await getTransmitTx(registry, keeper1, [logUpkeepId])
- await tx.wait()
- const performData = '0x'
- await mock.setCanPerform(true)
- await mock.setPerformGasToBurn(performGas)
- await registry.setConfigTypeSafe(
- signerAddresses,
- keeperAddresses,
- newF,
- config,
- offchainVersion,
- offchainBytes,
- )
- tx = await getTransmitTx(registry, keeper1, [logUpkeepId], {
- numSigners: newF + 1,
- performData,
- })
- const receipt = await tx.wait()
- const upkeepPerformedLogs = parseUpkeepPerformedLogs(receipt)
- // exactly 1 Upkeep Performed should be emitted
- assert.equal(upkeepPerformedLogs.length, 1)
- const upkeepPerformedLog = upkeepPerformedLogs[0]
-
- const upkeepGasUsed = upkeepPerformedLog.args.gasUsed
- const chargedGasOverhead = upkeepPerformedLog.args.gasOverhead
- const actualGasOverhead = receipt.gasUsed.sub(upkeepGasUsed)
-
- assert.isTrue(upkeepGasUsed.gt(BigNumber.from('0')))
- assert.isTrue(chargedGasOverhead.gt(BigNumber.from('0')))
-
- console.log(
- 'Gas Benchmarking log upkeeps:',
- 'upkeepSuccess=',
- true,
- 'performGas=',
- performGas.toString(),
- 'performData length=',
- performData.length / 2 - 1,
- 'sig verification ( f =',
- newF,
- '): calculated overhead: ',
- chargedGasOverhead.toString(),
- ' actual overhead: ',
- actualGasOverhead.toString(),
- ' margin over gasUsed: ',
- chargedGasOverhead.sub(actualGasOverhead).toString(),
- )
+ describe.skip('Gas benchmarking log upkeeps [ @skip-coverage ]', function () {
+ const fs = [1, 10]
+ fs.forEach(function (newF) {
+ it(
+ 'When f=' +
+ newF +
+ ' calculates gas overhead appropriately within a margin',
+ async () => {
+ // Perform the upkeep once to remove non-zero storage slots and have predictable gas measurement
+ let tx = await getTransmitTx(registry, keeper1, [logUpkeepId])
+ await tx.wait()
+ const performData = '0x'
+ await mock.setCanPerform(true)
+ await mock.setPerformGasToBurn(performGas)
+ await registry.setConfigTypeSafe(
+ signerAddresses,
+ keeperAddresses,
+ newF,
+ config,
+ offchainVersion,
+ offchainBytes,
+ )
+ tx = await getTransmitTx(registry, keeper1, [logUpkeepId], {
+ numSigners: newF + 1,
+ performData,
+ })
+ const receipt = await tx.wait()
+ const upkeepPerformedLogs = parseUpkeepPerformedLogs(receipt)
+ // exactly 1 Upkeep Performed should be emitted
+ assert.equal(upkeepPerformedLogs.length, 1)
+ const upkeepPerformedLog = upkeepPerformedLogs[0]
+
+ const upkeepGasUsed = upkeepPerformedLog.args.gasUsed
+ const chargedGasOverhead = upkeepPerformedLog.args.gasOverhead
+ const actualGasOverhead = receipt.gasUsed.sub(upkeepGasUsed)
+
+ assert.isTrue(upkeepGasUsed.gt(BigNumber.from('0')))
+ assert.isTrue(chargedGasOverhead.gt(BigNumber.from('0')))
+
+ console.log(
+ 'Gas Benchmarking log upkeeps:',
+ 'upkeepSuccess=',
+ true,
+ 'performGas=',
+ performGas.toString(),
+ 'performData length=',
+ performData.length / 2 - 1,
+ 'sig verification ( f =',
+ newF,
+ '): calculated overhead: ',
+ chargedGasOverhead.toString(),
+ ' actual overhead: ',
+ actualGasOverhead.toString(),
+ ' margin over gasUsed: ',
+ chargedGasOverhead.sub(actualGasOverhead).toString(),
+ )
- // Overhead should not get capped
- const gasOverheadCap = registryLogOverhead
- .add(
- registryPerSignerGasOverhead.mul(BigNumber.from(newF + 1)),
- )
- .add(
- BigNumber.from(
- registryPerPerformByteGasOverhead.toNumber() *
- performData.length,
- ),
- )
- const gasCapMinusOverhead =
- gasOverheadCap.sub(chargedGasOverhead)
- assert.isTrue(
- gasCapMinusOverhead.gt(BigNumber.from(0)),
- 'Gas overhead got capped. Verify gas overhead variables in test match those in the registry. To not have the overheads capped increase REGISTRY_GAS_OVERHEAD by atleast ' +
- gasCapMinusOverhead.toString(),
- )
- // total gas charged should be greater than tx gas but within gasCalculationMargin
- assert.isTrue(
- chargedGasOverhead.gt(actualGasOverhead),
- 'Gas overhead calculated is too low, increase account gas variables (ACCOUNTING_FIXED_GAS_OVERHEAD/ACCOUNTING_PER_SIGNER_GAS_OVERHEAD) by atleast ' +
- actualGasOverhead.sub(chargedGasOverhead).toString(),
+ // Overhead should not get capped
+ const gasOverheadCap = registryLogOverhead
+ .add(registryPerSignerGasOverhead.mul(BigNumber.from(newF + 1)))
+ .add(
+ BigNumber.from(
+ registryPerPerformByteGasOverhead.toNumber() *
+ performData.length,
+ ),
)
+ const gasCapMinusOverhead = gasOverheadCap.sub(chargedGasOverhead)
+ assert.isTrue(
+ gasCapMinusOverhead.gt(BigNumber.from(0)),
+ 'Gas overhead got capped. Verify gas overhead variables in test match those in the registry. To not have the overheads capped increase REGISTRY_GAS_OVERHEAD by atleast ' +
+ gasCapMinusOverhead.toString(),
+ )
+ // total gas charged should be greater than tx gas but within gasCalculationMargin
+ assert.isTrue(
+ chargedGasOverhead.gt(actualGasOverhead),
+ 'Gas overhead calculated is too low, increase account gas variables (ACCOUNTING_FIXED_GAS_OVERHEAD/ACCOUNTING_PER_SIGNER_GAS_OVERHEAD) by atleast ' +
+ actualGasOverhead.sub(chargedGasOverhead).toString(),
+ )
- assert.isTrue(
+ assert.isTrue(
+ chargedGasOverhead
+ .sub(actualGasOverhead)
+ .lt(gasCalculationMargin),
+ ),
+ 'Gas overhead calculated is too high, decrease account gas variables (ACCOUNTING_FIXED_GAS_OVERHEAD/ACCOUNTING_PER_SIGNER_GAS_OVERHEAD) by atleast ' +
chargedGasOverhead
- .sub(actualGasOverhead)
- .lt(gasCalculationMargin),
- ),
- 'Gas overhead calculated is too high, decrease account gas variables (ACCOUNTING_FIXED_GAS_OVERHEAD/ACCOUNTING_PER_SIGNER_GAS_OVERHEAD) by atleast ' +
- chargedGasOverhead
- .sub(chargedGasOverhead)
- .sub(gasCalculationMargin)
- .toString()
- },
- )
- })
- },
- )
+ .sub(chargedGasOverhead)
+ .sub(gasCalculationMargin)
+ .toString()
+ },
+ )
+ })
+ })
})
})
- describeMaybe(
- '#transmit with upkeep batches [ @skip-coverage ]',
- function () {
- const numPassingConditionalUpkeepsArray = [0, 1, 5]
- const numPassingLogUpkeepsArray = [0, 1, 5]
- const numFailingUpkeepsArray = [0, 3]
-
- for (let idx = 0; idx < numPassingConditionalUpkeepsArray.length; idx++) {
- for (let jdx = 0; jdx < numPassingLogUpkeepsArray.length; jdx++) {
- for (let kdx = 0; kdx < numFailingUpkeepsArray.length; kdx++) {
- const numPassingConditionalUpkeeps =
- numPassingConditionalUpkeepsArray[idx]
- const numPassingLogUpkeeps = numPassingLogUpkeepsArray[jdx]
- const numFailingUpkeeps = numFailingUpkeepsArray[kdx]
- if (
- numPassingConditionalUpkeeps == 0 &&
- numPassingLogUpkeeps == 0
- ) {
- continue
- }
- it(
- '[Conditional:' +
- numPassingConditionalUpkeeps +
- ',Log:' +
- numPassingLogUpkeeps +
- ',Failures:' +
- numFailingUpkeeps +
- '] performs successful upkeeps and does not charge failing upkeeps',
- async () => {
- const allUpkeeps = await getMultipleUpkeepsDeployedAndFunded(
- numPassingConditionalUpkeeps,
- numPassingLogUpkeeps,
- numFailingUpkeeps,
- )
- const passingConditionalUpkeepIds =
- allUpkeeps.passingConditionalUpkeepIds
- const passingLogUpkeepIds = allUpkeeps.passingLogUpkeepIds
- const failingUpkeepIds = allUpkeeps.failingUpkeepIds
+ describe.skip('#transmit with upkeep batches [ @skip-coverage ]', function () {
+ const numPassingConditionalUpkeepsArray = [0, 1, 5]
+ const numPassingLogUpkeepsArray = [0, 1, 5]
+ const numFailingUpkeepsArray = [0, 3]
+
+ for (let idx = 0; idx < numPassingConditionalUpkeepsArray.length; idx++) {
+ for (let jdx = 0; jdx < numPassingLogUpkeepsArray.length; jdx++) {
+ for (let kdx = 0; kdx < numFailingUpkeepsArray.length; kdx++) {
+ const numPassingConditionalUpkeeps =
+ numPassingConditionalUpkeepsArray[idx]
+ const numPassingLogUpkeeps = numPassingLogUpkeepsArray[jdx]
+ const numFailingUpkeeps = numFailingUpkeepsArray[kdx]
+ if (numPassingConditionalUpkeeps == 0 && numPassingLogUpkeeps == 0) {
+ continue
+ }
+ it(
+ '[Conditional:' +
+ numPassingConditionalUpkeeps +
+ ',Log:' +
+ numPassingLogUpkeeps +
+ ',Failures:' +
+ numFailingUpkeeps +
+ '] performs successful upkeeps and does not charge failing upkeeps',
+ async () => {
+ const allUpkeeps = await getMultipleUpkeepsDeployedAndFunded(
+ numPassingConditionalUpkeeps,
+ numPassingLogUpkeeps,
+ numFailingUpkeeps,
+ )
+ const passingConditionalUpkeepIds =
+ allUpkeeps.passingConditionalUpkeepIds
+ const passingLogUpkeepIds = allUpkeeps.passingLogUpkeepIds
+ const failingUpkeepIds = allUpkeeps.failingUpkeepIds
- const keeperBefore = await registry.getTransmitterInfo(
- await keeper1.getAddress(),
- )
- const keeperLinkBefore = await linkToken.balanceOf(
- await keeper1.getAddress(),
- )
- const registryLinkBefore = await linkToken.balanceOf(
- registry.address,
- )
- const registryPremiumBefore = (await registry.getState()).state
- .totalPremium
- const registrationConditionalPassingBefore = await Promise.all(
- passingConditionalUpkeepIds.map(async (id) => {
- const reg = await registry.getUpkeep(BigNumber.from(id))
- assert.equal(reg.lastPerformedBlockNumber.toString(), '0')
- return reg
- }),
- )
- const registrationLogPassingBefore = await Promise.all(
- passingLogUpkeepIds.map(async (id) => {
- const reg = await registry.getUpkeep(BigNumber.from(id))
- assert.equal(reg.lastPerformedBlockNumber.toString(), '0')
- return reg
- }),
- )
- const registrationFailingBefore = await Promise.all(
- failingUpkeepIds.map(async (id) => {
- const reg = await registry.getUpkeep(BigNumber.from(id))
- assert.equal(reg.lastPerformedBlockNumber.toString(), '0')
- return reg
- }),
- )
+ const keeperBefore = await registry.getTransmitterInfo(
+ await keeper1.getAddress(),
+ )
+ const keeperLinkBefore = await linkToken.balanceOf(
+ await keeper1.getAddress(),
+ )
+ const registryLinkBefore = await linkToken.balanceOf(
+ registry.address,
+ )
+ const registryPremiumBefore = (await registry.getState()).state
+ .totalPremium
+ const registrationConditionalPassingBefore = await Promise.all(
+ passingConditionalUpkeepIds.map(async (id) => {
+ const reg = await registry.getUpkeep(BigNumber.from(id))
+ assert.equal(reg.lastPerformedBlockNumber.toString(), '0')
+ return reg
+ }),
+ )
+ const registrationLogPassingBefore = await Promise.all(
+ passingLogUpkeepIds.map(async (id) => {
+ const reg = await registry.getUpkeep(BigNumber.from(id))
+ assert.equal(reg.lastPerformedBlockNumber.toString(), '0')
+ return reg
+ }),
+ )
+ const registrationFailingBefore = await Promise.all(
+ failingUpkeepIds.map(async (id) => {
+ const reg = await registry.getUpkeep(BigNumber.from(id))
+ assert.equal(reg.lastPerformedBlockNumber.toString(), '0')
+ return reg
+ }),
+ )
- const tx = await getTransmitTx(
- registry,
- keeper1,
- passingConditionalUpkeepIds.concat(
- passingLogUpkeepIds.concat(failingUpkeepIds),
- ),
- )
+ const tx = await getTransmitTx(
+ registry,
+ keeper1,
+ passingConditionalUpkeepIds.concat(
+ passingLogUpkeepIds.concat(failingUpkeepIds),
+ ),
+ )
+
+ const receipt = await tx.wait()
+ const upkeepPerformedLogs = parseUpkeepPerformedLogs(receipt)
+ // exactly numPassingUpkeeps Upkeep Performed should be emitted
+ assert.equal(
+ upkeepPerformedLogs.length,
+ numPassingConditionalUpkeeps + numPassingLogUpkeeps,
+ )
+ const insufficientFundsLogs =
+ parseInsufficientFundsUpkeepReportLogs(receipt)
+ // exactly numFailingUpkeeps Upkeep Performed should be emitted
+ assert.equal(insufficientFundsLogs.length, numFailingUpkeeps)
- const receipt = await tx.wait()
- const upkeepPerformedLogs = parseUpkeepPerformedLogs(receipt)
- // exactly numPassingUpkeeps Upkeep Performed should be emitted
+ const keeperAfter = await registry.getTransmitterInfo(
+ await keeper1.getAddress(),
+ )
+ const keeperLinkAfter = await linkToken.balanceOf(
+ await keeper1.getAddress(),
+ )
+ const registryLinkAfter = await linkToken.balanceOf(
+ registry.address,
+ )
+ const registrationConditionalPassingAfter = await Promise.all(
+ passingConditionalUpkeepIds.map(async (id) => {
+ return await registry.getUpkeep(BigNumber.from(id))
+ }),
+ )
+ const registrationLogPassingAfter = await Promise.all(
+ passingLogUpkeepIds.map(async (id) => {
+ return await registry.getUpkeep(BigNumber.from(id))
+ }),
+ )
+ const registrationFailingAfter = await Promise.all(
+ failingUpkeepIds.map(async (id) => {
+ return await registry.getUpkeep(BigNumber.from(id))
+ }),
+ )
+ const registryPremiumAfter = (await registry.getState()).state
+ .totalPremium
+ const premium = registryPremiumAfter.sub(registryPremiumBefore)
+
+ let netPayment = BigNumber.from('0')
+ for (let i = 0; i < numPassingConditionalUpkeeps; i++) {
+ const id = upkeepPerformedLogs[i].args.id
+ const gasUsed = upkeepPerformedLogs[i].args.gasUsed
+ const gasOverhead = upkeepPerformedLogs[i].args.gasOverhead
+ const totalPayment = upkeepPerformedLogs[i].args.totalPayment
+
+ expect(id).to.equal(passingConditionalUpkeepIds[i])
+ assert.isTrue(gasUsed.gt(BigNumber.from('0')))
+ assert.isTrue(gasOverhead.gt(BigNumber.from('0')))
+ assert.isTrue(totalPayment.gt(BigNumber.from('0')))
+
+ // Balance should be deducted
assert.equal(
- upkeepPerformedLogs.length,
- numPassingConditionalUpkeeps + numPassingLogUpkeeps,
+ registrationConditionalPassingBefore[i].balance
+ .sub(totalPayment)
+ .toString(),
+ registrationConditionalPassingAfter[i].balance.toString(),
)
- const insufficientFundsLogs =
- parseInsufficientFundsUpkeepReportLogs(receipt)
- // exactly numFailingUpkeeps Upkeep Performed should be emitted
- assert.equal(insufficientFundsLogs.length, numFailingUpkeeps)
- const keeperAfter = await registry.getTransmitterInfo(
- await keeper1.getAddress(),
- )
- const keeperLinkAfter = await linkToken.balanceOf(
- await keeper1.getAddress(),
+ // Amount spent should be updated correctly
+ assert.equal(
+ registrationConditionalPassingAfter[i].amountSpent
+ .sub(totalPayment)
+ .toString(),
+ registrationConditionalPassingBefore[
+ i
+ ].amountSpent.toString(),
)
- const registryLinkAfter = await linkToken.balanceOf(
- registry.address,
+
+ // Last perform block number should be updated
+ assert.equal(
+ registrationConditionalPassingAfter[
+ i
+ ].lastPerformedBlockNumber.toString(),
+ tx.blockNumber?.toString(),
)
- const registrationConditionalPassingAfter = await Promise.all(
- passingConditionalUpkeepIds.map(async (id) => {
- return await registry.getUpkeep(BigNumber.from(id))
- }),
+
+ netPayment = netPayment.add(totalPayment)
+ }
+
+ for (let i = 0; i < numPassingLogUpkeeps; i++) {
+ const id =
+ upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args.id
+ const gasUsed =
+ upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
+ .gasUsed
+ const gasOverhead =
+ upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
+ .gasOverhead
+ const totalPayment =
+ upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
+ .totalPayment
+
+ expect(id).to.equal(passingLogUpkeepIds[i])
+ assert.isTrue(gasUsed.gt(BigNumber.from('0')))
+ assert.isTrue(gasOverhead.gt(BigNumber.from('0')))
+ assert.isTrue(totalPayment.gt(BigNumber.from('0')))
+
+ // Balance should be deducted
+ assert.equal(
+ registrationLogPassingBefore[i].balance
+ .sub(totalPayment)
+ .toString(),
+ registrationLogPassingAfter[i].balance.toString(),
)
- const registrationLogPassingAfter = await Promise.all(
- passingLogUpkeepIds.map(async (id) => {
- return await registry.getUpkeep(BigNumber.from(id))
- }),
+
+ // Amount spent should be updated correctly
+ assert.equal(
+ registrationLogPassingAfter[i].amountSpent
+ .sub(totalPayment)
+ .toString(),
+ registrationLogPassingBefore[i].amountSpent.toString(),
)
- const registrationFailingAfter = await Promise.all(
- failingUpkeepIds.map(async (id) => {
- return await registry.getUpkeep(BigNumber.from(id))
- }),
+
+ // Last perform block number should not be updated for log triggers
+ assert.equal(
+ registrationLogPassingAfter[
+ i
+ ].lastPerformedBlockNumber.toString(),
+ '0',
)
- const registryPremiumAfter = (await registry.getState()).state
- .totalPremium
- const premium = registryPremiumAfter.sub(registryPremiumBefore)
-
- let netPayment = BigNumber.from('0')
- for (let i = 0; i < numPassingConditionalUpkeeps; i++) {
- const id = upkeepPerformedLogs[i].args.id
- const gasUsed = upkeepPerformedLogs[i].args.gasUsed
- const gasOverhead = upkeepPerformedLogs[i].args.gasOverhead
- const totalPayment = upkeepPerformedLogs[i].args.totalPayment
-
- expect(id).to.equal(passingConditionalUpkeepIds[i])
- assert.isTrue(gasUsed.gt(BigNumber.from('0')))
- assert.isTrue(gasOverhead.gt(BigNumber.from('0')))
- assert.isTrue(totalPayment.gt(BigNumber.from('0')))
-
- // Balance should be deducted
- assert.equal(
- registrationConditionalPassingBefore[i].balance
- .sub(totalPayment)
- .toString(),
- registrationConditionalPassingAfter[i].balance.toString(),
- )
-
- // Amount spent should be updated correctly
- assert.equal(
- registrationConditionalPassingAfter[i].amountSpent
- .sub(totalPayment)
- .toString(),
- registrationConditionalPassingBefore[
- i
- ].amountSpent.toString(),
- )
-
- // Last perform block number should be updated
- assert.equal(
- registrationConditionalPassingAfter[
- i
- ].lastPerformedBlockNumber.toString(),
- tx.blockNumber?.toString(),
- )
-
- netPayment = netPayment.add(totalPayment)
- }
- for (let i = 0; i < numPassingLogUpkeeps; i++) {
- const id =
- upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
- .id
- const gasUsed =
- upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
- .gasUsed
- const gasOverhead =
- upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
- .gasOverhead
- const totalPayment =
- upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
- .totalPayment
-
- expect(id).to.equal(passingLogUpkeepIds[i])
- assert.isTrue(gasUsed.gt(BigNumber.from('0')))
- assert.isTrue(gasOverhead.gt(BigNumber.from('0')))
- assert.isTrue(totalPayment.gt(BigNumber.from('0')))
-
- // Balance should be deducted
- assert.equal(
- registrationLogPassingBefore[i].balance
- .sub(totalPayment)
- .toString(),
- registrationLogPassingAfter[i].balance.toString(),
- )
-
- // Amount spent should be updated correctly
- assert.equal(
- registrationLogPassingAfter[i].amountSpent
- .sub(totalPayment)
- .toString(),
- registrationLogPassingBefore[i].amountSpent.toString(),
- )
-
- // Last perform block number should not be updated for log triggers
- assert.equal(
- registrationLogPassingAfter[
- i
- ].lastPerformedBlockNumber.toString(),
- '0',
- )
-
- netPayment = netPayment.add(totalPayment)
- }
+ netPayment = netPayment.add(totalPayment)
+ }
- for (let i = 0; i < numFailingUpkeeps; i++) {
- // InsufficientFunds log should be emitted
- const id = insufficientFundsLogs[i].args.id
- expect(id).to.equal(failingUpkeepIds[i])
-
- // Balance and amount spent should be same
- assert.equal(
- registrationFailingBefore[i].balance.toString(),
- registrationFailingAfter[i].balance.toString(),
- )
- assert.equal(
- registrationFailingBefore[i].amountSpent.toString(),
- registrationFailingAfter[i].amountSpent.toString(),
- )
-
- // Last perform block number should not be updated
- assert.equal(
- registrationFailingAfter[
- i
- ].lastPerformedBlockNumber.toString(),
- '0',
- )
- }
+ for (let i = 0; i < numFailingUpkeeps; i++) {
+ // InsufficientFunds log should be emitted
+ const id = insufficientFundsLogs[i].args.id
+ expect(id).to.equal(failingUpkeepIds[i])
- // Keeper payment is gasPayment + premium / num keepers
- const keeperPayment = netPayment
- .sub(premium)
- .add(premium.div(BigNumber.from(keeperAddresses.length)))
+ // Balance and amount spent should be same
+ assert.equal(
+ registrationFailingBefore[i].balance.toString(),
+ registrationFailingAfter[i].balance.toString(),
+ )
+ assert.equal(
+ registrationFailingBefore[i].amountSpent.toString(),
+ registrationFailingAfter[i].amountSpent.toString(),
+ )
- // Keeper should be paid net payment for all passed upkeeps
+ // Last perform block number should not be updated
assert.equal(
- keeperAfter.balance.sub(keeperPayment).toString(),
- keeperBefore.balance.toString(),
+ registrationFailingAfter[
+ i
+ ].lastPerformedBlockNumber.toString(),
+ '0',
)
+ }
- assert.isTrue(keeperLinkAfter.eq(keeperLinkBefore))
- assert.isTrue(registryLinkBefore.eq(registryLinkAfter))
- },
- )
+ // Keeper payment is gasPayment + premium / num keepers
+ const keeperPayment = netPayment
+ .sub(premium)
+ .add(premium.div(BigNumber.from(keeperAddresses.length)))
- it(
- '[Conditional:' +
- numPassingConditionalUpkeeps +
- ',Log' +
- numPassingLogUpkeeps +
- ',Failures:' +
- numFailingUpkeeps +
- '] splits gas overhead appropriately among performed upkeeps [ @skip-coverage ]',
- async () => {
- const allUpkeeps = await getMultipleUpkeepsDeployedAndFunded(
- numPassingConditionalUpkeeps,
- numPassingLogUpkeeps,
- numFailingUpkeeps,
- )
- const passingConditionalUpkeepIds =
- allUpkeeps.passingConditionalUpkeepIds
- const passingLogUpkeepIds = allUpkeeps.passingLogUpkeepIds
- const failingUpkeepIds = allUpkeeps.failingUpkeepIds
-
- // Perform the upkeeps once to remove non-zero storage slots and have predictable gas measurement
- let tx = await getTransmitTx(
- registry,
- keeper1,
- passingConditionalUpkeepIds.concat(
- passingLogUpkeepIds.concat(failingUpkeepIds),
- ),
- )
+ // Keeper should be paid net payment for all passed upkeeps
+ assert.equal(
+ keeperAfter.balance.sub(keeperPayment).toString(),
+ keeperBefore.balance.toString(),
+ )
+
+ assert.isTrue(keeperLinkAfter.eq(keeperLinkBefore))
+ assert.isTrue(registryLinkBefore.eq(registryLinkAfter))
+ },
+ )
- await tx.wait()
+ it(
+ '[Conditional:' +
+ numPassingConditionalUpkeeps +
+ ',Log' +
+ numPassingLogUpkeeps +
+ ',Failures:' +
+ numFailingUpkeeps +
+ '] splits gas overhead appropriately among performed upkeeps [ @skip-coverage ]',
+ async () => {
+ const allUpkeeps = await getMultipleUpkeepsDeployedAndFunded(
+ numPassingConditionalUpkeeps,
+ numPassingLogUpkeeps,
+ numFailingUpkeeps,
+ )
+ const passingConditionalUpkeepIds =
+ allUpkeeps.passingConditionalUpkeepIds
+ const passingLogUpkeepIds = allUpkeeps.passingLogUpkeepIds
+ const failingUpkeepIds = allUpkeeps.failingUpkeepIds
+
+ // Perform the upkeeps once to remove non-zero storage slots and have predictable gas measurement
+ let tx = await getTransmitTx(
+ registry,
+ keeper1,
+ passingConditionalUpkeepIds.concat(
+ passingLogUpkeepIds.concat(failingUpkeepIds),
+ ),
+ )
- // Do the actual thing
+ await tx.wait()
- tx = await getTransmitTx(
- registry,
- keeper1,
- passingConditionalUpkeepIds.concat(
- passingLogUpkeepIds.concat(failingUpkeepIds),
- ),
- )
+ // Do the actual thing
- const receipt = await tx.wait()
- const upkeepPerformedLogs = parseUpkeepPerformedLogs(receipt)
- // exactly numPassingUpkeeps Upkeep Performed should be emitted
- assert.equal(
- upkeepPerformedLogs.length,
- numPassingConditionalUpkeeps + numPassingLogUpkeeps,
- )
+ tx = await getTransmitTx(
+ registry,
+ keeper1,
+ passingConditionalUpkeepIds.concat(
+ passingLogUpkeepIds.concat(failingUpkeepIds),
+ ),
+ )
- const gasConditionalOverheadCap =
- registryConditionalOverhead.add(
- registryPerSignerGasOverhead.mul(BigNumber.from(f + 1)),
- )
- const gasLogOverheadCap = registryLogOverhead.add(
- registryPerSignerGasOverhead.mul(BigNumber.from(f + 1)),
- )
+ const receipt = await tx.wait()
+ const upkeepPerformedLogs = parseUpkeepPerformedLogs(receipt)
+ // exactly numPassingUpkeeps Upkeep Performed should be emitted
+ assert.equal(
+ upkeepPerformedLogs.length,
+ numPassingConditionalUpkeeps + numPassingLogUpkeeps,
+ )
- const overheadCanGetCapped =
- numFailingUpkeeps > 0 &&
- numPassingConditionalUpkeeps <= 1 &&
- numPassingLogUpkeeps <= 1
- // Can happen if there are failing upkeeps and only 1 successful upkeep of each type
- let netGasUsedPlusOverhead = BigNumber.from('0')
+ const gasConditionalOverheadCap = registryConditionalOverhead.add(
+ registryPerSignerGasOverhead.mul(BigNumber.from(f + 1)),
+ )
+ const gasLogOverheadCap = registryLogOverhead.add(
+ registryPerSignerGasOverhead.mul(BigNumber.from(f + 1)),
+ )
- for (let i = 0; i < numPassingConditionalUpkeeps; i++) {
- const gasUsed = upkeepPerformedLogs[i].args.gasUsed
- const gasOverhead = upkeepPerformedLogs[i].args.gasOverhead
+ const overheadCanGetCapped =
+ numFailingUpkeeps > 0 &&
+ numPassingConditionalUpkeeps <= 1 &&
+ numPassingLogUpkeeps <= 1
+ // Can happen if there are failing upkeeps and only 1 successful upkeep of each type
+ let netGasUsedPlusOverhead = BigNumber.from('0')
- assert.isTrue(gasUsed.gt(BigNumber.from('0')))
- assert.isTrue(gasOverhead.gt(BigNumber.from('0')))
+ for (let i = 0; i < numPassingConditionalUpkeeps; i++) {
+ const gasUsed = upkeepPerformedLogs[i].args.gasUsed
+ const gasOverhead = upkeepPerformedLogs[i].args.gasOverhead
- // Overhead should not exceed capped
- assert.isTrue(gasOverhead.lte(gasConditionalOverheadCap))
+ assert.isTrue(gasUsed.gt(BigNumber.from('0')))
+ assert.isTrue(gasOverhead.gt(BigNumber.from('0')))
- // Overhead should be same for every upkeep since they have equal performData, hence same caps
- assert.isTrue(
- gasOverhead.eq(upkeepPerformedLogs[0].args.gasOverhead),
- )
+ // Overhead should not exceed capped
+ assert.isTrue(gasOverhead.lte(gasConditionalOverheadCap))
- netGasUsedPlusOverhead = netGasUsedPlusOverhead
- .add(gasUsed)
- .add(gasOverhead)
- }
- for (let i = 0; i < numPassingLogUpkeeps; i++) {
- const gasUsed =
- upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
- .gasUsed
- const gasOverhead =
- upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
- .gasOverhead
-
- assert.isTrue(gasUsed.gt(BigNumber.from('0')))
- assert.isTrue(gasOverhead.gt(BigNumber.from('0')))
-
- // Overhead should not exceed capped
- assert.isTrue(gasOverhead.lte(gasLogOverheadCap))
-
- // Overhead should be same for every upkeep since they have equal performData, hence same caps
- assert.isTrue(
- gasOverhead.eq(
- upkeepPerformedLogs[numPassingConditionalUpkeeps].args
- .gasOverhead,
- ),
- )
+ // Overhead should be same for every upkeep since they have equal performData, hence same caps
+ assert.isTrue(
+ gasOverhead.eq(upkeepPerformedLogs[0].args.gasOverhead),
+ )
- netGasUsedPlusOverhead = netGasUsedPlusOverhead
- .add(gasUsed)
- .add(gasOverhead)
- }
+ netGasUsedPlusOverhead = netGasUsedPlusOverhead
+ .add(gasUsed)
+ .add(gasOverhead)
+ }
+ for (let i = 0; i < numPassingLogUpkeeps; i++) {
+ const gasUsed =
+ upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
+ .gasUsed
+ const gasOverhead =
+ upkeepPerformedLogs[numPassingConditionalUpkeeps + i].args
+ .gasOverhead
+
+ assert.isTrue(gasUsed.gt(BigNumber.from('0')))
+ assert.isTrue(gasOverhead.gt(BigNumber.from('0')))
+
+ // Overhead should not exceed capped
+ assert.isTrue(gasOverhead.lte(gasLogOverheadCap))
+
+ // Overhead should be same for every upkeep since they have equal performData, hence same caps
+ assert.isTrue(
+ gasOverhead.eq(
+ upkeepPerformedLogs[numPassingConditionalUpkeeps].args
+ .gasOverhead,
+ ),
+ )
- const overheadsGotCapped =
- (numPassingConditionalUpkeeps > 0 &&
- upkeepPerformedLogs[0].args.gasOverhead.eq(
- gasConditionalOverheadCap,
- )) ||
- (numPassingLogUpkeeps > 0 &&
- upkeepPerformedLogs[
+ netGasUsedPlusOverhead = netGasUsedPlusOverhead
+ .add(gasUsed)
+ .add(gasOverhead)
+ }
+
+ const overheadsGotCapped =
+ (numPassingConditionalUpkeeps > 0 &&
+ upkeepPerformedLogs[0].args.gasOverhead.eq(
+ gasConditionalOverheadCap,
+ )) ||
+ (numPassingLogUpkeeps > 0 &&
+ upkeepPerformedLogs[
+ numPassingConditionalUpkeeps
+ ].args.gasOverhead.eq(gasLogOverheadCap))
+ // Should only get capped in certain scenarios
+ if (overheadsGotCapped) {
+ assert.isTrue(
+ overheadCanGetCapped,
+ 'Gas overhead got capped. Verify gas overhead variables in test match those in the registry. To not have the overheads capped increase REGISTRY_GAS_OVERHEAD',
+ )
+ }
+
+ console.log(
+ 'Gas Benchmarking - batching (passedConditionalUpkeeps: ',
+ numPassingConditionalUpkeeps,
+ 'passedLogUpkeeps:',
+ numPassingLogUpkeeps,
+ 'failedUpkeeps:',
+ numFailingUpkeeps,
+ '): ',
+ 'overheadsGotCapped',
+ overheadsGotCapped,
+ numPassingConditionalUpkeeps > 0
+ ? 'calculated conditional overhead'
+ : '',
+ numPassingConditionalUpkeeps > 0
+ ? upkeepPerformedLogs[0].args.gasOverhead.toString()
+ : '',
+ numPassingLogUpkeeps > 0 ? 'calculated log overhead' : '',
+ numPassingLogUpkeeps > 0
+ ? upkeepPerformedLogs[
numPassingConditionalUpkeeps
- ].args.gasOverhead.eq(gasLogOverheadCap))
- // Should only get capped in certain scenarios
- if (overheadsGotCapped) {
- assert.isTrue(
- overheadCanGetCapped,
- 'Gas overhead got capped. Verify gas overhead variables in test match those in the registry. To not have the overheads capped increase REGISTRY_GAS_OVERHEAD',
- )
- }
+ ].args.gasOverhead.toString()
+ : '',
+ ' margin over gasUsed',
+ netGasUsedPlusOverhead.sub(receipt.gasUsed).toString(),
+ )
- console.log(
- 'Gas Benchmarking - batching (passedConditionalUpkeeps: ',
- numPassingConditionalUpkeeps,
- 'passedLogUpkeeps:',
- numPassingLogUpkeeps,
- 'failedUpkeeps:',
- numFailingUpkeeps,
- '): ',
- 'overheadsGotCapped',
- overheadsGotCapped,
- numPassingConditionalUpkeeps > 0
- ? 'calculated conditional overhead'
- : '',
- numPassingConditionalUpkeeps > 0
- ? upkeepPerformedLogs[0].args.gasOverhead.toString()
- : '',
- numPassingLogUpkeeps > 0 ? 'calculated log overhead' : '',
- numPassingLogUpkeeps > 0
- ? upkeepPerformedLogs[
- numPassingConditionalUpkeeps
- ].args.gasOverhead.toString()
- : '',
- ' margin over gasUsed',
- netGasUsedPlusOverhead.sub(receipt.gasUsed).toString(),
+ // If overheads dont get capped then total gas charged should be greater than tx gas
+ // We don't check whether the net is within gasMargin as the margin changes with numFailedUpkeeps
+ // Which is ok, as long as individual gas overhead is capped
+ if (!overheadsGotCapped) {
+ assert.isTrue(
+ netGasUsedPlusOverhead.gt(receipt.gasUsed),
+ 'Gas overhead is too low, increase ACCOUNTING_PER_UPKEEP_GAS_OVERHEAD',
)
-
- // If overheads dont get capped then total gas charged should be greater than tx gas
- // We don't check whether the net is within gasMargin as the margin changes with numFailedUpkeeps
- // Which is ok, as long as individual gas overhead is capped
- if (!overheadsGotCapped) {
- assert.isTrue(
- netGasUsedPlusOverhead.gt(receipt.gasUsed),
- 'Gas overhead is too low, increase ACCOUNTING_PER_UPKEEP_GAS_OVERHEAD',
- )
- }
- },
- )
- }
+ }
+ },
+ )
}
}
+ }
- it('has enough perform gas overhead for large batches [ @skip-coverage ]', async () => {
- const numUpkeeps = 20
- const upkeepIds: BigNumber[] = []
- let totalPerformGas = BigNumber.from('0')
- for (let i = 0; i < numUpkeeps; i++) {
- const mock = await upkeepMockFactory.deploy()
- const tx = await registry
- .connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
- const testUpkeepId = await getUpkeepID(tx)
- upkeepIds.push(testUpkeepId)
+ it('has enough perform gas overhead for large batches [ @skip-coverage ]', async () => {
+ const numUpkeeps = 20
+ const upkeepIds: BigNumber[] = []
+ let totalPerformGas = BigNumber.from('0')
+ for (let i = 0; i < numUpkeeps; i++) {
+ const mock = await upkeepMockFactory.deploy()
+ const tx = await registry
+ .connect(owner)
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
+ const testUpkeepId = await getUpkeepID(tx)
+ upkeepIds.push(testUpkeepId)
- // Add funds to passing upkeeps
- await registry.connect(owner).addFunds(testUpkeepId, toWei('10'))
+ // Add funds to passing upkeeps
+ await registry.connect(owner).addFunds(testUpkeepId, toWei('10'))
- await mock.setCanPerform(true)
- await mock.setPerformGasToBurn(performGas)
+ await mock.setCanPerform(true)
+ await mock.setPerformGasToBurn(performGas)
- totalPerformGas = totalPerformGas.add(performGas)
- }
+ totalPerformGas = totalPerformGas.add(performGas)
+ }
- // Should revert with no overhead added
- await evmRevert(
- getTransmitTx(registry, keeper1, upkeepIds, {
- gasLimit: totalPerformGas,
- }),
- )
- // Should not revert with overhead added
- await getTransmitTx(registry, keeper1, upkeepIds, {
- gasLimit: totalPerformGas.add(transmitGasOverhead),
- })
+ // Should revert with no overhead added
+ await evmRevert(
+ getTransmitTx(registry, keeper1, upkeepIds, {
+ gasLimit: totalPerformGas,
+ }),
+ )
+ // Should not revert with overhead added
+ await getTransmitTx(registry, keeper1, upkeepIds, {
+ gasLimit: totalPerformGas.add(transmitGasOverhead),
})
+ })
- it('splits l2 payment among performed upkeeps', async () => {
- const numUpkeeps = 7
- const upkeepIds: BigNumber[] = []
- // Same as MockArbGasInfo.sol
- const l1CostWeiArb = BigNumber.from(1000000)
+ it('splits l2 payment among performed upkeeps', async () => {
+ const numUpkeeps = 7
+ const upkeepIds: BigNumber[] = []
+ // Same as MockArbGasInfo.sol
+ const l1CostWeiArb = BigNumber.from(1000000)
- for (let i = 0; i < numUpkeeps; i++) {
- const mock = await upkeepMockFactory.deploy()
- const tx = await arbRegistry
- .connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
- const testUpkeepId = await getUpkeepID(tx)
- upkeepIds.push(testUpkeepId)
+ for (let i = 0; i < numUpkeeps; i++) {
+ const mock = await upkeepMockFactory.deploy()
+ const tx = await arbRegistry
+ .connect(owner)
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
+ const testUpkeepId = await getUpkeepID(tx)
+ upkeepIds.push(testUpkeepId)
- // Add funds to passing upkeeps
- await arbRegistry.connect(owner).addFunds(testUpkeepId, toWei('100'))
- }
+ // Add funds to passing upkeeps
+ await arbRegistry.connect(owner).addFunds(testUpkeepId, toWei('100'))
+ }
- // Do the thing
- const tx = await getTransmitTx(
- arbRegistry,
- keeper1,
- upkeepIds,
+ // Do the thing
+ const tx = await getTransmitTx(
+ arbRegistry,
+ keeper1,
+ upkeepIds,
- { gasPrice: gasWei.mul('5') }, // High gas price so that it gets capped
- )
+ { gasPrice: gasWei.mul('5') }, // High gas price so that it gets capped
+ )
- const receipt = await tx.wait()
- const upkeepPerformedLogs = parseUpkeepPerformedLogs(receipt)
- // exactly numPassingUpkeeps Upkeep Performed should be emitted
- assert.equal(upkeepPerformedLogs.length, numUpkeeps)
+ const receipt = await tx.wait()
+ const upkeepPerformedLogs = parseUpkeepPerformedLogs(receipt)
+ // exactly numPassingUpkeeps Upkeep Performed should be emitted
+ assert.equal(upkeepPerformedLogs.length, numUpkeeps)
- // Verify the payment calculation in upkeepPerformed[0]
- const upkeepPerformedLog = upkeepPerformedLogs[0]
+ // Verify the payment calculation in upkeepPerformed[0]
+ const upkeepPerformedLog = upkeepPerformedLogs[0]
- const gasUsed = upkeepPerformedLog.args.gasUsed
- const gasOverhead = upkeepPerformedLog.args.gasOverhead
- const totalPayment = upkeepPerformedLog.args.totalPayment
+ const gasUsed = upkeepPerformedLog.args.gasUsed
+ const gasOverhead = upkeepPerformedLog.args.gasOverhead
+ const totalPayment = upkeepPerformedLog.args.totalPayment
- assert.equal(
- linkForGas(
- gasUsed,
- gasOverhead,
- gasCeilingMultiplier,
- paymentPremiumPPB,
- flatFeeMicroLink,
- l1CostWeiArb.div(gasCeilingMultiplier), // Dividing by gasCeilingMultiplier as it gets multiplied later
- BigNumber.from(numUpkeeps),
- ).total.toString(),
- totalPayment.toString(),
- )
- })
- },
- )
+ assert.equal(
+ linkForGas(
+ gasUsed,
+ gasOverhead,
+ gasCeilingMultiplier,
+ paymentPremiumPPB,
+ flatFeeMicroLink,
+ l1CostWeiArb.div(gasCeilingMultiplier), // Dividing by gasCeilingMultiplier as it gets multiplied later
+ BigNumber.from(numUpkeeps),
+ ).total.toString(),
+ totalPayment.toString(),
+ )
+ })
+ })
describe('#recoverFunds', () => {
const sent = toWei('7')
@@ -2632,13 +2612,9 @@ describe('AutomationRegistry2_2', () => {
// add funds to upkeep 1 and perform and withdraw some payment
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- emptyBytes,
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, emptyBytes)
const id1 = await getUpkeepID(tx)
await registry.connect(admin).addFunds(id1, toWei('5'))
@@ -2660,13 +2636,9 @@ describe('AutomationRegistry2_2', () => {
// add funds to upkeep 2 and perform and withdraw some payment
const tx2 = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- emptyBytes,
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, emptyBytes)
const id2 = await getUpkeepID(tx2)
await registry.connect(admin).addFunds(id2, toWei('5'))
@@ -2744,23 +2716,15 @@ describe('AutomationRegistry2_2', () => {
it('uses maxPerformData size in checkUpkeep but actual performDataSize in transmit', async () => {
const tx1 = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const upkeepID1 = await getUpkeepID(tx1)
const tx2 = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const upkeepID2 = await getUpkeepID(tx2)
await mock.setCanCheck(true)
await mock.setCanPerform(true)
@@ -2808,12 +2772,12 @@ describe('AutomationRegistry2_2', () => {
// upkeep 1 perform should succeed with empty performData
await getTransmitTx(registry, keeper1, [upkeepID1], {
gasPrice: gasWei.mul(gasCeilingMultiplier),
- }),
- // upkeep 2 perform should succeed with max performData size
- await getTransmitTx(registry, keeper1, [upkeepID2], {
- gasPrice: gasWei.mul(gasCeilingMultiplier),
- performData: maxPerformData,
- })
+ })
+ // upkeep 2 perform should succeed with max performData size
+ await getTransmitTx(registry, keeper1, [upkeepID2], {
+ gasPrice: gasWei.mul(gasCeilingMultiplier),
+ performData: maxPerformData,
+ })
})
})
@@ -2823,13 +2787,9 @@ describe('AutomationRegistry2_2', () => {
beforeEach(async () => {
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
upkeepId2 = await getUpkeepID(tx)
await registry.connect(admin).addFunds(upkeepId, toWei('100'))
@@ -3324,15 +3284,15 @@ describe('AutomationRegistry2_2', () => {
const l1CostWeiArb = arbL1PriceinWei.mul(16).mul(maxPerformDataSize)
const l1CostWeiOpt = BigNumber.from(2000000) // Same as MockOVMGasPriceOracle.sol
itMaybe('calculates the max fee appropriately', async () => {
- await verifyMaxPayment(registry)
+ await verifyMaxPayment(registry, chainModuleBase.address)
})
itMaybe('calculates the max fee appropriately for Arbitrum', async () => {
- await verifyMaxPayment(arbRegistry, l1CostWeiArb)
+ await verifyMaxPayment(arbRegistry, arbitrumModule.address, l1CostWeiArb)
})
itMaybe('calculates the max fee appropriately for Optimism', async () => {
- await verifyMaxPayment(opRegistry, l1CostWeiOpt)
+ await verifyMaxPayment(opRegistry, optimismModule.address, l1CostWeiOpt)
})
it('uses the fallback gas price if the feed has issues', async () => {
@@ -3513,7 +3473,7 @@ describe('AutomationRegistry2_2', () => {
})
})
- describeMaybe('#setConfig - onchain', () => {
+ describeMaybe('#setConfig - onchain', async () => {
const payment = BigNumber.from(1)
const flatFee = BigNumber.from(2)
const maxGas = BigNumber.from(6)
@@ -3546,6 +3506,7 @@ describe('AutomationRegistry2_2', () => {
transcoder: newTranscoder,
registrars: newRegistrars,
upkeepPrivilegeManager: upkeepManager,
+ chainModule: chainModuleBase.address,
reorgProtectionEnabled: true,
}
@@ -3881,23 +3842,21 @@ describe('AutomationRegistry2_2', () => {
for (let i = 0; i < signerAddresses.length; i++) {
const signer = signerAddresses[i]
if (!newSigners.includes(signer)) {
- assert((await registry.getSignerInfo(signer)).active == false)
+ assert(!(await registry.getSignerInfo(signer)).active)
assert((await registry.getSignerInfo(signer)).index == 0)
}
}
// New signer addresses should be active
for (let i = 0; i < newSigners.length; i++) {
const signer = newSigners[i]
- assert((await registry.getSignerInfo(signer)).active == true)
+ assert((await registry.getSignerInfo(signer)).active)
assert((await registry.getSignerInfo(signer)).index == i)
}
// Old transmitter addresses which are not in new transmitter should be non active, update lastCollected but retain other info
for (let i = 0; i < keeperAddresses.length; i++) {
const transmitter = keeperAddresses[i]
if (!newKeepers.includes(transmitter)) {
- assert(
- (await registry.getTransmitterInfo(transmitter)).active == false,
- )
+ assert(!(await registry.getTransmitterInfo(transmitter)).active)
assert((await registry.getTransmitterInfo(transmitter)).index == i)
assert(
(await registry.getTransmitterInfo(transmitter)).lastCollected.eq(
@@ -3911,7 +3870,7 @@ describe('AutomationRegistry2_2', () => {
// New transmitter addresses should be active
for (let i = 0; i < newKeepers.length; i++) {
const transmitter = newKeepers[i]
- assert((await registry.getTransmitterInfo(transmitter)).active == true)
+ assert((await registry.getTransmitterInfo(transmitter)).active)
assert((await registry.getTransmitterInfo(transmitter)).index == i)
assert(
(await registry.getTransmitterInfo(transmitter)).lastCollected.eq(
@@ -3970,13 +3929,9 @@ describe('AutomationRegistry2_2', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, '0x'),
'RegistryPaused()',
)
})
@@ -3985,13 +3940,9 @@ describe('AutomationRegistry2_2', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- zeroAddress,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](zeroAddress, performGas, await admin.getAddress(), emptyBytes, '0x'),
'NotAContract()',
)
})
@@ -4000,13 +3951,9 @@ describe('AutomationRegistry2_2', () => {
await evmRevert(
registry
.connect(keeper1)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, '0x'),
'OnlyCallableByOwnerOrRegistrar()',
)
})
@@ -4015,13 +3962,9 @@ describe('AutomationRegistry2_2', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- 2299,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, 2299, await admin.getAddress(), emptyBytes, '0x'),
'GasLimitOutsideRange()',
)
})
@@ -4030,13 +3973,9 @@ describe('AutomationRegistry2_2', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- 5000001,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, 5000001, await admin.getAddress(), emptyBytes, '0x'),
'GasLimitOutsideRange()',
)
})
@@ -4049,13 +3988,9 @@ describe('AutomationRegistry2_2', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- longBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), longBytes, '0x'),
'CheckDataExceedsLimit()',
)
})
@@ -4070,13 +4005,9 @@ describe('AutomationRegistry2_2', () => {
const checkData = checkDatas[kdx]
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- checkData,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), checkData, '0x')
//confirm the upkeep details and verify emitted events
const testUpkeepId = await getUpkeepID(tx)
@@ -4568,6 +4499,7 @@ describe('AutomationRegistry2_2', () => {
transcoder: transcoder.address,
registrars: [],
upkeepPrivilegeManager: upkeepManager,
+ chainModule: chainModuleBase.address,
reorgProtectionEnabled: true,
},
offchainVersion,
@@ -4738,13 +4670,9 @@ describe('AutomationRegistry2_2', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, '0x'),
'RegistryPaused()',
)
})
@@ -4794,7 +4722,7 @@ describe('AutomationRegistry2_2', () => {
expect((await registry.getState()).state.numUpkeeps).to.equal(
numUpkeeps,
)
- const forwarder = await IAutomationForwarderFactory.connect(
+ const forwarder = IAutomationForwarderFactory.connect(
forwarderAddress,
owner,
)
@@ -5213,6 +5141,7 @@ describe('AutomationRegistry2_2', () => {
transcoder: transcoder.address,
registrars: [],
upkeepPrivilegeManager: upkeepManager,
+ chainModule: chainModuleBase.address,
reorgProtectionEnabled: true,
},
offchainVersion,
@@ -5267,6 +5196,7 @@ describe('AutomationRegistry2_2', () => {
transcoder: transcoder.address,
registrars: [],
upkeepPrivilegeManager: upkeepManager,
+ chainModule: chainModuleBase.address,
reorgProtectionEnabled: true,
},
offchainVersion,
@@ -5316,6 +5246,7 @@ describe('AutomationRegistry2_2', () => {
transcoder: transcoder.address,
registrars: [],
upkeepPrivilegeManager: upkeepManager,
+ chainModule: chainModuleBase.address,
reorgProtectionEnabled: true,
},
offchainVersion,
diff --git a/contracts/test/v0.8/automation/KeeperRegistry2_1.test.ts b/contracts/test/v0.8/automation/KeeperRegistry2_1.test.ts
index f6864bd36de..65f6a596fca 100644
--- a/contracts/test/v0.8/automation/KeeperRegistry2_1.test.ts
+++ b/contracts/test/v0.8/automation/KeeperRegistry2_1.test.ts
@@ -990,13 +990,9 @@ describe('KeeperRegistry2_1', () => {
.transfer(await admin.getAddress(), toWei('1000'))
let tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
upkeepId = await getUpkeepID(tx)
autoFunderUpkeep = await upkeepAutoFunderFactory
@@ -1004,27 +1000,17 @@ describe('KeeperRegistry2_1', () => {
.deploy(linkToken.address, registry.address)
tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- autoFunderUpkeep.address,
- performGas,
- autoFunderUpkeep.address,
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](autoFunderUpkeep.address, performGas, autoFunderUpkeep.address, randomBytes, '0x')
afUpkeepId = await getUpkeepID(tx)
ltUpkeep = await deployMockContract(owner, ILogAutomationactory.abi)
tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,uint8,bytes,bytes,bytes)'](
- ltUpkeep.address,
- performGas,
- await admin.getAddress(),
- Trigger.LOG,
- '0x',
- logTriggerConfig,
- emptyBytes,
- )
+ [
+ 'registerUpkeep(address,uint32,address,uint8,bytes,bytes,bytes)'
+ ](ltUpkeep.address, performGas, await admin.getAddress(), Trigger.LOG, '0x', logTriggerConfig, emptyBytes)
logUpkeepId = await getUpkeepID(tx)
await autoFunderUpkeep.setUpkeepId(afUpkeepId)
@@ -1035,13 +1021,9 @@ describe('KeeperRegistry2_1', () => {
tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- streamsLookupUpkeep.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](streamsLookupUpkeep.address, performGas, await admin.getAddress(), randomBytes, '0x')
streamsLookupUpkeepId = await getUpkeepID(tx)
}
@@ -1059,13 +1041,9 @@ describe('KeeperRegistry2_1', () => {
await mock.setPerformGasToBurn(BigNumber.from('0'))
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const condUpkeepId = await getUpkeepID(tx)
passingConditionalUpkeepIds.push(condUpkeepId)
@@ -1078,15 +1056,9 @@ describe('KeeperRegistry2_1', () => {
await mock.setPerformGasToBurn(BigNumber.from('0'))
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,uint8,bytes,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- Trigger.LOG,
- '0x',
- logTriggerConfig,
- emptyBytes,
- )
+ [
+ 'registerUpkeep(address,uint32,address,uint8,bytes,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), Trigger.LOG, '0x', logTriggerConfig, emptyBytes)
const logUpkeepId = await getUpkeepID(tx)
passingLogUpkeepIds.push(logUpkeepId)
@@ -1099,13 +1071,9 @@ describe('KeeperRegistry2_1', () => {
await mock.setPerformGasToBurn(BigNumber.from('0'))
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const failingUpkeepId = await getUpkeepID(tx)
failingUpkeepIds.push(failingUpkeepId)
}
@@ -1587,13 +1555,9 @@ describe('KeeperRegistry2_1', () => {
let tx = await arbRegistry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const testUpkeepId = await getUpkeepID(tx)
await arbRegistry.connect(owner).addFunds(testUpkeepId, toWei('100'))
@@ -2565,13 +2529,9 @@ describe('KeeperRegistry2_1', () => {
const mock = await upkeepMockFactory.deploy()
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const testUpkeepId = await getUpkeepID(tx)
upkeepIds.push(testUpkeepId)
@@ -2606,13 +2566,9 @@ describe('KeeperRegistry2_1', () => {
const mock = await upkeepMockFactory.deploy()
const tx = await arbRegistry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const testUpkeepId = await getUpkeepID(tx)
upkeepIds.push(testUpkeepId)
@@ -2669,13 +2625,9 @@ describe('KeeperRegistry2_1', () => {
// add funds to upkeep 1 and perform and withdraw some payment
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- emptyBytes,
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, emptyBytes)
const id1 = await getUpkeepID(tx)
await registry.connect(admin).addFunds(id1, toWei('5'))
@@ -2697,13 +2649,9 @@ describe('KeeperRegistry2_1', () => {
// add funds to upkeep 2 and perform and withdraw some payment
const tx2 = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- emptyBytes,
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, emptyBytes)
const id2 = await getUpkeepID(tx2)
await registry.connect(admin).addFunds(id2, toWei('5'))
@@ -2781,23 +2729,15 @@ describe('KeeperRegistry2_1', () => {
it('uses maxPerformData size in checkUpkeep but actual performDataSize in transmit', async () => {
const tx1 = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const upkeepID1 = await getUpkeepID(tx1)
const tx2 = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
const upkeepID2 = await getUpkeepID(tx2)
await mock.setCanCheck(true)
await mock.setCanPerform(true)
@@ -2860,13 +2800,9 @@ describe('KeeperRegistry2_1', () => {
beforeEach(async () => {
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- randomBytes,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), randomBytes, '0x')
upkeepId2 = await getUpkeepID(tx)
await registry.connect(admin).addFunds(upkeepId, toWei('100'))
@@ -4006,13 +3942,9 @@ describe('KeeperRegistry2_1', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, '0x'),
'RegistryPaused()',
)
})
@@ -4021,13 +3953,9 @@ describe('KeeperRegistry2_1', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- zeroAddress,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](zeroAddress, performGas, await admin.getAddress(), emptyBytes, '0x'),
'NotAContract()',
)
})
@@ -4036,13 +3964,9 @@ describe('KeeperRegistry2_1', () => {
await evmRevert(
registry
.connect(keeper1)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, '0x'),
'OnlyCallableByOwnerOrRegistrar()',
)
})
@@ -4051,13 +3975,9 @@ describe('KeeperRegistry2_1', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- 2299,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, 2299, await admin.getAddress(), emptyBytes, '0x'),
'GasLimitOutsideRange()',
)
})
@@ -4066,13 +3986,9 @@ describe('KeeperRegistry2_1', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- 5000001,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, 5000001, await admin.getAddress(), emptyBytes, '0x'),
'GasLimitOutsideRange()',
)
})
@@ -4085,13 +4001,9 @@ describe('KeeperRegistry2_1', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- longBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), longBytes, '0x'),
'CheckDataExceedsLimit()',
)
})
@@ -4106,13 +4018,9 @@ describe('KeeperRegistry2_1', () => {
const checkData = checkDatas[kdx]
const tx = await registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- checkData,
- '0x',
- )
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), checkData, '0x')
//confirm the upkeep details and verify emitted events
const testUpkeepId = await getUpkeepID(tx)
@@ -4773,13 +4681,9 @@ describe('KeeperRegistry2_1', () => {
await evmRevert(
registry
.connect(owner)
- ['registerUpkeep(address,uint32,address,bytes,bytes)'](
- mock.address,
- performGas,
- await admin.getAddress(),
- emptyBytes,
- '0x',
- ),
+ [
+ 'registerUpkeep(address,uint32,address,bytes,bytes)'
+ ](mock.address, performGas, await admin.getAddress(), emptyBytes, '0x'),
'RegistryPaused()',
)
})
diff --git a/contracts/test/v0.8/automation/helpers.ts b/contracts/test/v0.8/automation/helpers.ts
index 3490bc72c4d..b3b4f0ef8b4 100644
--- a/contracts/test/v0.8/automation/helpers.ts
+++ b/contracts/test/v0.8/automation/helpers.ts
@@ -35,10 +35,12 @@ export const deployRegistry21 = async (
export const deployRegistry22 = async (
from: Signer,
- mode: Parameters[0],
- link: Parameters[1],
- linkNative: Parameters[2],
- fastgas: Parameters[3],
+ link: Parameters[0],
+ linkNative: Parameters[1],
+ fastgas: Parameters[2],
+ allowedReadOnlyAddress: Parameters<
+ AutomationRegistryLogicBFactory['deploy']
+ >[3],
): Promise => {
const logicBFactory = await ethers.getContractFactory(
'AutomationRegistryLogicB2_2',
@@ -55,7 +57,13 @@ export const deployRegistry22 = async (
const forwarderLogic = await forwarderLogicFactory.connect(from).deploy()
const logicB = await logicBFactory
.connect(from)
- .deploy(mode, link, linkNative, fastgas, forwarderLogic.address)
+ .deploy(
+ link,
+ linkNative,
+ fastgas,
+ forwarderLogic.address,
+ allowedReadOnlyAddress,
+ )
const logicA = await logicAFactory.connect(from).deploy(logicB.address)
const master = await registryFactory.connect(from).deploy(logicA.address)
return IAutomationRegistryMasterFactory.connect(master.address, from)
diff --git a/contracts/test/v0.8/foundry/vrf/VRFCoordinatorV2Plus_Migration.t.sol b/contracts/test/v0.8/foundry/vrf/VRFCoordinatorV2Plus_Migration.t.sol
index b6056286261..0c6825f8f6d 100644
--- a/contracts/test/v0.8/foundry/vrf/VRFCoordinatorV2Plus_Migration.t.sol
+++ b/contracts/test/v0.8/foundry/vrf/VRFCoordinatorV2Plus_Migration.t.sol
@@ -23,6 +23,7 @@ contract VRFCoordinatorV2Plus_Migration is BaseTest {
bytes internal constant COMPRESSED_PUBLIC_KEY =
hex"a0434d9e47f3c86235477c7b1ae6ae5d3442d49b1943c2b752a68e2a47e247c701";
bytes32 internal constant KEY_HASH = hex"9f2353bde94264dbc3d554a94cceba2d7d2b4fdce4304d3e09a1fea9fbeb1528";
+ uint64 internal constant GAS_LANE_MAX_GAS = 5000 gwei;
ExposedVRFCoordinatorV2_5 v1Coordinator;
VRFCoordinatorV2Plus_V2Example v2Coordinator;
@@ -91,7 +92,10 @@ contract VRFCoordinatorV2Plus_Migration is BaseTest {
600,
10_000,
20_000,
- VRFCoordinatorV2_5.FeeConfig({fulfillmentFlatFeeLinkPPM: 200, fulfillmentFlatFeeNativePPM: 100})
+ 500_000, // fulfillmentFlatFeeNativePPM
+ 100_000, // fulfillmentFlatFeeLinkDiscountPPM
+ 15, // nativePremiumPercentage
+ 10 // linkPremiumPercentage
);
v1Coordinator_noLink.setConfig(
DEFAULT_REQUEST_CONFIRMATIONS,
@@ -99,7 +103,10 @@ contract VRFCoordinatorV2Plus_Migration is BaseTest {
600,
10_000,
20_000,
- VRFCoordinatorV2_5.FeeConfig({fulfillmentFlatFeeLinkPPM: 200, fulfillmentFlatFeeNativePPM: 100})
+ 500_000, // fulfillmentFlatFeeNativePPM
+ 100_000, // fulfillmentFlatFeeLinkDiscountPPM
+ 15, // nativePremiumPercentage
+ 10 // linkPremiumPercentage
);
registerProvingKey();
testConsumer.setCoordinator(v1CoordinatorAddr);
@@ -331,8 +338,8 @@ contract VRFCoordinatorV2Plus_Migration is BaseTest {
function registerProvingKey() public {
uint256[2] memory uncompressedKeyParts = this.getProvingKeyParts(UNCOMPRESSED_PUBLIC_KEY);
- v1Coordinator.registerProvingKey(uncompressedKeyParts);
- v1Coordinator_noLink.registerProvingKey(uncompressedKeyParts);
+ v1Coordinator.registerProvingKey(uncompressedKeyParts, GAS_LANE_MAX_GAS);
+ v1Coordinator_noLink.registerProvingKey(uncompressedKeyParts, GAS_LANE_MAX_GAS);
}
// note: Call this function via this.getProvingKeyParts to be able to pass memory as calldata and
diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol
index 62c08533d3f..dfd2c83d07b 100644
--- a/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol
+++ b/contracts/test/v0.8/foundry/vrf/VRFV2Plus.t.sol
@@ -24,6 +24,7 @@ import "@openzeppelin/contracts/utils/math/Math.sol"; // for Math.ceilDiv
contract VRFV2Plus is BaseTest {
address internal constant LINK_WHALE = 0xD883a6A1C22fC4AbFE938a5aDF9B2Cc31b1BF18B;
+ uint64 internal constant GAS_LANE_MAX_GAS = 5000 gwei;
// Bytecode for a VRFV2PlusConsumerExample contract.
// to calculate: console.logBytes(type(VRFV2PlusConsumerExample).creationCode);
@@ -37,9 +38,6 @@ contract VRFV2Plus is BaseTest {
MockLinkToken s_linkToken;
MockV3Aggregator s_linkNativeFeed;
- VRFCoordinatorV2_5.FeeConfig basicFeeConfig =
- VRFCoordinatorV2_5.FeeConfig({fulfillmentFlatFeeLinkPPM: 0, fulfillmentFlatFeeNativePPM: 0});
-
// VRF KeyV2 generated from a node; not sensitive information.
// The secret key used to generate this key is: 10.
bytes vrfUncompressedPublicKey =
@@ -55,6 +53,8 @@ contract VRFV2Plus is BaseTest {
vm.deal(LINK_WHALE, 10_000 ether);
changePrank(LINK_WHALE);
+ vm.txGasPrice(100 gwei);
+
// Instantiate BHS.
s_bhs = new BlockhashStore();
@@ -88,48 +88,126 @@ contract VRFV2Plus is BaseTest {
s_testCoordinator.setLINKAndLINKNativeFeed(address(s_linkToken), address(s_linkNativeFeed));
}
- function setConfig(VRFCoordinatorV2_5.FeeConfig memory feeConfig) internal {
+ function setConfig() internal {
s_testCoordinator.setConfig(
0, // minRequestConfirmations
2_500_000, // maxGasLimit
1, // stalenessSeconds
50_000, // gasAfterPaymentCalculation
50000000000000000, // fallbackWeiPerUnitLink
- feeConfig
+ 500_000, // fulfillmentFlatFeeNativePPM
+ 100_000, // fulfillmentFlatFeeLinkDiscountPPM
+ 15, // nativePremiumPercentage
+ 10 // linkPremiumPercentage
);
}
function testSetConfig() public {
// Should setConfig successfully.
- setConfig(basicFeeConfig);
- (uint16 minConfs, uint32 gasLimit, ) = s_testCoordinator.getRequestConfig();
- assertEq(minConfs, 0);
- assertEq(gasLimit, 2_500_000);
+ setConfig();
// Test that setting requestConfirmations above MAX_REQUEST_CONFIRMATIONS reverts.
vm.expectRevert(abi.encodeWithSelector(VRFCoordinatorV2_5.InvalidRequestConfirmations.selector, 500, 500, 200));
- s_testCoordinator.setConfig(500, 2_500_000, 1, 50_000, 50000000000000000, basicFeeConfig);
+ s_testCoordinator.setConfig(
+ 500,
+ 2_500_000,
+ 1,
+ 50_000,
+ 50000000000000000,
+ 500_000, // fulfillmentFlatFeeNativePPM
+ 100_000, // fulfillmentFlatFeeLinkDiscountPPM
+ 15, // nativePremiumPercentage
+ 10 // linkPremiumPercentage
+ );
// Test that setting fallbackWeiPerUnitLink to zero reverts.
vm.expectRevert(abi.encodeWithSelector(VRFCoordinatorV2_5.InvalidLinkWeiPrice.selector, 0));
- s_testCoordinator.setConfig(0, 2_500_000, 1, 50_000, 0, basicFeeConfig);
+
+ s_testCoordinator.setConfig(
+ 0,
+ 2_500_000,
+ 1,
+ 50_000,
+ 0,
+ 500_000, // fulfillmentFlatFeeNativePPM
+ 100_000, // fulfillmentFlatFeeLinkDiscountPPM
+ 15, // nativePremiumPercentage
+ 10 // linkPremiumPercentage
+ );
+
+ // Test that setting link discount flat fee higher than native flat fee reverts
+ vm.expectRevert(abi.encodeWithSelector(VRFCoordinatorV2_5.LinkDiscountTooHigh.selector, uint32(1000), uint32(500)));
+
+ s_testCoordinator.setConfig(
+ 0,
+ 2_500_000,
+ 1,
+ 50_000,
+ 500,
+ 500, // fulfillmentFlatFeeNativePPM
+ 1000, // fulfillmentFlatFeeLinkDiscountPPM
+ 15, // nativePremiumPercentage
+ 10 // linkPremiumPercentage
+ );
}
function testRegisterProvingKey() public {
// Should set the proving key successfully.
registerProvingKey();
- (, , bytes32[] memory keyHashes) = s_testCoordinator.getRequestConfig();
- assertEq(keyHashes[0], vrfKeyHash);
// Should revert when already registered.
uint256[2] memory uncompressedKeyParts = this.getProvingKeyParts(vrfUncompressedPublicKey);
vm.expectRevert(abi.encodeWithSelector(VRFCoordinatorV2_5.ProvingKeyAlreadyRegistered.selector, vrfKeyHash));
- s_testCoordinator.registerProvingKey(uncompressedKeyParts);
+ s_testCoordinator.registerProvingKey(uncompressedKeyParts, GAS_LANE_MAX_GAS);
}
+ event ProvingKeyRegistered(bytes32 keyHash, uint64 maxGas);
+ event ProvingKeyDeregistered(bytes32 keyHash, uint64 maxGas);
+
function registerProvingKey() public {
uint256[2] memory uncompressedKeyParts = this.getProvingKeyParts(vrfUncompressedPublicKey);
- s_testCoordinator.registerProvingKey(uncompressedKeyParts);
+ bytes32 keyHash = keccak256(abi.encode(uncompressedKeyParts));
+ vm.expectEmit(
+ false, // no indexed args to check for
+ false, // no indexed args to check for
+ false, // no indexed args to check for
+ true
+ ); // check data fields: keyHash and maxGas
+ emit ProvingKeyRegistered(keyHash, GAS_LANE_MAX_GAS);
+ s_testCoordinator.registerProvingKey(uncompressedKeyParts, GAS_LANE_MAX_GAS);
+ (bool exists, uint64 maxGas) = s_testCoordinator.s_provingKeys(keyHash);
+ assertTrue(exists);
+ assertEq(GAS_LANE_MAX_GAS, maxGas);
+ assertEq(s_testCoordinator.s_provingKeyHashes(0), keyHash);
+ }
+
+ function testDeregisterProvingKey() public {
+ // Should set the proving key successfully.
+ registerProvingKey();
+
+ bytes
+ memory unregisteredPubKey = hex"6d919e4ed6add6c34b2af77eb6b2d2f5d27db11ba004e70734b23bd4321ea234ff8577a063314bead6d88c1b01849289a5542767a5138924f38fed551a7773db";
+
+ // Should revert when given pubkey is not registered
+ uint256[2] memory unregisteredKeyParts = this.getProvingKeyParts(unregisteredPubKey);
+ bytes32 unregisterdKeyHash = keccak256(abi.encode(unregisteredKeyParts));
+ vm.expectRevert(abi.encodeWithSelector(VRFCoordinatorV2_5.NoSuchProvingKey.selector, unregisterdKeyHash));
+ s_testCoordinator.deregisterProvingKey(unregisteredKeyParts);
+
+ // correctly deregister pubkey
+ uint256[2] memory uncompressedKeyParts = this.getProvingKeyParts(vrfUncompressedPublicKey);
+ bytes32 keyHash = keccak256(abi.encode(uncompressedKeyParts));
+ vm.expectEmit(
+ false, // no indexed args to check for
+ false, // no indexed args to check for
+ false, // no indexed args to check for
+ true
+ ); // check data fields: keyHash and maxGas
+ emit ProvingKeyDeregistered(keyHash, GAS_LANE_MAX_GAS);
+ s_testCoordinator.deregisterProvingKey(uncompressedKeyParts);
+ (bool exists, uint64 maxGas) = s_testCoordinator.s_provingKeys(keyHash);
+ assertFalse(exists);
+ assertEq(0, maxGas);
}
// note: Call this function via this.getProvingKeyParts to be able to pass memory as calldata and
@@ -240,18 +318,106 @@ contract VRFV2Plus is BaseTest {
);
function testRequestAndFulfillRandomWordsNative() public {
- uint32 requestBlock = 10;
+ (
+ VRF.Proof memory proof,
+ VRFCoordinatorV2_5.RequestCommitment memory rc,
+ uint256 subId,
+ uint256 requestId
+ ) = setupSubAndRequestRandomnessNativePayment();
+ (, uint96 nativeBalanceBefore, , , ) = s_testCoordinator.getSubscription(subId);
+
+ uint256 outputSeed = s_testCoordinator.getRandomnessFromProofExternal(proof, rc).randomness;
+ vm.recordLogs();
+ uint96 payment = s_testCoordinator.fulfillRandomWords(proof, rc, false);
+ VmSafe.Log[] memory entries = vm.getRecordedLogs();
+ assertEq(entries[0].topics[1], bytes32(uint256(requestId)));
+ assertEq(entries[0].topics[2], bytes32(uint256(subId)));
+ (uint256 loggedOutputSeed, , bool loggedSuccess) = abi.decode(entries[0].data, (uint256, uint256, bool));
+ assertEq(loggedOutputSeed, outputSeed);
+ assertEq(loggedSuccess, true);
+
+ (bool fulfilled, , ) = s_testConsumer.s_requests(requestId);
+ assertEq(fulfilled, true);
+
+ // The cost of fulfillRandomWords is approximately 70_000 gas.
+ // gasAfterPaymentCalculation is 50_000.
+ //
+ // The cost of the VRF fulfillment charged to the user is:
+ // baseFeeWei = weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft())
+ // baseFeeWei = 1e11 * (50_000 + 70_000)
+ // baseFeeWei = 1.2e16
+ // flatFeeWei = 1e12 * (fulfillmentFlatFeeNativePPM)
+ // flatFeeWei = 1e12 * 500_000 = 5e17
+ // ...
+ // billed_fee = baseFeeWei * (100 + linkPremiumPercentage / 100) + 5e17
+ // billed_fee = 1.2e16 * 1.15 + 5e17
+ // billed_fee = 5.138e+17
+ (, uint96 nativeBalanceAfter, , , ) = s_testCoordinator.getSubscription(subId);
+ // 1e15 is less than 1 percent discrepancy
+ assertApproxEqAbs(payment, 5.138 * 1e17, 1e15);
+ assertApproxEqAbs(nativeBalanceAfter, nativeBalanceBefore - 5.138 * 1e17, 1e15);
+ }
+
+ function testRequestAndFulfillRandomWordsLINK() public {
+ (
+ VRF.Proof memory proof,
+ VRFCoordinatorV2_5.RequestCommitment memory rc,
+ uint256 subId,
+ uint256 requestId
+ ) = setupSubAndRequestRandomnessLINKPayment();
+ (uint96 linkBalanceBefore, , , , ) = s_testCoordinator.getSubscription(subId);
+
+ uint256 outputSeed = s_testCoordinator.getRandomnessFromProofExternal(proof, rc).randomness;
+ vm.recordLogs();
+ uint96 payment = s_testCoordinator.fulfillRandomWords(proof, rc, false);
+
+ VmSafe.Log[] memory entries = vm.getRecordedLogs();
+ assertEq(entries[0].topics[1], bytes32(uint256(requestId)));
+ assertEq(entries[0].topics[2], bytes32(uint256(subId)));
+ (uint256 loggedOutputSeed, , bool loggedSuccess) = abi.decode(entries[0].data, (uint256, uint256, bool));
+ assertEq(loggedOutputSeed, outputSeed);
+ assertEq(loggedSuccess, true);
+
+ (bool fulfilled, , ) = s_testConsumer.s_requests(requestId);
+ assertEq(fulfilled, true);
+
+ // The cost of fulfillRandomWords is approximately 97_000 gas.
+ // gasAfterPaymentCalculation is 50_000.
+ //
+ // The cost of the VRF fulfillment charged to the user is:
+ // paymentNoFee = (weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft() + l1CostWei) / link_native_ratio)
+ // paymentNoFee = (1e11 * (50_000 + 97_000 + 0)) / .5
+ // paymentNoFee = 2.94e16
+ // flatFeeWei = 1e12 * (fulfillmentFlatFeeNativePPM - fulfillmentFlatFeeLinkDiscountPPM)
+ // flatFeeWei = 1e12 * (500_000 - 100_000)
+ // flatFeeJuels = 1e18 * flatFeeWei / link_native_ratio
+ // flatFeeJuels = 4e17 / 0.5 = 8e17
+ // billed_fee = paymentNoFee * ((100 + 10) / 100) + 8e17
+ // billed_fee = 2.94e16 * 1.1 + 8e17
+ // billed_fee = 3.234e16 + 8e17 = 8.3234e17
+ // note: delta is doubled from the native test to account for more variance due to the link/native ratio
+ (uint96 linkBalanceAfter, , , , ) = s_testCoordinator.getSubscription(subId);
+ // 1e15 is less than 1 percent discrepancy
+ assertApproxEqAbs(payment, 8.3234 * 1e17, 1e15);
+ assertApproxEqAbs(linkBalanceAfter, linkBalanceBefore - 8.3234 * 1e17, 1e15);
+ }
+
+ function setupSubAndRequestRandomnessLINKPayment()
+ internal
+ returns (VRF.Proof memory proof, VRFCoordinatorV2_5.RequestCommitment memory rc, uint256 subId, uint256 requestId)
+ {
+ uint32 requestBlock = 20;
vm.roll(requestBlock);
- s_testConsumer.createSubscriptionAndFund(0);
+ s_linkToken.transfer(address(s_testConsumer), 10 ether);
+ s_testConsumer.createSubscriptionAndFund(10 ether);
uint256 subId = s_testConsumer.s_subId();
- s_testCoordinator.fundSubscriptionWithNative{value: 10 ether}(subId);
// Apply basic configs to contract.
- setConfig(basicFeeConfig);
+ setConfig();
registerProvingKey();
// Request random words.
- vm.expectEmit(true, true, true, true);
+ vm.expectEmit(true, true, false, true);
(uint256 requestId, uint256 preSeed) = s_testCoordinator.computeRequestIdExternal(
vrfKeyHash,
address(s_testConsumer),
@@ -266,10 +432,10 @@ contract VRFV2Plus is BaseTest {
0, // minConfirmations
1_000_000, // callbackGasLimit
1, // numWords
- VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true})), // nativePayment
+ VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false})), // nativePayment, // nativePayment
address(s_testConsumer) // requester
);
- s_testConsumer.requestRandomWords(1_000_000, 0, 1, vrfKeyHash, true);
+ s_testConsumer.requestRandomWords(1_000_000, 0, 1, vrfKeyHash, false);
(bool fulfilled, , ) = s_testConsumer.s_requests(requestId);
assertEq(fulfilled, false);
@@ -282,93 +448,68 @@ contract VRFV2Plus is BaseTest {
// Store the previous block's blockhash, and assert that it is as expected.
vm.roll(requestBlock + 1);
s_bhs.store(requestBlock);
- assertEq(hex"000000000000000000000000000000000000000000000000000000000000000a", s_bhs.getBlockhash(requestBlock));
+ assertEq(hex"0000000000000000000000000000000000000000000000000000000000000014", s_bhs.getBlockhash(requestBlock));
// Fulfill the request.
// Proof generated via the generate-proof-v2-plus script command. Example usage:
/*
- go run . generate-proof-v2-plus \
+ go run . generate-proof-v2-plus \
-key-hash 0x9f2353bde94264dbc3d554a94cceba2d7d2b4fdce4304d3e09a1fea9fbeb1528 \
- -pre-seed 93724884573574303181157854277074121673523280784530506403108144933983063023487 \
- -block-hash 0x000000000000000000000000000000000000000000000000000000000000000a \
- -block-num 10 \
- -sender 0x90A8820424CC8a819d14cBdE54D12fD3fbFa9bb2 \
- -native-payment true
- */
+ -pre-seed 108233140904510496268355288815996296196427471042093167619305836589216327096601 \
+ -block-hash 0x0000000000000000000000000000000000000000000000000000000000000014 \
+ -block-num 20 \
+ -sender 0x90A8820424CC8a819d14cBdE54D12fD3fbFa9bb2
+ */
VRF.Proof memory proof = VRF.Proof({
pk: [
72488970228380509287422715226575535698893157273063074627791787432852706183111,
62070622898698443831883535403436258712770888294397026493185421712108624767191
],
gamma: [
- 51111463251706978184511913295560024261167135799300172382907308330135472647507,
- 41885656274025752055847945432737871864088659248922821023734315208027501951872
+ 49785247270467418393187938018746488660500261614113251546613288843777654841004,
+ 8320717868018488740308781441198484312662094766876176838868269181386589318272
],
- c: 96917856581077810363012153828220232197567408835708926581335248000925197916153,
- s: 103298896676233752268329042222773891728807677368628421408380318882272184455566,
- seed: 93724884573574303181157854277074121673523280784530506403108144933983063023487,
- uWitness: 0xFCaA10875C6692f6CcC86c64300eb0b52f2D4323,
+ c: 41596204381278553342984662603150353549780558761307588910860350083645227536604,
+ s: 81592778991188138734863787790226463602813498664606420860910885269124681994753,
+ seed: 108233140904510496268355288815996296196427471042093167619305836589216327096601,
+ uWitness: 0x56920892EE71E624d369dCc8dc63B6878C85Ca70,
cGammaWitness: [
- 61463607927970680172418313129927007099021056249775757132623753443657677198526,
- 48686021866486086188742596461341782400160109177829661164208082534005682984658
+ 28250667431035633903490940933503696927659499415200427260709034207157951953043,
+ 105660182690338773283351292037478192732977803900032569393220726139772041021018
],
sHashWitness: [
- 91508089836242281395929619352465003226819385335975246221498243754781593857533,
- 63571625936444669399167157725633389238098818902162172059681813608664564703308
+ 18420263847278540234821121001488166570853056146131705862117248292063859054211,
+ 15740432967529684573970722302302642068194042971767150190061244675457227502736
],
- zInv: 97568175302326019383632009699686265453584842953005404815285123863099260038246
+ zInv: 100579074451139970455673776933943662313989441807178260211316504761358492254052
});
VRFCoordinatorV2_5.RequestCommitment memory rc = VRFCoordinatorV2_5.RequestCommitment({
blockNum: requestBlock,
subId: subId,
- callbackGasLimit: 1_000_000,
+ callbackGasLimit: 1000000,
numWords: 1,
sender: address(s_testConsumer),
- extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true}))
+ extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false}))
});
- (, uint96 nativeBalanceBefore, , , ) = s_testCoordinator.getSubscription(subId);
-
- uint256 outputSeed = s_testCoordinator.getRandomnessFromProofExternal(proof, rc).randomness;
- vm.recordLogs();
- s_testCoordinator.fulfillRandomWords{gas: 1_500_000}(proof, rc);
- VmSafe.Log[] memory entries = vm.getRecordedLogs();
- assertEq(entries[0].topics[1], bytes32(uint256(requestId)));
- assertEq(entries[0].topics[2], bytes32(uint256(subId)));
- (uint256 loggedOutputSeed, , bool loggedSuccess) = abi.decode(entries[0].data, (uint256, uint256, bool));
- assertEq(loggedOutputSeed, outputSeed);
- assertEq(loggedSuccess, true);
-
- (fulfilled, , ) = s_testConsumer.s_requests(requestId);
- assertEq(fulfilled, true);
-
- // The cost of fulfillRandomWords is approximately 100_000 gas.
- // gasAfterPaymentCalculation is 50_000.
- //
- // The cost of the VRF fulfillment charged to the user is:
- // baseFeeWei = weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft())
- // baseFeeWei = 1 * (50_000 + 100_000)
- // baseFeeWei = 150_000
- // ...
- // billed_fee = baseFeeWei + flatFeeWei + l1CostWei
- // billed_fee = baseFeeWei + 0 + 0
- // billed_fee = 150_000
- (, uint96 nativeBalanceAfter, , , ) = s_testCoordinator.getSubscription(subId);
- assertApproxEqAbs(nativeBalanceAfter, nativeBalanceBefore - 120_000, 10_000);
+ return (proof, rc, subId, requestId);
}
- function testRequestAndFulfillRandomWordsLINK() public {
- uint32 requestBlock = 20;
+ function setupSubAndRequestRandomnessNativePayment()
+ internal
+ returns (VRF.Proof memory proof, VRFCoordinatorV2_5.RequestCommitment memory rc, uint256 subId, uint256 requestId)
+ {
+ uint32 requestBlock = 10;
vm.roll(requestBlock);
- s_linkToken.transfer(address(s_testConsumer), 10 ether);
- s_testConsumer.createSubscriptionAndFund(10 ether);
+ s_testConsumer.createSubscriptionAndFund(0);
uint256 subId = s_testConsumer.s_subId();
+ s_testCoordinator.fundSubscriptionWithNative{value: 10 ether}(subId);
// Apply basic configs to contract.
- setConfig(basicFeeConfig);
+ setConfig();
registerProvingKey();
// Request random words.
- vm.expectEmit(true, true, false, true);
+ vm.expectEmit(true, true, true, true);
(uint256 requestId, uint256 preSeed) = s_testCoordinator.computeRequestIdExternal(
vrfKeyHash,
address(s_testConsumer),
@@ -383,10 +524,10 @@ contract VRFV2Plus is BaseTest {
0, // minConfirmations
1_000_000, // callbackGasLimit
1, // numWords
- VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false})), // nativePayment, // nativePayment
+ VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true})), // nativePayment
address(s_testConsumer) // requester
);
- s_testConsumer.requestRandomWords(1_000_000, 0, 1, vrfKeyHash, false);
+ s_testConsumer.requestRandomWords(1_000_000, 0, 1, vrfKeyHash, true);
(bool fulfilled, , ) = s_testConsumer.s_requests(requestId);
assertEq(fulfilled, false);
@@ -399,54 +540,133 @@ contract VRFV2Plus is BaseTest {
// Store the previous block's blockhash, and assert that it is as expected.
vm.roll(requestBlock + 1);
s_bhs.store(requestBlock);
- assertEq(hex"0000000000000000000000000000000000000000000000000000000000000014", s_bhs.getBlockhash(requestBlock));
+ assertEq(hex"000000000000000000000000000000000000000000000000000000000000000a", s_bhs.getBlockhash(requestBlock));
// Fulfill the request.
// Proof generated via the generate-proof-v2-plus script command. Example usage:
/*
- go run . generate-proof-v2-plus \
+ go run . generate-proof-v2-plus \
-key-hash 0x9f2353bde94264dbc3d554a94cceba2d7d2b4fdce4304d3e09a1fea9fbeb1528 \
- -pre-seed 108233140904510496268355288815996296196427471042093167619305836589216327096601 \
- -block-hash 0x0000000000000000000000000000000000000000000000000000000000000014 \
- -block-num 20 \
- -sender 0x90A8820424CC8a819d14cBdE54D12fD3fbFa9bb2
- */
+ -pre-seed 93724884573574303181157854277074121673523280784530506403108144933983063023487 \
+ -block-hash 0x000000000000000000000000000000000000000000000000000000000000000a \
+ -block-num 10 \
+ -sender 0x90A8820424CC8a819d14cBdE54D12fD3fbFa9bb2 \
+ -native-payment true
+ */
VRF.Proof memory proof = VRF.Proof({
pk: [
72488970228380509287422715226575535698893157273063074627791787432852706183111,
62070622898698443831883535403436258712770888294397026493185421712108624767191
],
gamma: [
- 49785247270467418393187938018746488660500261614113251546613288843777654841004,
- 8320717868018488740308781441198484312662094766876176838868269181386589318272
+ 51111463251706978184511913295560024261167135799300172382907308330135472647507,
+ 41885656274025752055847945432737871864088659248922821023734315208027501951872
],
- c: 41596204381278553342984662603150353549780558761307588910860350083645227536604,
- s: 81592778991188138734863787790226463602813498664606420860910885269124681994753,
- seed: 108233140904510496268355288815996296196427471042093167619305836589216327096601,
- uWitness: 0x56920892EE71E624d369dCc8dc63B6878C85Ca70,
+ c: 96917856581077810363012153828220232197567408835708926581335248000925197916153,
+ s: 103298896676233752268329042222773891728807677368628421408380318882272184455566,
+ seed: 93724884573574303181157854277074121673523280784530506403108144933983063023487,
+ uWitness: 0xFCaA10875C6692f6CcC86c64300eb0b52f2D4323,
cGammaWitness: [
- 28250667431035633903490940933503696927659499415200427260709034207157951953043,
- 105660182690338773283351292037478192732977803900032569393220726139772041021018
+ 61463607927970680172418313129927007099021056249775757132623753443657677198526,
+ 48686021866486086188742596461341782400160109177829661164208082534005682984658
],
sHashWitness: [
- 18420263847278540234821121001488166570853056146131705862117248292063859054211,
- 15740432967529684573970722302302642068194042971767150190061244675457227502736
+ 91508089836242281395929619352465003226819385335975246221498243754781593857533,
+ 63571625936444669399167157725633389238098818902162172059681813608664564703308
],
- zInv: 100579074451139970455673776933943662313989441807178260211316504761358492254052
+ zInv: 97568175302326019383632009699686265453584842953005404815285123863099260038246
});
VRFCoordinatorV2_5.RequestCommitment memory rc = VRFCoordinatorV2_5.RequestCommitment({
blockNum: requestBlock,
subId: subId,
- callbackGasLimit: 1000000,
+ callbackGasLimit: 1_000_000,
numWords: 1,
sender: address(s_testConsumer),
- extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: false}))
+ extraArgs: VRFV2PlusClient._argsToBytes(VRFV2PlusClient.ExtraArgsV1({nativePayment: true}))
});
+
+ return (proof, rc, subId, requestId);
+ }
+
+ function testRequestAndFulfillRandomWords_NetworkGasPriceExceedsGasLane() public {
+ (
+ VRF.Proof memory proof,
+ VRFCoordinatorV2_5.RequestCommitment memory rc,
+ ,
+
+ ) = setupSubAndRequestRandomnessNativePayment();
+
+ // network gas is higher than gas lane max gas
+ uint256 networkGasPrice = GAS_LANE_MAX_GAS + 1;
+ vm.txGasPrice(networkGasPrice);
+ vm.expectRevert(
+ abi.encodeWithSelector(VRFCoordinatorV2_5.GasPriceExceeded.selector, networkGasPrice, GAS_LANE_MAX_GAS)
+ );
+ s_testCoordinator.fulfillRandomWords(proof, rc, false);
+ }
+
+ function testRequestAndFulfillRandomWords_OnlyPremium_NativePayment() public {
+ (
+ VRF.Proof memory proof,
+ VRFCoordinatorV2_5.RequestCommitment memory rc,
+ uint256 subId,
+ uint256 requestId
+ ) = setupSubAndRequestRandomnessNativePayment();
+ (, uint96 nativeBalanceBefore, , , ) = s_testCoordinator.getSubscription(subId);
+
+ // network gas is twice the gas lane max gas
+ uint256 networkGasPrice = GAS_LANE_MAX_GAS * 2;
+ vm.txGasPrice(networkGasPrice);
+
+ uint256 outputSeed = s_testCoordinator.getRandomnessFromProofExternal(proof, rc).randomness;
+ vm.recordLogs();
+ uint96 payment = s_testCoordinator.fulfillRandomWords(proof, rc, true /* onlyPremium */);
+ VmSafe.Log[] memory entries = vm.getRecordedLogs();
+ assertEq(entries[0].topics[1], bytes32(uint256(requestId)));
+ assertEq(entries[0].topics[2], bytes32(uint256(subId)));
+ (uint256 loggedOutputSeed, , bool loggedSuccess) = abi.decode(entries[0].data, (uint256, uint256, bool));
+ assertEq(loggedOutputSeed, outputSeed);
+ assertEq(loggedSuccess, true);
+
+ (bool fulfilled, , ) = s_testConsumer.s_requests(requestId);
+ assertEq(fulfilled, true);
+
+ // The cost of fulfillRandomWords is approximately 70_000 gas.
+ // gasAfterPaymentCalculation is 50_000.
+ //
+ // The cost of the VRF fulfillment charged to the user is:
+ // baseFeeWei = weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft())
+ // network gas price is capped at gas lane max gas (5000 gwei)
+ // baseFeeWei = 5e12 * (50_000 + 70_000)
+ // baseFeeWei = 6e17
+ // flatFeeWei = 1e12 * (fulfillmentFlatFeeNativePPM)
+ // flatFeeWei = 1e12 * 500_000 = 5e17
+ // ...
+ // billed_fee = baseFeeWei * (linkPremiumPercentage / 100) + 5e17
+ // billed_fee = 6e17 * 0.15 + 5e17
+ // billed_fee = 5.9e+17
+ (, uint96 nativeBalanceAfter, , , ) = s_testCoordinator.getSubscription(subId);
+ // 1e15 is less than 1 percent discrepancy
+ assertApproxEqAbs(payment, 5.9 * 1e17, 1e15);
+ assertApproxEqAbs(nativeBalanceAfter, nativeBalanceBefore - 5.9 * 1e17, 1e15);
+ }
+
+ function testRequestAndFulfillRandomWords_OnlyPremium_LinkPayment() public {
+ (
+ VRF.Proof memory proof,
+ VRFCoordinatorV2_5.RequestCommitment memory rc,
+ uint256 subId,
+ uint256 requestId
+ ) = setupSubAndRequestRandomnessLINKPayment();
(uint96 linkBalanceBefore, , , , ) = s_testCoordinator.getSubscription(subId);
+ // network gas is twice the gas lane max gas
+ uint256 networkGasPrice = GAS_LANE_MAX_GAS * 5;
+ vm.txGasPrice(networkGasPrice);
+
uint256 outputSeed = s_testCoordinator.getRandomnessFromProofExternal(proof, rc).randomness;
vm.recordLogs();
- s_testCoordinator.fulfillRandomWords{gas: 1_500_000}(proof, rc);
+ uint96 payment = s_testCoordinator.fulfillRandomWords(proof, rc, true /* onlyPremium */);
VmSafe.Log[] memory entries = vm.getRecordedLogs();
assertEq(entries[0].topics[1], bytes32(uint256(requestId)));
@@ -455,22 +675,28 @@ contract VRFV2Plus is BaseTest {
assertEq(loggedOutputSeed, outputSeed);
assertEq(loggedSuccess, true);
- (fulfilled, , ) = s_testConsumer.s_requests(requestId);
+ (bool fulfilled, , ) = s_testConsumer.s_requests(requestId);
assertEq(fulfilled, true);
- // The cost of fulfillRandomWords is approximately 90_000 gas.
+ // The cost of fulfillRandomWords is approximately 97_000 gas.
// gasAfterPaymentCalculation is 50_000.
//
// The cost of the VRF fulfillment charged to the user is:
// paymentNoFee = (weiPerUnitGas * (gasAfterPaymentCalculation + startGas - gasleft() + l1CostWei) / link_native_ratio)
- // paymentNoFee = (1 * (50_000 + 90_000 + 0)) / .5
- // paymentNoFee = 280_000
- // ...
- // billed_fee = paymentNoFee + fulfillmentFlatFeeLinkPPM
- // billed_fee = baseFeeWei + 0
- // billed_fee = 280_000
+ // network gas price is capped at gas lane max gas (5000 gwei)
+ // paymentNoFee = (5e12 * (50_000 + 97_000 + 0)) / .5
+ // paymentNoFee = 1.47e+18
+ // flatFeeWei = 1e12 * (fulfillmentFlatFeeNativePPM - fulfillmentFlatFeeLinkDiscountPPM)
+ // flatFeeWei = 1e12 * (500_000 - 100_000)
+ // flatFeeJuels = 1e18 * flatFeeWei / link_native_ratio
+ // flatFeeJuels = 4e17 / 0.5 = 8e17
+ // billed_fee = paymentNoFee * (10 / 100) + 8e17
+ // billed_fee = 1.47e+18 * 0.1 + 8e17
+ // billed_fee = 9.47e+17
// note: delta is doubled from the native test to account for more variance due to the link/native ratio
(uint96 linkBalanceAfter, , , , ) = s_testCoordinator.getSubscription(subId);
- assertApproxEqAbs(linkBalanceAfter, linkBalanceBefore - 280_000, 20_000);
+ // 1e15 is less than 1 percent discrepancy
+ assertApproxEqAbs(payment, 9.47 * 1e17, 1e15);
+ assertApproxEqAbs(linkBalanceAfter, linkBalanceBefore - 9.47 * 1e17, 1e15);
}
}
diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2PlusSubscriptionAPI.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2PlusSubscriptionAPI.t.sol
index 0f34003d9ae..0df53a12175 100644
--- a/contracts/test/v0.8/foundry/vrf/VRFV2PlusSubscriptionAPI.t.sol
+++ b/contracts/test/v0.8/foundry/vrf/VRFV2PlusSubscriptionAPI.t.sol
@@ -609,6 +609,14 @@ contract VRFV2PlusSubscriptionAPITest is BaseTest {
changePrank(subOwner);
uint256 subId = s_subscriptionAPI.createSubscription();
assertEq(s_subscriptionAPI.getSubscriptionConfig(subId).consumers.length, 0);
+
+ // only subscription owner can add a consumer
+ address notSubOwner = makeAddr("notSubOwner");
+ changePrank(notSubOwner);
+ vm.expectRevert(abi.encodeWithSelector(SubscriptionAPI.MustBeSubOwner.selector, subOwner));
+ s_subscriptionAPI.addConsumer(subId, consumer);
+
+ // subscription owner is able to add a consumer
changePrank(subOwner);
vm.expectEmit(true, false, false, true);
emit SubscriptionConsumerAdded(subId, consumer);
diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol
index 68e36dfe4cb..a843f31911f 100644
--- a/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol
+++ b/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper.t.sol
@@ -24,9 +24,6 @@ contract VRFV2PlusWrapperTest is BaseTest {
VRFV2PlusWrapper s_wrapper;
VRFV2PlusWrapperConsumerExample s_consumer;
- VRFCoordinatorV2_5.FeeConfig basicFeeConfig =
- VRFCoordinatorV2_5.FeeConfig({fulfillmentFlatFeeLinkPPM: 0, fulfillmentFlatFeeNativePPM: 0});
-
function setUp() public override {
BaseTest.setUp();
@@ -46,20 +43,23 @@ contract VRFV2PlusWrapperTest is BaseTest {
// Configure the coordinator.
s_testCoordinator.setLINKAndLINKNativeFeed(address(s_linkToken), address(s_linkNativeFeed));
- setConfigCoordinator(basicFeeConfig);
+ setConfigCoordinator();
setConfigWrapper();
s_testCoordinator.s_config();
}
- function setConfigCoordinator(VRFCoordinatorV2_5.FeeConfig memory feeConfig) internal {
+ function setConfigCoordinator() internal {
s_testCoordinator.setConfig(
0, // minRequestConfirmations
2_500_000, // maxGasLimit
1, // stalenessSeconds
50_000, // gasAfterPaymentCalculation
50000000000000000, // fallbackWeiPerUnitLink
- feeConfig
+ 500_000, // fulfillmentFlatFeeNativePPM
+ 100_000, // fulfillmentFlatFeeLinkDiscountPPM
+ 15, // nativePremiumPercentage
+ 10 // linkPremiumPercentage
);
}
diff --git a/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper_Migration.t.sol b/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper_Migration.t.sol
index ae399cc95c7..3bf03f4b96d 100644
--- a/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper_Migration.t.sol
+++ b/contracts/test/v0.8/foundry/vrf/VRFV2Wrapper_Migration.t.sol
@@ -29,9 +29,6 @@ contract VRFV2PlusWrapperTest is BaseTest {
VRFCoordinatorV2Plus_V2Example s_newCoordinator;
- VRFCoordinatorV2_5.FeeConfig basicFeeConfig =
- VRFCoordinatorV2_5.FeeConfig({fulfillmentFlatFeeLinkPPM: 0, fulfillmentFlatFeeNativePPM: 0});
-
event CoordinatorRegistered(address coordinatorAddress);
event MigrationCompleted(address newCoordinator, uint256 subId);
event WrapperRequestMade(uint256 indexed requestId, uint256 paid);
@@ -55,7 +52,7 @@ contract VRFV2PlusWrapperTest is BaseTest {
// Configure the coordinator.
s_testCoordinator.setLINKAndLINKNativeFeed(address(s_linkToken), address(s_linkNativeFeed));
- setConfigCoordinator(basicFeeConfig);
+ setConfigCoordinator();
setConfigWrapper();
s_testCoordinator.s_config();
@@ -74,14 +71,17 @@ contract VRFV2PlusWrapperTest is BaseTest {
assertTrue(s_testCoordinator.isTargetRegisteredExternal(newCoordinatorAddr));
}
- function setConfigCoordinator(VRFCoordinatorV2_5.FeeConfig memory feeConfig) internal {
+ function setConfigCoordinator() internal {
s_testCoordinator.setConfig(
0, // minRequestConfirmations
2_500_000, // maxGasLimit
1, // stalenessSeconds
50_000, // gasAfterPaymentCalculation
50000000000000000, // fallbackWeiPerUnitLink
- feeConfig
+ 500_000, // fulfillmentFlatFeeNativePPM
+ 100_000, // fulfillmentFlatFeeLinkDiscountPPM
+ 15, // nativePremiumPercentage
+ 10 // linkPremiumPercentage
);
}
diff --git a/core/capabilities/registry.go b/core/capabilities/registry.go
new file mode 100644
index 00000000000..02c08ae8dc3
--- /dev/null
+++ b/core/capabilities/registry.go
@@ -0,0 +1,154 @@
+package capabilities
+
+import (
+ "context"
+ "fmt"
+ "sync"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+)
+
+// Registry is a struct for the registry of capabilities.
+// Registry is safe for concurrent use.
+type Registry struct {
+ m map[string]capabilities.BaseCapability
+ mu sync.RWMutex
+}
+
+// Get gets a capability from the registry.
+func (r *Registry) Get(_ context.Context, id string) (capabilities.BaseCapability, error) {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+
+ c, ok := r.m[id]
+ if !ok {
+ return nil, fmt.Errorf("capability not found with id %s", id)
+ }
+
+ return c, nil
+}
+
+// GetTrigger gets a capability from the registry and tries to coerce it to the TriggerCapability interface.
+func (r *Registry) GetTrigger(ctx context.Context, id string) (capabilities.TriggerCapability, error) {
+ c, err := r.Get(ctx, id)
+ if err != nil {
+ return nil, err
+ }
+
+ tc, ok := c.(capabilities.TriggerCapability)
+ if !ok {
+ return nil, fmt.Errorf("capability with id: %s does not satisfy the capability interface", id)
+ }
+
+ return tc, nil
+}
+
+// GetAction gets a capability from the registry and tries to coerce it to the ActionCapability interface.
+func (r *Registry) GetAction(ctx context.Context, id string) (capabilities.ActionCapability, error) {
+ c, err := r.Get(ctx, id)
+ if err != nil {
+ return nil, err
+ }
+
+ ac, ok := c.(capabilities.ActionCapability)
+ if !ok {
+ return nil, fmt.Errorf("capability with id: %s does not satisfy the capability interface", id)
+ }
+
+ return ac, nil
+}
+
+// GetConsensus gets a capability from the registry and tries to coerce it to the ConsensusCapability interface.
+func (r *Registry) GetConsensus(ctx context.Context, id string) (capabilities.ConsensusCapability, error) {
+ c, err := r.Get(ctx, id)
+ if err != nil {
+ return nil, err
+ }
+
+ cc, ok := c.(capabilities.ConsensusCapability)
+ if !ok {
+ return nil, fmt.Errorf("capability with id: %s does not satisfy the capability interface", id)
+ }
+
+ return cc, nil
+}
+
+// GetTarget gets a capability from the registry and tries to coerce it to the TargetCapability interface.
+func (r *Registry) GetTarget(ctx context.Context, id string) (capabilities.TargetCapability, error) {
+ c, err := r.Get(ctx, id)
+ if err != nil {
+ return nil, err
+ }
+
+ tc, ok := c.(capabilities.TargetCapability)
+ if !ok {
+ return nil, fmt.Errorf("capability with id: %s does not satisfy the capability interface", id)
+ }
+
+ return tc, nil
+}
+
+// List lists all the capabilities in the registry.
+func (r *Registry) List(_ context.Context) ([]capabilities.BaseCapability, error) {
+ r.mu.RLock()
+ defer r.mu.RUnlock()
+ cl := []capabilities.BaseCapability{}
+ for _, v := range r.m {
+ cl = append(cl, v)
+ }
+
+ return cl, nil
+}
+
+// Add adds a capability to the registry.
+func (r *Registry) Add(ctx context.Context, c capabilities.BaseCapability) error {
+ r.mu.Lock()
+ defer r.mu.Unlock()
+
+ info, err := c.Info(ctx)
+ if err != nil {
+ return err
+ }
+
+ switch info.CapabilityType {
+ case capabilities.CapabilityTypeTrigger:
+ _, ok := c.(capabilities.TriggerCapability)
+ if !ok {
+ return fmt.Errorf("trigger capability does not satisfy TriggerCapability interface")
+ }
+ case capabilities.CapabilityTypeAction:
+ _, ok := c.(capabilities.ActionCapability)
+ if !ok {
+ return fmt.Errorf("action does not satisfy ActionCapability interface")
+ }
+ case capabilities.CapabilityTypeConsensus:
+ _, ok := c.(capabilities.ConsensusCapability)
+ if !ok {
+ return fmt.Errorf("consensus capability does not satisfy ConsensusCapability interface")
+ }
+ case capabilities.CapabilityTypeTarget:
+ _, ok := c.(capabilities.TargetCapability)
+ if !ok {
+ return fmt.Errorf("target capability does not satisfy TargetCapability interface")
+ }
+ default:
+ return fmt.Errorf("unknown capability type: %s", info.CapabilityType)
+ }
+
+ id := info.ID
+ _, ok := r.m[id]
+ if ok {
+ return fmt.Errorf("capability with id: %s already exists", id)
+ }
+
+ r.m[id] = c
+ return nil
+
+}
+
+// NewRegistry returns a new Registry.
+func NewRegistry() *Registry {
+ return &Registry{
+ m: map[string]capabilities.BaseCapability{},
+ }
+}
diff --git a/core/capabilities/registry_test.go b/core/capabilities/registry_test.go
new file mode 100644
index 00000000000..8af91d133a2
--- /dev/null
+++ b/core/capabilities/registry_test.go
@@ -0,0 +1,185 @@
+package capabilities_test
+
+import (
+ "context"
+ "testing"
+
+ "github.com/google/uuid"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities/triggers"
+ coreCapabilities "github.com/smartcontractkit/chainlink/v2/core/capabilities"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+)
+
+type mockCapability struct {
+ capabilities.CapabilityInfo
+}
+
+func (m *mockCapability) Execute(ctx context.Context, callback chan<- capabilities.CapabilityResponse, req capabilities.CapabilityRequest) error {
+ return nil
+}
+
+func (m *mockCapability) RegisterToWorkflow(ctx context.Context, request capabilities.RegisterToWorkflowRequest) error {
+ return nil
+}
+
+func (m *mockCapability) UnregisterFromWorkflow(ctx context.Context, request capabilities.UnregisterFromWorkflowRequest) error {
+ return nil
+}
+
+func TestRegistry(t *testing.T) {
+ ctx := testutils.Context(t)
+
+ r := coreCapabilities.NewRegistry()
+
+ id := "capability-1"
+ ci, err := capabilities.NewCapabilityInfo(
+ id,
+ capabilities.CapabilityTypeAction,
+ "capability-1-description",
+ "v1.0.0",
+ )
+ require.NoError(t, err)
+
+ c := &mockCapability{CapabilityInfo: ci}
+ err = r.Add(ctx, c)
+ require.NoError(t, err)
+
+ gc, err := r.Get(ctx, id)
+ require.NoError(t, err)
+
+ assert.Equal(t, c, gc)
+
+ cs, err := r.List(ctx)
+ require.NoError(t, err)
+ assert.Len(t, cs, 1)
+ assert.Equal(t, c, cs[0])
+}
+
+func TestRegistry_NoDuplicateIDs(t *testing.T) {
+ ctx := testutils.Context(t)
+ r := coreCapabilities.NewRegistry()
+
+ id := "capability-1"
+ ci, err := capabilities.NewCapabilityInfo(
+ id,
+ capabilities.CapabilityTypeAction,
+ "capability-1-description",
+ "v1.0.0",
+ )
+ require.NoError(t, err)
+
+ c := &mockCapability{CapabilityInfo: ci}
+ err = r.Add(ctx, c)
+ require.NoError(t, err)
+
+ ci, err = capabilities.NewCapabilityInfo(
+ id,
+ capabilities.CapabilityTypeConsensus,
+ "capability-2-description",
+ "v1.0.0",
+ )
+ require.NoError(t, err)
+ c2 := &mockCapability{CapabilityInfo: ci}
+
+ err = r.Add(ctx, c2)
+ assert.ErrorContains(t, err, "capability with id: capability-1 already exists")
+}
+
+func TestRegistry_ChecksExecutionAPIByType(t *testing.T) {
+ tcs := []struct {
+ name string
+ newCapability func(ctx context.Context, reg *coreCapabilities.Registry) (string, error)
+ getCapability func(ctx context.Context, reg *coreCapabilities.Registry, id string) error
+ errContains string
+ }{
+ {
+ name: "action",
+ newCapability: func(ctx context.Context, reg *coreCapabilities.Registry) (string, error) {
+ id := uuid.New().String()
+ ci, err := capabilities.NewCapabilityInfo(
+ id,
+ capabilities.CapabilityTypeAction,
+ "capability-1-description",
+ "v1.0.0",
+ )
+ require.NoError(t, err)
+
+ c := &mockCapability{CapabilityInfo: ci}
+ return id, reg.Add(ctx, c)
+ },
+ getCapability: func(ctx context.Context, reg *coreCapabilities.Registry, id string) error {
+ _, err := reg.GetAction(ctx, id)
+ return err
+ },
+ },
+ {
+ name: "target",
+ newCapability: func(ctx context.Context, reg *coreCapabilities.Registry) (string, error) {
+ id := uuid.New().String()
+ ci, err := capabilities.NewCapabilityInfo(
+ id,
+ capabilities.CapabilityTypeTarget,
+ "capability-1-description",
+ "v1.0.0",
+ )
+ require.NoError(t, err)
+
+ c := &mockCapability{CapabilityInfo: ci}
+ return id, reg.Add(ctx, c)
+ },
+ getCapability: func(ctx context.Context, reg *coreCapabilities.Registry, id string) error {
+ _, err := reg.GetTarget(ctx, id)
+ return err
+ },
+ },
+ {
+ name: "trigger",
+ newCapability: func(ctx context.Context, reg *coreCapabilities.Registry) (string, error) {
+ odt := triggers.NewOnDemand()
+ info, err := odt.Info(ctx)
+ require.NoError(t, err)
+ return info.ID, reg.Add(ctx, odt)
+ },
+ getCapability: func(ctx context.Context, reg *coreCapabilities.Registry, id string) error {
+ _, err := reg.GetTrigger(ctx, id)
+ return err
+ },
+ },
+ {
+ name: "consensus",
+ newCapability: func(ctx context.Context, reg *coreCapabilities.Registry) (string, error) {
+ id := uuid.New().String()
+ ci, err := capabilities.NewCapabilityInfo(
+ id,
+ capabilities.CapabilityTypeConsensus,
+ "capability-1-description",
+ "v1.0.0",
+ )
+ require.NoError(t, err)
+
+ c := &mockCapability{CapabilityInfo: ci}
+ return id, reg.Add(ctx, c)
+ },
+ getCapability: func(ctx context.Context, reg *coreCapabilities.Registry, id string) error {
+ _, err := reg.GetConsensus(ctx, id)
+ return err
+ },
+ },
+ }
+
+ ctx := testutils.Context(t)
+ reg := coreCapabilities.NewRegistry()
+ for _, tc := range tcs {
+ t.Run(tc.name, func(t *testing.T) {
+ id, err := tc.newCapability(ctx, reg)
+ require.NoError(t, err)
+
+ err = tc.getCapability(ctx, reg, id)
+ require.NoError(t, err)
+ })
+ }
+}
diff --git a/core/chainlink.devspace.Dockerfile b/core/chainlink.devspace.Dockerfile
index c639190a80f..28504b40d7a 100644
--- a/core/chainlink.devspace.Dockerfile
+++ b/core/chainlink.devspace.Dockerfile
@@ -1,5 +1,5 @@
# Build image: Chainlink binary
-FROM golang:1.21-bullseye as buildgo
+FROM golang:1.21-bullseye AS buildgo
RUN go version
WORKDIR /chainlink
@@ -22,7 +22,7 @@ RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-feeds | xargs
RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-solana | xargs -I % ln -s % /chainlink-solana
# Build image: Plugins
-FROM golang:1.21-bullseye as buildplugins
+FROM golang:1.21-bullseye AS buildplugins
RUN go version
WORKDIR /chainlink-feeds
@@ -34,7 +34,7 @@ COPY --from=buildgo /chainlink-solana .
RUN go install ./pkg/solana/cmd/chainlink-solana
# Final image: ubuntu with chainlink binary
-FROM golang:1.21-bullseye
+FROM --platform=linux/amd64 golang:1.21-bullseye
ARG CHAINLINK_USER=chainlink
ENV DEBIAN_FRONTEND noninteractive
diff --git a/core/chains/evm/assets/wei_test.go b/core/chains/evm/assets/wei_test.go
index 2f083c266b9..e1181a7a5ec 100644
--- a/core/chains/evm/assets/wei_test.go
+++ b/core/chains/evm/assets/wei_test.go
@@ -1,6 +1,8 @@
package assets
import (
+ "strconv"
+ "strings"
"testing"
"github.com/stretchr/testify/assert"
@@ -72,7 +74,10 @@ func FuzzWei(f *testing.F) {
f.Add("5 micro")
f.Fuzz(func(t *testing.T, v string) {
if len(v) > 1_000 {
- t.Skip()
+ t.Skipf("too many characters: %d", len(v))
+ }
+ if e := tryParseExp(v); -1000 > e || e > 1000 {
+ t.Skipf("exponent too large: %d", e)
}
var w Wei
err := w.UnmarshalText([]byte(v))
@@ -89,3 +94,36 @@ func FuzzWei(f *testing.F) {
require.Equal(t, w, w2, "unequal values after marshal/unmarshal")
})
}
+
+func tryParseExp(v string) int64 {
+ i := strings.IndexAny(v, "Ee")
+ if i == -1 {
+ return -1
+ }
+ v = v[i+1:]
+ if i := strings.IndexFunc(v, func(r rune) bool {
+ switch {
+ case r == '-' || r == '+':
+ return false
+ case r < '0' || '9' < r:
+ return true
+ }
+ return false
+ }); i > -1 {
+ v = v[:i]
+ }
+ e, err := strconv.ParseInt(v, 10, 32)
+ if err != nil {
+ return -1
+ }
+ return e
+}
+
+func Test_tryParseExp(t *testing.T) {
+ got := tryParseExp("000000000E0000000060000000wei")
+ assert.Equal(t, int64(60000000), got)
+ got = tryParseExp("0e-80000800")
+ assert.Equal(t, int64(-80000800), got)
+ got = tryParseExp("0e+802444440")
+ assert.Equal(t, int64(802444440), got)
+}
diff --git a/core/chains/evm/client/chain_client.go b/core/chains/evm/client/chain_client.go
index 5dd70992382..b16054b69a8 100644
--- a/core/chains/evm/client/chain_client.go
+++ b/core/chains/evm/client/chain_client.go
@@ -73,7 +73,10 @@ func NewChainClient(
chainID,
chainType,
"EVM",
- ClassifySendOnlyError,
+ func(tx *types.Transaction, err error) commonclient.SendTxReturnCode {
+ return ClassifySendError(err, logger.Sugared(logger.Nop()), tx, common.Address{}, chainType.IsL2())
+ },
+ 0, // use the default value provided by the implementation
)
return &chainClient{
multiNode: multiNode,
@@ -127,6 +130,10 @@ func (c *chainClient) CallContract(ctx context.Context, msg ethereum.CallMsg, bl
return c.multiNode.CallContract(ctx, msg, blockNumber)
}
+func (c *chainClient) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+ return c.multiNode.PendingCallContract(ctx, msg)
+}
+
// TODO-1663: change this to actual ChainID() call once client.go is deprecated.
func (c *chainClient) ChainID() (*big.Int, error) {
//return c.multiNode.ChainID(ctx), nil
diff --git a/core/chains/evm/client/client.go b/core/chains/evm/client/client.go
index 61635c59c6b..e2ae8c26403 100644
--- a/core/chains/evm/client/client.go
+++ b/core/chains/evm/client/client.go
@@ -91,6 +91,7 @@ type Client interface {
HeaderByHash(ctx context.Context, h common.Hash) (*types.Header, error)
CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error)
+ PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error)
IsL2() bool
}
@@ -260,6 +261,10 @@ func (client *client) CallContract(ctx context.Context, msg ethereum.CallMsg, bl
return client.pool.CallContract(ctx, msg, blockNumber)
}
+func (client *client) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+ return client.pool.PendingCallContract(ctx, msg)
+}
+
func (client *client) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) {
return client.pool.CodeAt(ctx, account, blockNumber)
}
diff --git a/core/chains/evm/client/erroring_node.go b/core/chains/evm/client/erroring_node.go
index c33891728a7..059f76d608a 100644
--- a/core/chains/evm/client/erroring_node.go
+++ b/core/chains/evm/client/erroring_node.go
@@ -103,6 +103,10 @@ func (e *erroringNode) CallContract(ctx context.Context, msg ethereum.CallMsg, b
return nil, errors.New(e.errMsg)
}
+func (e *erroringNode) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+ return nil, errors.New(e.errMsg)
+}
+
func (e *erroringNode) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) {
return nil, errors.New(e.errMsg)
}
diff --git a/core/chains/evm/client/errors.go b/core/chains/evm/client/errors.go
index bb748cb52fb..67197b764a0 100644
--- a/core/chains/evm/client/errors.go
+++ b/core/chains/evm/client/errors.go
@@ -11,6 +11,7 @@ import (
"github.com/pkg/errors"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
+
commonclient "github.com/smartcontractkit/chainlink/v2/common/client"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/label"
)
@@ -311,6 +312,17 @@ func (s *SendError) IsTimeout() bool {
return errors.Is(s.err, context.DeadlineExceeded)
}
+// IsCanceled indicates if the error was caused by an context cancellation
+func (s *SendError) IsCanceled() bool {
+ if s == nil {
+ return false
+ }
+ if s.err == nil {
+ return false
+ }
+ return errors.Is(s.err, context.Canceled)
+}
+
func NewFatalSendError(e error) *SendError {
if e == nil {
return nil
@@ -475,6 +487,10 @@ func ClassifySendError(err error, lggr logger.SugaredLogger, tx *types.Transacti
lggr.Errorw("timeout while sending transaction %x", tx.Hash(), "err", sendError, "etx", tx)
return commonclient.Retryable
}
+ if sendError.IsCanceled() {
+ lggr.Errorw("context was canceled while sending transaction %x", tx.Hash(), "err", sendError, "etx", tx)
+ return commonclient.Retryable
+ }
if sendError.IsTxFeeExceedsCap() {
lggr.Criticalw(fmt.Sprintf("Sending transaction failed: %s", label.RPCTxFeeCapConfiguredIncorrectlyWarning),
"etx", tx,
@@ -486,15 +502,3 @@ func ClassifySendError(err error, lggr logger.SugaredLogger, tx *types.Transacti
lggr.Errorw("Unknown error encountered when sending transaction", "err", err, "etx", tx)
return commonclient.Unknown
}
-
-// ClassifySendOnlyError handles SendOnly nodes error codes. In that case, we don't assume there is another transaction that will be correctly
-// priced.
-func ClassifySendOnlyError(err error) commonclient.SendTxReturnCode {
- sendError := NewSendError(err)
- if sendError == nil || sendError.IsNonceTooLowError() || sendError.IsTransactionAlreadyMined() || sendError.IsTransactionAlreadyInMempool() {
- // Nonce too low or transaction known errors are expected since
- // the primary SendTransaction may well have succeeded already
- return commonclient.Successful
- }
- return commonclient.Fatal
-}
diff --git a/core/chains/evm/client/mocks/client.go b/core/chains/evm/client/mocks/client.go
index 0b45894cf28..bbaaafd7615 100644
--- a/core/chains/evm/client/mocks/client.go
+++ b/core/chains/evm/client/mocks/client.go
@@ -585,6 +585,36 @@ func (_m *Client) NodeStates() map[string]string {
return r0
}
+// PendingCallContract provides a mock function with given fields: ctx, msg
+func (_m *Client) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+ ret := _m.Called(ctx, msg)
+
+ if len(ret) == 0 {
+ panic("no return value specified for PendingCallContract")
+ }
+
+ var r0 []byte
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) ([]byte, error)); ok {
+ return rf(ctx, msg)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) []byte); ok {
+ r0 = rf(ctx, msg)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).([]byte)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg) error); ok {
+ r1 = rf(ctx, msg)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
// PendingCodeAt provides a mock function with given fields: ctx, account
func (_m *Client) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) {
ret := _m.Called(ctx, account)
diff --git a/core/chains/evm/client/node.go b/core/chains/evm/client/node.go
index a27321535ed..aa472d605a6 100644
--- a/core/chains/evm/client/node.go
+++ b/core/chains/evm/client/node.go
@@ -117,6 +117,7 @@ type Node interface {
EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error)
SuggestGasPrice(ctx context.Context) (*big.Int, error)
CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error)
+ PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error)
CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error)
HeaderByNumber(context.Context, *big.Int) (*types.Header, error)
HeaderByHash(context.Context, common.Hash) (*types.Header, error)
@@ -830,6 +831,33 @@ func (n *node) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumb
}
+func (n *node) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) (val []byte, err error) {
+ ctx, cancel, ws, http, err := n.makeLiveQueryCtxAndSafeGetClients(ctx)
+ if err != nil {
+ return nil, err
+ }
+ defer cancel()
+ lggr := n.newRqLggr().With("callMsg", msg)
+
+ lggr.Debug("RPC call: evmclient.Client#PendingCallContract")
+ start := time.Now()
+ if http != nil {
+ val, err = http.geth.PendingCallContract(ctx, msg)
+ err = n.wrapHTTP(err)
+ } else {
+ val, err = ws.geth.PendingCallContract(ctx, msg)
+ err = n.wrapWS(err)
+ }
+ duration := time.Since(start)
+
+ n.logResult(lggr, err, duration, n.getRPCDomain(), "PendingCallContract",
+ "val", val,
+ )
+
+ return
+
+}
+
func (n *node) BlockByNumber(ctx context.Context, number *big.Int) (b *types.Block, err error) {
ctx, cancel, ws, http, err := n.makeLiveQueryCtxAndSafeGetClients(ctx)
if err != nil {
diff --git a/core/chains/evm/client/null_client.go b/core/chains/evm/client/null_client.go
index e3bb1defd0d..3cbae9e9dde 100644
--- a/core/chains/evm/client/null_client.go
+++ b/core/chains/evm/client/null_client.go
@@ -196,6 +196,11 @@ func (nc *NullClient) CallContract(ctx context.Context, msg ethereum.CallMsg, bl
return nil, nil
}
+func (nc *NullClient) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+ nc.lggr.Debug("PendingCallContract")
+ return nil, nil
+}
+
func (nc *NullClient) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) {
nc.lggr.Debug("CodeAt")
return nil, nil
diff --git a/core/chains/evm/client/pool.go b/core/chains/evm/client/pool.go
index b2d5a4847a5..3c33b3dbd0a 100644
--- a/core/chains/evm/client/pool.go
+++ b/core/chains/evm/client/pool.go
@@ -477,6 +477,10 @@ func (p *Pool) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumb
return p.selectNode().CallContract(ctx, msg, blockNumber)
}
+func (p *Pool) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+ return p.selectNode().PendingCallContract(ctx, msg)
+}
+
func (p *Pool) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) {
return p.selectNode().CodeAt(ctx, account, blockNumber)
}
diff --git a/core/chains/evm/client/rpc_client.go b/core/chains/evm/client/rpc_client.go
index ce3a67162ed..54656cf1d3e 100644
--- a/core/chains/evm/client/rpc_client.go
+++ b/core/chains/evm/client/rpc_client.go
@@ -792,6 +792,34 @@ func (r *rpcClient) CallContract(ctx context.Context, msg interface{}, blockNumb
}
+func (r *rpcClient) PendingCallContract(ctx context.Context, msg interface{}) (val []byte, err error) {
+ ctx, cancel, ws, http, err := r.makeLiveQueryCtxAndSafeGetClients(ctx)
+ if err != nil {
+ return nil, err
+ }
+ defer cancel()
+ lggr := r.newRqLggr().With("callMsg", msg)
+ message := msg.(ethereum.CallMsg)
+
+ lggr.Debug("RPC call: evmclient.Client#PendingCallContract")
+ start := time.Now()
+ if http != nil {
+ val, err = http.geth.PendingCallContract(ctx, message)
+ err = r.wrapHTTP(err)
+ } else {
+ val, err = ws.geth.PendingCallContract(ctx, message)
+ err = r.wrapWS(err)
+ }
+ duration := time.Since(start)
+
+ r.logResult(lggr, err, duration, r.getRPCDomain(), "PendingCallContract",
+ "val", val,
+ )
+
+ return
+
+}
+
func (r *rpcClient) LatestBlockHeight(ctx context.Context) (*big.Int, error) {
var height big.Int
h, err := r.BlockNumber(ctx)
diff --git a/core/chains/evm/client/simulated_backend_client.go b/core/chains/evm/client/simulated_backend_client.go
index bd2e959d9bc..c49637e7890 100644
--- a/core/chains/evm/client/simulated_backend_client.go
+++ b/core/chains/evm/client/simulated_backend_client.go
@@ -102,6 +102,8 @@ func (c *SimulatedBackendClient) CallContext(ctx context.Context, result interfa
return c.ethCall(ctx, result, args...)
case "eth_getHeaderByNumber":
return c.ethGetHeaderByNumber(ctx, result, args...)
+ case "eth_estimateGas":
+ return c.ethEstimateGas(ctx, result, args...)
default:
return fmt.Errorf("second arg to SimulatedBackendClient.Call is an RPC API method which has not yet been implemented: %s. Add processing for it here", method)
}
@@ -401,6 +403,25 @@ func (c *SimulatedBackendClient) CallContract(ctx context.Context, msg ethereum.
return res, nil
}
+func (c *SimulatedBackendClient) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+ // Expected error is
+ // type JsonError struct {
+ // Code int `json:"code"`
+ // Message string `json:"message"`
+ // Data interface{} `json:"data,omitempty"`
+ //}
+ res, err := c.b.PendingCallContract(ctx, msg)
+ if err != nil {
+ dataErr := revertError{}
+ if errors.Is(err, &dataErr) {
+ return nil, &JsonError{Data: dataErr.ErrorData(), Message: dataErr.Error(), Code: 3}
+ }
+ // Generic revert, no data
+ return nil, &JsonError{Data: []byte{}, Message: err.Error(), Code: 3}
+ }
+ return res, nil
+}
+
// CodeAt gets the code associated with an account as of a specified block.
func (c *SimulatedBackendClient) CodeAt(ctx context.Context, account common.Address, blockNumber *big.Int) ([]byte, error) {
return c.b.CodeAt(ctx, account, blockNumber)
@@ -443,6 +464,8 @@ func (c *SimulatedBackendClient) BatchCallContext(ctx context.Context, b []rpc.B
b[i].Error = c.ethCall(ctx, b[i].Result, b[i].Args...)
case "eth_getHeaderByNumber":
b[i].Error = c.ethGetHeaderByNumber(ctx, b[i].Result, b[i].Args...)
+ case "eth_estimateGas":
+ b[i].Error = c.ethEstimateGas(ctx, b[i].Result, b[i].Args...)
default:
return fmt.Errorf("SimulatedBackendClient got unsupported method %s", elem.Method)
}
@@ -562,6 +585,37 @@ func (c *SimulatedBackendClient) ethGetBlockByNumber(ctx context.Context, result
return nil
}
+func (c *SimulatedBackendClient) ethEstimateGas(ctx context.Context, result interface{}, args ...interface{}) error {
+ if len(args) != 2 {
+ return fmt.Errorf("SimulatedBackendClient expected 2 args, got %d for eth_estimateGas", len(args))
+ }
+
+ params, ok := args[0].(map[string]interface{})
+ if !ok {
+ return fmt.Errorf("SimulatedBackendClient expected first arg to be map[string]interface{} for eth_call, got: %T", args[0])
+ }
+
+ _, err := c.blockNumber(args[1])
+ if err != nil {
+ return fmt.Errorf("SimulatedBackendClient expected second arg to be the string 'latest' or a *big.Int for eth_call, got: %T", args[1])
+ }
+
+ resp, err := c.b.EstimateGas(ctx, toCallMsg(params))
+ if err != nil {
+ return err
+ }
+
+ switch typedResult := result.(type) {
+ case *uint64:
+ *typedResult = resp
+ case *hexutil.Uint64:
+ *typedResult = hexutil.Uint64(resp)
+ default:
+ return fmt.Errorf("SimulatedBackendClient unexpected type %T", result)
+ }
+
+ return nil
+}
func (c *SimulatedBackendClient) ethCall(ctx context.Context, result interface{}, args ...interface{}) error {
if len(args) != 2 {
@@ -625,7 +679,6 @@ func (c *SimulatedBackendClient) ethGetHeaderByNumber(ctx context.Context, resul
func toCallMsg(params map[string]interface{}) ethereum.CallMsg {
var callMsg ethereum.CallMsg
-
toAddr, err := interfaceToAddress(params["to"])
if err != nil {
panic(fmt.Errorf("unexpected 'to' parameter: %s", err))
@@ -645,6 +698,10 @@ func toCallMsg(params map[string]interface{}) ethereum.CallMsg {
callMsg.From = common.HexToAddress("0x")
}
+ if params["data"] != nil && params["input"] != nil {
+ panic("cannot have both 'data' and 'input' parameters")
+ }
+
switch data := params["data"].(type) {
case nil:
// This parameter is not required so nil is acceptable
@@ -656,16 +713,41 @@ func toCallMsg(params map[string]interface{}) ethereum.CallMsg {
panic("unexpected type of 'data' parameter; try hexutil.Bytes, []byte, or nil")
}
+ switch input := params["input"].(type) {
+ case nil:
+ // This parameter is not required so nil is acceptable
+ case hexutil.Bytes:
+ callMsg.Data = input
+ case []byte:
+ callMsg.Data = input
+ default:
+ panic("unexpected type of 'input' parameter; try hexutil.Bytes, []byte, or nil")
+ }
+
if value, ok := params["value"].(*big.Int); ok {
callMsg.Value = value
}
- if gas, ok := params["gas"].(uint64); ok {
+ switch gas := params["gas"].(type) {
+ case nil:
+ // This parameter is not required so nil is acceptable
+ case uint64:
callMsg.Gas = gas
+ case hexutil.Uint64:
+ callMsg.Gas = uint64(gas)
+ default:
+ panic("unexpected type of 'gas' parameter; try hexutil.Uint64, or uint64")
}
- if gasPrice, ok := params["gasPrice"].(*big.Int); ok {
+ switch gasPrice := params["gasPrice"].(type) {
+ case nil:
+ // This parameter is not required so nil is acceptable
+ case *big.Int:
callMsg.GasPrice = gasPrice
+ case *hexutil.Big:
+ callMsg.GasPrice = gasPrice.ToInt()
+ default:
+ panic("unexpected type of 'gasPrice' parameter; try *big.Int, or *hexutil.Big")
}
return callMsg
@@ -675,6 +757,11 @@ func interfaceToAddress(value interface{}) (common.Address, error) {
switch v := value.(type) {
case common.Address:
return v, nil
+ case *common.Address:
+ if v == nil {
+ return common.Address{}, nil
+ }
+ return *v, nil
case string:
if ok := common.IsHexAddress(v); !ok {
return common.Address{}, fmt.Errorf("string not formatted as a hex encoded evm address")
@@ -688,6 +775,6 @@ func interfaceToAddress(value interface{}) (common.Address, error) {
return common.BigToAddress(v), nil
default:
- return common.Address{}, fmt.Errorf("unrecognized value type for converting value to common.Address; use hex encoded string, *big.Int, or common.Address")
+ return common.Address{}, fmt.Errorf("unrecognized value type: %T for converting value to common.Address; use hex encoded string, *big.Int, or common.Address", v)
}
}
diff --git a/core/chains/evm/config/chain_scoped_ocr2_test.go b/core/chains/evm/config/chain_scoped_ocr2_test.go
index 21863ae65ca..03bf5fd4f14 100644
--- a/core/chains/evm/config/chain_scoped_ocr2_test.go
+++ b/core/chains/evm/config/chain_scoped_ocr2_test.go
@@ -10,5 +10,5 @@ import (
func Test_ocr2Config(t *testing.T) {
evmOcrCfg := cltest.NewTestChainScopedConfig(t) //fallback.toml values
- require.Equal(t, uint32(5300000), evmOcrCfg.EVM().OCR2().Automation().GasLimit())
+ require.Equal(t, uint32(5400000), evmOcrCfg.EVM().OCR2().Automation().GasLimit())
}
diff --git a/core/chains/evm/config/toml/defaults/Base_Sepolia.toml b/core/chains/evm/config/toml/defaults/Base_Sepolia.toml
new file mode 100644
index 00000000000..6458dda87f7
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/Base_Sepolia.toml
@@ -0,0 +1,29 @@
+ChainID = '84532'
+ChainType = 'optimismBedrock'
+FinalityDepth = 200
+LogPollInterval = '2s'
+NoNewHeadsThreshold = '40s'
+MinIncomingConfirmations = 1
+
+[GasEstimator]
+EIP1559DynamicFees = true
+PriceMin = '1 wei'
+BumpMin = '100 wei'
+
+[GasEstimator.BlockHistory]
+BlockHistorySize = 60
+
+[Transactions]
+ResendAfterThreshold = '30s'
+
+[HeadTracker]
+HistoryDepth = 300
+
+[NodePool]
+SyncThreshold = 10
+
+[OCR]
+ContractConfirmations = 1
+
+[OCR2.Automation]
+GasLimit = 6500000
diff --git a/core/chains/evm/config/toml/defaults/Polygon_Mainnet.toml b/core/chains/evm/config/toml/defaults/Polygon_Mainnet.toml
index 3602de6d037..c4246bb82be 100644
--- a/core/chains/evm/config/toml/defaults/Polygon_Mainnet.toml
+++ b/core/chains/evm/config/toml/defaults/Polygon_Mainnet.toml
@@ -8,6 +8,7 @@ MinIncomingConfirmations = 5
NoNewHeadsThreshold = '30s'
# Must be set to something large here because Polygon has so many re-orgs that otherwise we are constantly refetching
RPCBlockQueryDelay = 10
+RPCDefaultBatchSize = 100
[Transactions]
# Matic nodes under high mempool pressure are liable to drop txes, we need to ensure we keep sending them
diff --git a/core/chains/evm/config/toml/defaults/Polygon_Mumbai.toml b/core/chains/evm/config/toml/defaults/Polygon_Mumbai.toml
index 8cd42ccd034..e3dd2f6c689 100644
--- a/core/chains/evm/config/toml/defaults/Polygon_Mumbai.toml
+++ b/core/chains/evm/config/toml/defaults/Polygon_Mumbai.toml
@@ -5,6 +5,7 @@ LogPollInterval = '1s'
MinIncomingConfirmations = 5
NoNewHeadsThreshold = '30s'
RPCBlockQueryDelay = 10
+RPCDefaultBatchSize = 100
[Transactions]
ResendAfterThreshold = '1m'
diff --git a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Goerli.toml b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Goerli.toml
index f42391964bd..58451679558 100644
--- a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Goerli.toml
+++ b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Goerli.toml
@@ -3,6 +3,7 @@ FinalityDepth = 1
NoNewHeadsThreshold = '12m'
MinIncomingConfirmations = 1
LogPollInterval = '30s'
+RPCDefaultBatchSize = 100
[OCR]
ContractConfirmations = 1
@@ -19,4 +20,4 @@ BumpMin = '20 mwei'
BlockHistorySize = 12
[HeadTracker]
-HistoryDepth = 50
\ No newline at end of file
+HistoryDepth = 50
diff --git a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Mainnet.toml b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Mainnet.toml
index 248a521f94b..6be91b0e2cc 100644
--- a/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Mainnet.toml
+++ b/core/chains/evm/config/toml/defaults/Polygon_Zkevm_Mainnet.toml
@@ -4,6 +4,7 @@ NoNewHeadsThreshold = '6m'
MinIncomingConfirmations = 1
LogPollInterval = '30s'
RPCBlockQueryDelay = 15
+RPCDefaultBatchSize = 100
[OCR]
ContractConfirmations = 1
@@ -20,4 +21,4 @@ BumpMin = '100 mwei'
BlockHistorySize = 12
[HeadTracker]
-HistoryDepth = 50
\ No newline at end of file
+HistoryDepth = 50
diff --git a/core/chains/evm/config/toml/defaults/fallback.toml b/core/chains/evm/config/toml/defaults/fallback.toml
index b19423fd13a..94fb83849bf 100644
--- a/core/chains/evm/config/toml/defaults/fallback.toml
+++ b/core/chains/evm/config/toml/defaults/fallback.toml
@@ -69,4 +69,4 @@ DeltaCJitterOverride = '1h'
ObservationGracePeriod = '1s'
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
diff --git a/core/chains/evm/gas/block_history_estimator.go b/core/chains/evm/gas/block_history_estimator.go
index dc95240fd42..5ac8ca5faf8 100644
--- a/core/chains/evm/gas/block_history_estimator.go
+++ b/core/chains/evm/gas/block_history_estimator.go
@@ -340,11 +340,10 @@ func (b *BlockHistoryEstimator) checkConnectivity(attempts []EvmPriorAttempt) er
// reverse order since we want to go highest -> lowest block number and bail out early
for i := l - 1; i >= 0; i-- {
block := blockHistory[i]
- if block.Number >= broadcastBeforeBlockNum {
- blocks = append(blocks, block)
- } else {
+ if block.Number < broadcastBeforeBlockNum {
break
}
+ blocks = append(blocks, block)
}
var eip1559 bool
switch attempt.TxType {
@@ -364,27 +363,26 @@ func (b *BlockHistoryEstimator) checkConnectivity(attempts []EvmPriorAttempt) er
b.logger.AssumptionViolationw("unexpected error while verifying transaction inclusion", "err", err, "txHash", attempt.TxHash.String())
return nil
}
- if eip1559 {
- sufficientFeeCap := true
- for _, b := range blocks {
- // feecap must >= tipcap+basefee for the block, otherwise there
- // is no way this could have been included, and we must bail
- // out of the check
- attemptFeeCap := attempt.DynamicFee.FeeCap
- attemptTipCap := attempt.DynamicFee.TipCap
- if attemptFeeCap.Cmp(attemptTipCap.Add(b.BaseFeePerGas)) < 0 {
- sufficientFeeCap = false
- break
- }
- }
- if sufficientFeeCap && attempt.DynamicFee.TipCap.Cmp(tipCap) > 0 {
- return errors.Wrapf(commonfee.ErrConnectivity, "transaction %s has tip cap of %s, which is above percentile=%d%% (percentile tip cap: %s) for blocks %d thru %d (checking %d blocks)", attempt.TxHash, attempt.DynamicFee.TipCap, percentile, tipCap, blockHistory[l-1].Number, blockHistory[0].Number, expectInclusionWithinBlocks)
- }
- } else {
+ if !eip1559 {
if attempt.GasPrice.Cmp(gasPrice) > 0 {
return errors.Wrapf(commonfee.ErrConnectivity, "transaction %s has gas price of %s, which is above percentile=%d%% (percentile price: %s) for blocks %d thru %d (checking %d blocks)", attempt.TxHash, attempt.GasPrice, percentile, gasPrice, blockHistory[l-1].Number, blockHistory[0].Number, expectInclusionWithinBlocks)
-
}
+ continue
+ }
+ sufficientFeeCap := true
+ for _, b := range blocks {
+ // feecap must >= tipcap+basefee for the block, otherwise there
+ // is no way this could have been included, and we must bail
+ // out of the check
+ attemptFeeCap := attempt.DynamicFee.FeeCap
+ attemptTipCap := attempt.DynamicFee.TipCap
+ if attemptFeeCap.Cmp(attemptTipCap.Add(b.BaseFeePerGas)) < 0 {
+ sufficientFeeCap = false
+ break
+ }
+ }
+ if sufficientFeeCap && attempt.DynamicFee.TipCap.Cmp(tipCap) > 0 {
+ return errors.Wrapf(commonfee.ErrConnectivity, "transaction %s has tip cap of %s, which is above percentile=%d%% (percentile tip cap: %s) for blocks %d thru %d (checking %d blocks)", attempt.TxHash, attempt.DynamicFee.TipCap, percentile, tipCap, blockHistory[l-1].Number, blockHistory[0].Number, expectInclusionWithinBlocks)
}
}
return nil
@@ -560,20 +558,20 @@ func (b *BlockHistoryEstimator) Recalculate(head *evmtypes.Head) {
b.setPercentileGasPrice(percentileGasPrice)
promBlockHistoryEstimatorSetGasPrice.WithLabelValues(fmt.Sprintf("%v%%", percentile), b.chainID.String()).Set(float64(percentileGasPrice.Int64()))
- if eip1559 {
- float = new(big.Float).SetInt(percentileTipCap.ToInt())
- gwei, _ = big.NewFloat(0).Quo(float, big.NewFloat(1000000000)).Float64()
- tipCapGwei := fmt.Sprintf("%.2f", gwei)
- lggrFields = append(lggrFields, []interface{}{
- "tipCapWei", percentileTipCap,
- "tipCapGwei", tipCapGwei,
- }...)
- lggr.Debugw(fmt.Sprintf("Setting new default prices, GasPrice: %v Gwei, TipCap: %v Gwei", gasPriceGwei, tipCapGwei), lggrFields...)
- b.setPercentileTipCap(percentileTipCap)
- promBlockHistoryEstimatorSetTipCap.WithLabelValues(fmt.Sprintf("%v%%", percentile), b.chainID.String()).Set(float64(percentileTipCap.Int64()))
- } else {
+ if !eip1559 {
lggr.Debugw(fmt.Sprintf("Setting new default gas price: %v Gwei", gasPriceGwei), lggrFields...)
+ return
}
+ float = new(big.Float).SetInt(percentileTipCap.ToInt())
+ gwei, _ = big.NewFloat(0).Quo(float, big.NewFloat(1000000000)).Float64()
+ tipCapGwei := fmt.Sprintf("%.2f", gwei)
+ lggrFields = append(lggrFields, []interface{}{
+ "tipCapWei", percentileTipCap,
+ "tipCapGwei", tipCapGwei,
+ }...)
+ lggr.Debugw(fmt.Sprintf("Setting new default prices, GasPrice: %v Gwei, TipCap: %v Gwei", gasPriceGwei, tipCapGwei), lggrFields...)
+ b.setPercentileTipCap(percentileTipCap)
+ promBlockHistoryEstimatorSetTipCap.WithLabelValues(fmt.Sprintf("%v%%", percentile), b.chainID.String()).Set(float64(percentileTipCap.Int64()))
}
// FetchBlocks fetches block history leading up to the given head.
@@ -774,21 +772,20 @@ func (b *BlockHistoryEstimator) getPricesFromBlocks(blocks []evmtypes.Block, eip
for _, tx := range block.Transactions {
if b.IsUsable(tx, block, b.config.ChainType(), b.eConfig.PriceMin(), b.logger) {
gp := b.EffectiveGasPrice(block, tx)
- if gp != nil {
- gasPrices = append(gasPrices, gp)
- } else {
+ if gp == nil {
b.logger.Warnw("Unable to get gas price for tx", "tx", tx, "block", block)
continue
}
- if eip1559 {
- tc := b.EffectiveTipCap(block, tx)
- if tc != nil {
- tipCaps = append(tipCaps, tc)
- } else {
- b.logger.Warnw("Unable to get tip cap for tx", "tx", tx, "block", block)
- continue
- }
+ gasPrices = append(gasPrices, gp)
+ if !eip1559 {
+ continue
+ }
+ tc := b.EffectiveTipCap(block, tx)
+ if tc == nil {
+ b.logger.Warnw("Unable to get tip cap for tx", "tx", tx, "block", block)
+ continue
}
+ tipCaps = append(tipCaps, tc)
}
}
}
diff --git a/core/chains/evm/logpoller/orm.go b/core/chains/evm/logpoller/orm.go
index 663c56d10ed..1db8271ccb6 100644
--- a/core/chains/evm/logpoller/orm.go
+++ b/core/chains/evm/logpoller/orm.go
@@ -12,6 +12,7 @@ import (
"github.com/pkg/errors"
"github.com/smartcontractkit/chainlink-common/pkg/logger"
+
ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
"github.com/smartcontractkit/chainlink/v2/core/services/pg"
)
@@ -196,8 +197,6 @@ func (o *DbORM) DeleteBlocksBefore(end int64, qopts ...pg.QOpt) error {
}
func (o *DbORM) DeleteLogsAndBlocksAfter(start int64, qopts ...pg.QOpt) error {
- // These deletes are bounded by reorg depth, so they are
- // fast and should not slow down the log readers.
return o.q.WithOpts(qopts...).Transaction(func(tx pg.Queryer) error {
args, err := newQueryArgs(o.chainID).
withStartBlock(start).
@@ -207,13 +206,24 @@ func (o *DbORM) DeleteLogsAndBlocksAfter(start int64, qopts ...pg.QOpt) error {
return err
}
- _, err = tx.NamedExec(`DELETE FROM evm.log_poller_blocks WHERE block_number >= :start_block AND evm_chain_id = :evm_chain_id`, args)
+ // Applying upper bound filter is critical for Postgres performance (especially for evm.logs table)
+ // because it allows the planner to properly estimate the number of rows to be scanned.
+ // If not applied, these queries can become very slow. After some critical number
+ // of logs, Postgres will try to scan all the logs in the index by block_number.
+ // Latency without upper bound filter can be orders of magnitude higher for large number of logs.
+ _, err = tx.NamedExec(`DELETE FROM evm.log_poller_blocks
+ WHERE evm_chain_id = :evm_chain_id
+ AND block_number >= :start_block
+ AND block_number <= (SELECT MAX(block_number) FROM evm.log_poller_blocks WHERE evm_chain_id = :evm_chain_id)`, args)
if err != nil {
o.lggr.Warnw("Unable to clear reorged blocks, retrying", "err", err)
return err
}
- _, err = tx.NamedExec(`DELETE FROM evm.logs WHERE block_number >= :start_block AND evm_chain_id = :evm_chain_id`, args)
+ _, err = tx.NamedExec(`DELETE FROM evm.logs
+ WHERE evm_chain_id = :evm_chain_id
+ AND block_number >= :start_block
+ AND block_number <= (SELECT MAX(block_number) FROM evm.logs WHERE evm_chain_id = :evm_chain_id)`, args)
if err != nil {
o.lggr.Warnw("Unable to clear reorged logs, retrying", "err", err)
return err
diff --git a/core/chains/evm/logpoller/orm_test.go b/core/chains/evm/logpoller/orm_test.go
index 0af62ebd547..bcaa6f72fa0 100644
--- a/core/chains/evm/logpoller/orm_test.go
+++ b/core/chains/evm/logpoller/orm_test.go
@@ -1435,7 +1435,7 @@ func TestInsertLogsInTx(t *testing.T) {
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
// clean all logs and blocks between test cases
- defer func() { _ = o.DeleteLogsAndBlocksAfter(0) }()
+ defer func() { _, _ = db.Exec("truncate evm.logs") }()
insertErr := o.InsertLogs(tt.logs)
logsFromDb, err := o.SelectLogs(0, math.MaxInt, address, event)
diff --git a/core/chains/evm/mocks/node.go b/core/chains/evm/mocks/node.go
index 8f27218aec7..25944cfcf42 100644
--- a/core/chains/evm/mocks/node.go
+++ b/core/chains/evm/mocks/node.go
@@ -496,6 +496,36 @@ func (_m *Node) Order() int32 {
return r0
}
+// PendingCallContract provides a mock function with given fields: ctx, msg
+func (_m *Node) PendingCallContract(ctx context.Context, msg ethereum.CallMsg) ([]byte, error) {
+ ret := _m.Called(ctx, msg)
+
+ if len(ret) == 0 {
+ panic("no return value specified for PendingCallContract")
+ }
+
+ var r0 []byte
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) ([]byte, error)); ok {
+ return rf(ctx, msg)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, ethereum.CallMsg) []byte); ok {
+ r0 = rf(ctx, msg)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).([]byte)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, ethereum.CallMsg) error); ok {
+ r1 = rf(ctx, msg)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
// PendingCodeAt provides a mock function with given fields: ctx, account
func (_m *Node) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) {
ret := _m.Called(ctx, account)
diff --git a/core/chains/evm/types/models.go b/core/chains/evm/types/models.go
index 44e150b6541..7db38fc6821 100644
--- a/core/chains/evm/types/models.go
+++ b/core/chains/evm/types/models.go
@@ -105,11 +105,10 @@ func (h *Head) IsInChain(blockHash common.Hash) bool {
if h.Hash == blockHash {
return true
}
- if h.Parent != nil {
- h = h.Parent
- } else {
+ if h.Parent == nil {
break
}
+ h = h.Parent
}
return false
}
@@ -121,11 +120,10 @@ func (h *Head) HashAtHeight(blockNum int64) common.Hash {
if h.Number == blockNum {
return h.Hash
}
- if h.Parent != nil {
- h = h.Parent
- } else {
+ if h.Parent == nil {
break
}
+ h = h.Parent
}
return common.Hash{}
}
@@ -138,15 +136,14 @@ func (h *Head) ChainLength() uint32 {
l := uint32(1)
for {
- if h.Parent != nil {
- l++
- if h == h.Parent {
- panic("circular reference detected")
- }
- h = h.Parent
- } else {
+ if h.Parent == nil {
break
}
+ l++
+ if h == h.Parent {
+ panic("circular reference detected")
+ }
+ h = h.Parent
}
return l
}
@@ -157,14 +154,13 @@ func (h *Head) ChainHashes() []common.Hash {
for {
hashes = append(hashes, h.Hash)
- if h.Parent != nil {
- if h == h.Parent {
- panic("circular reference detected")
- }
- h = h.Parent
- } else {
+ if h.Parent == nil {
break
}
+ if h == h.Parent {
+ panic("circular reference detected")
+ }
+ h = h.Parent
}
return hashes
}
@@ -186,15 +182,14 @@ func (h *Head) ChainString() string {
for {
sb.WriteString(h.String())
- if h.Parent != nil {
- if h == h.Parent {
- panic("circular reference detected")
- }
- sb.WriteString("->")
- h = h.Parent
- } else {
+ if h.Parent == nil {
break
}
+ if h == h.Parent {
+ panic("circular reference detected")
+ }
+ sb.WriteString("->")
+ h = h.Parent
}
sb.WriteString("->nil")
return sb.String()
diff --git a/core/cmd/cosmos_node_commands_test.go b/core/cmd/cosmos_node_commands_test.go
index 728be9396f9..3197c48aa94 100644
--- a/core/cmd/cosmos_node_commands_test.go
+++ b/core/cmd/cosmos_node_commands_test.go
@@ -48,8 +48,8 @@ func TestShell_IndexCosmosNodes(t *testing.T) {
nodes := *r.Renders[0].(*cmd.CosmosNodePresenters)
require.Len(t, nodes, 1)
n := nodes[0]
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID, *node.Name), n.ID)
assert.Equal(t, chainID, n.ChainID)
- assert.Equal(t, *node.Name, n.ID)
assert.Equal(t, *node.Name, n.Name)
wantConfig, err := toml.Marshal(node)
require.NoError(t, err)
diff --git a/core/cmd/evm_node_commands_test.go b/core/cmd/evm_node_commands_test.go
index dae950fce01..96269c9e028 100644
--- a/core/cmd/evm_node_commands_test.go
+++ b/core/cmd/evm_node_commands_test.go
@@ -60,13 +60,13 @@ func TestShell_IndexEVMNodes(t *testing.T) {
n1 := nodes[0]
n2 := nodes[1]
assert.Equal(t, chainID.String(), n1.ChainID)
- assert.Equal(t, *node1.Name, n1.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID.String(), *node1.Name), n1.ID)
assert.Equal(t, *node1.Name, n1.Name)
wantConfig, err := toml.Marshal(node1)
require.NoError(t, err)
assert.Equal(t, string(wantConfig), n1.Config)
assert.Equal(t, chainID.String(), n2.ChainID)
- assert.Equal(t, *node2.Name, n2.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(chainID.String(), *node2.Name), n2.ID)
assert.Equal(t, *node2.Name, n2.Name)
wantConfig2, err := toml.Marshal(node2)
require.NoError(t, err)
diff --git a/core/cmd/ocr2_keys_commands_test.go b/core/cmd/ocr2_keys_commands_test.go
index 5a861fafa7c..eff44685612 100644
--- a/core/cmd/ocr2_keys_commands_test.go
+++ b/core/cmd/ocr2_keys_commands_test.go
@@ -32,7 +32,7 @@ func TestOCR2KeyBundlePresenter_RenderTable(t *testing.T) {
pubKeyConfig := key.ConfigEncryptionPublicKey()
pubKey := key.OffchainPublicKey()
p := cmd.OCR2KeyBundlePresenter{
- JAID: cmd.JAID{ID: bundleID},
+ JAID: cmd.NewJAID(bundleID),
OCR2KeysBundleResource: presenters.OCR2KeysBundleResource{
JAID: presenters.NewJAID(key.ID()),
ChainType: "evm",
diff --git a/core/cmd/shell_local.go b/core/cmd/shell_local.go
index b970b516413..350e6abf77d 100644
--- a/core/cmd/shell_local.go
+++ b/core/cmd/shell_local.go
@@ -1002,37 +1002,36 @@ func (s *Shell) CleanupChainTables(c *cli.Context) error {
// some tables with evm_chain_id (mostly job specs) are in public schema
tablesToDeleteFromQuery := `SELECT table_name, table_schema FROM information_schema.columns WHERE "column_name"=$1;`
// Delete rows from each table based on the chain_id.
- if strings.EqualFold("EVM", c.String("type")) {
- rows, err := db.Query(tablesToDeleteFromQuery, "evm_chain_id")
- if err != nil {
- return err
- }
- defer rows.Close()
+ if !strings.EqualFold("EVM", c.String("type")) {
+ return s.errorOut(errors.New("unknown chain type"))
+ }
+ rows, err := db.Query(tablesToDeleteFromQuery, "evm_chain_id")
+ if err != nil {
+ return err
+ }
+ defer rows.Close()
- var tablesToDeleteFrom []string
- for rows.Next() {
- var name string
- var schema string
- if err = rows.Scan(&name, &schema); err != nil {
- return err
- }
- tablesToDeleteFrom = append(tablesToDeleteFrom, schema+"."+name)
- }
- if rows.Err() != nil {
- return rows.Err()
+ var tablesToDeleteFrom []string
+ for rows.Next() {
+ var name string
+ var schema string
+ if err = rows.Scan(&name, &schema); err != nil {
+ return err
}
+ tablesToDeleteFrom = append(tablesToDeleteFrom, schema+"."+name)
+ }
+ if rows.Err() != nil {
+ return rows.Err()
+ }
- for _, tableName := range tablesToDeleteFrom {
- query := fmt.Sprintf(`DELETE FROM %s WHERE "evm_chain_id"=$1;`, tableName)
- _, err = db.Exec(query, c.String("id"))
- if err != nil {
- fmt.Printf("Error deleting rows containing evm_chain_id from %s: %v\n", tableName, err)
- } else {
- fmt.Printf("Rows with evm_chain_id %s deleted from %s.\n", c.String("id"), tableName)
- }
+ for _, tableName := range tablesToDeleteFrom {
+ query := fmt.Sprintf(`DELETE FROM %s WHERE "evm_chain_id"=$1;`, tableName)
+ _, err = db.Exec(query, c.String("id"))
+ if err != nil {
+ fmt.Printf("Error deleting rows containing evm_chain_id from %s: %v\n", tableName, err)
+ } else {
+ fmt.Printf("Rows with evm_chain_id %s deleted from %s.\n", c.String("id"), tableName)
}
- } else {
- return s.errorOut(errors.New("unknown chain type"))
}
return nil
}
diff --git a/core/cmd/solana_node_commands_test.go b/core/cmd/solana_node_commands_test.go
index 316cf16212d..ebe9502d1fa 100644
--- a/core/cmd/solana_node_commands_test.go
+++ b/core/cmd/solana_node_commands_test.go
@@ -55,13 +55,13 @@ func TestShell_IndexSolanaNodes(t *testing.T) {
n1 := nodes[0]
n2 := nodes[1]
assert.Equal(t, id, n1.ChainID)
- assert.Equal(t, *node1.Name, n1.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node1.Name), n1.ID)
assert.Equal(t, *node1.Name, n1.Name)
wantConfig, err := toml.Marshal(node1)
require.NoError(t, err)
assert.Equal(t, string(wantConfig), n1.Config)
assert.Equal(t, id, n2.ChainID)
- assert.Equal(t, *node2.Name, n2.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node2.Name), n2.ID)
assert.Equal(t, *node2.Name, n2.Name)
wantConfig2, err := toml.Marshal(node2)
require.NoError(t, err)
diff --git a/core/cmd/starknet_node_commands_test.go b/core/cmd/starknet_node_commands_test.go
index 0347cdd18f7..95f712d29bd 100644
--- a/core/cmd/starknet_node_commands_test.go
+++ b/core/cmd/starknet_node_commands_test.go
@@ -54,13 +54,13 @@ func TestShell_IndexStarkNetNodes(t *testing.T) {
n1 := nodes[0]
n2 := nodes[1]
assert.Equal(t, id, n1.ChainID)
- assert.Equal(t, *node1.Name, n1.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node1.Name), n1.ID)
assert.Equal(t, *node1.Name, n1.Name)
wantConfig, err := toml.Marshal(node1)
require.NoError(t, err)
assert.Equal(t, string(wantConfig), n1.Config)
assert.Equal(t, id, n2.ChainID)
- assert.Equal(t, *node2.Name, n2.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(id, *node2.Name), n2.ID)
assert.Equal(t, *node2.Name, n2.Name)
wantConfig2, err := toml.Marshal(node2)
require.NoError(t, err)
diff --git a/core/config/docs/chains-evm.toml b/core/config/docs/chains-evm.toml
index 8799bb9adea..975264be6d4 100644
--- a/core/config/docs/chains-evm.toml
+++ b/core/config/docs/chains-evm.toml
@@ -362,4 +362,4 @@ Order = 100 # Default
[EVM.OCR2.Automation]
# GasLimit controls the gas limit for transmit transactions from ocr2automation job.
-GasLimit = 5300000 # Default
+GasLimit = 5400000 # Default
diff --git a/core/config/env/env.go b/core/config/env/env.go
index f22310a6cf8..0ebfc357bf3 100644
--- a/core/config/env/env.go
+++ b/core/config/env/env.go
@@ -25,6 +25,7 @@ var (
// LOOPP commands and vars
var (
MedianPlugin = NewPlugin("median")
+ MercuryPlugin = NewPlugin("mercury")
SolanaPlugin = NewPlugin("solana")
StarknetPlugin = NewPlugin("starknet")
// PrometheusDiscoveryHostName is the externally accessible hostname
diff --git a/core/gethwrappers/abigen.go b/core/gethwrappers/abigen.go
index ed2558f4173..af085f30d9b 100644
--- a/core/gethwrappers/abigen.go
+++ b/core/gethwrappers/abigen.go
@@ -147,11 +147,10 @@ func getContractName(fileNode *ast.File) string {
if len(n.Name) < 3 {
return true
}
- if n.Name[len(n.Name)-3:] == "ABI" {
- contractName = n.Name[:len(n.Name)-3]
- } else {
+ if n.Name[len(n.Name)-3:] != "ABI" {
return true
}
+ contractName = n.Name[:len(n.Name)-3]
}
}
return false
diff --git a/core/gethwrappers/generated/automation_utils_2_2/automation_utils_2_2.go b/core/gethwrappers/generated/automation_utils_2_2/automation_utils_2_2.go
index 745cca66170..187193cb956 100644
--- a/core/gethwrappers/generated/automation_utils_2_2/automation_utils_2_2.go
+++ b/core/gethwrappers/generated/automation_utils_2_2/automation_utils_2_2.go
@@ -57,6 +57,7 @@ type AutomationRegistryBase22OnchainConfig struct {
Transcoder common.Address
Registrars []common.Address
UpkeepPrivilegeManager common.Address
+ ChainModule common.Address
ReorgProtectionEnabled bool
}
@@ -90,8 +91,8 @@ type LogTriggerConfig struct {
}
var AutomationUtilsMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"blockNum\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"internalType\":\"structAutomationRegistryBase2_2.ConditionalTrigger\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_conditionalTrigger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"source\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"topics\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"structLog\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_log\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"logBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"logIndex\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNum\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"internalType\":\"structAutomationRegistryBase2_2.LogTrigger\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_logTrigger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"filterSelector\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"topic0\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"topic1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"topic2\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"topic3\",\"type\":\"bytes32\"}],\"internalType\":\"structLogTriggerConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_logTriggerConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_onChainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"upkeepIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimits\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"triggers\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"performDatas\",\"type\":\"bytes[]\"}],\"internalType\":\"structAutomationRegistryBase2_2.Report\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b506108d0806100206000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063e32442c911610050578063e32442c9146100a6578063e65d6546146100b4578063e9720a49146100c257600080fd5b806321f373d7146100775780634b6df2941461008a578063776f306114610098575b600080fd5b6100886100853660046101e8565b50565b005b61008861008536600461026e565b6100886100853660046102c5565b61008861008536600461042a565b610088610085366004610701565b6100886100853660046107ee565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715610122576101226100d0565b60405290565b604051610200810167ffffffffffffffff81118282101715610122576101226100d0565b604051610100810167ffffffffffffffff81118282101715610122576101226100d0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156101b7576101b76100d0565b604052919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146101e357600080fd5b919050565b600060c082840312156101fa57600080fd5b6102026100ff565b61020b836101bf565b8152602083013560ff8116811461022157600080fd5b8060208301525060408301356040820152606083013560608201526080830135608082015260a083013560a08201528091505092915050565b803563ffffffff811681146101e357600080fd5b60006040828403121561028057600080fd5b6040516040810181811067ffffffffffffffff821117156102a3576102a36100d0565b6040526102af8361025a565b8152602083013560208201528091505092915050565b600060a082840312156102d757600080fd5b60405160a0810181811067ffffffffffffffff821117156102fa576102fa6100d0565b806040525082358152602083013560208201526103196040840161025a565b604082015261032a6060840161025a565b6060820152608083013560808201528091505092915050565b803562ffffff811681146101e357600080fd5b803561ffff811681146101e357600080fd5b80356bffffffffffffffffffffffff811681146101e357600080fd5b600067ffffffffffffffff82111561039e5761039e6100d0565b5060051b60200190565b600082601f8301126103b957600080fd5b813560206103ce6103c983610384565b610170565b82815260059290921b840181019181810190868411156103ed57600080fd5b8286015b8481101561040f57610402816101bf565b83529183019183016103f1565b509695505050505050565b803580151581146101e357600080fd5b60006020828403121561043c57600080fd5b813567ffffffffffffffff8082111561045457600080fd5b90830190610200828603121561046957600080fd5b610471610128565b61047a8361025a565b81526104886020840161025a565b60208201526104996040840161025a565b60408201526104aa60608401610343565b60608201526104bb60808401610356565b60808201526104cc60a08401610368565b60a08201526104dd60c0840161025a565b60c08201526104ee60e0840161025a565b60e082015261010061050181850161025a565b9082015261012061051384820161025a565b908201526101408381013590820152610160808401359082015261018061053b8185016101bf565b908201526101a0838101358381111561055357600080fd5b61055f888287016103a8565b8284015250506101c091506105758284016101bf565b828201526101e0915061058982840161041a565b91810191909152949350505050565b600082601f8301126105a957600080fd5b813560206105b96103c983610384565b82815260059290921b840181019181810190868411156105d857600080fd5b8286015b8481101561040f57803583529183019183016105dc565b600082601f83011261060457600080fd5b813567ffffffffffffffff81111561061e5761061e6100d0565b61064f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610170565b81815284602083860101111561066457600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261069257600080fd5b813560206106a26103c983610384565b82815260059290921b840181019181810190868411156106c157600080fd5b8286015b8481101561040f57803567ffffffffffffffff8111156106e55760008081fd5b6106f38986838b01016105f3565b8452509183019183016106c5565b60006020828403121561071357600080fd5b813567ffffffffffffffff8082111561072b57600080fd5b9083019060c0828603121561073f57600080fd5b6107476100ff565b823581526020830135602082015260408301358281111561076757600080fd5b61077387828601610598565b60408301525060608301358281111561078b57600080fd5b61079787828601610598565b6060830152506080830135828111156107af57600080fd5b6107bb87828601610681565b60808301525060a0830135828111156107d357600080fd5b6107df87828601610681565b60a08301525095945050505050565b60006020828403121561080057600080fd5b813567ffffffffffffffff8082111561081857600080fd5b90830190610100828603121561082d57600080fd5b61083561014c565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015261086d60a084016101bf565b60a082015260c08301358281111561088457600080fd5b61089087828601610598565b60c08301525060e0830135828111156108a857600080fd5b6108b4878286016105f3565b60e0830152509594505050505056fea164736f6c6343000813000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"blockNum\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"internalType\":\"structAutomationRegistryBase2_2.ConditionalTrigger\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_conditionalTrigger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"source\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"topics\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"internalType\":\"structLog\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_log\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"logBlockHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"logIndex\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNum\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"internalType\":\"structAutomationRegistryBase2_2.LogTrigger\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_logTrigger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"filterSelector\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"topic0\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"topic1\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"topic2\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"topic3\",\"type\":\"bytes32\"}],\"internalType\":\"structLogTriggerConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_logTriggerConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"},{\"internalType\":\"contractIChainModule\",\"name\":\"chainModule\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_onChainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"},{\"internalType\":\"uint256[]\",\"name\":\"upkeepIds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimits\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes[]\",\"name\":\"triggers\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"performDatas\",\"type\":\"bytes[]\"}],\"internalType\":\"structAutomationRegistryBase2_2.Report\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"_report\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x608060405234801561001057600080fd5b506108f1806100206000396000f3fe608060405234801561001057600080fd5b50600436106100725760003560e01c8063a4860f2311610050578063a4860f23146100a6578063e65d6546146100b4578063e9720a49146100c257600080fd5b806321f373d7146100775780634b6df2941461008a578063776f306114610098575b600080fd5b6100886100853660046101f1565b50565b005b610088610085366004610279565b6100886100853660046102d0565b610088610085366004610437565b610088610085366004610722565b61008861008536600461080f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff81118282101715610122576101226100d0565b60405290565b604051610220810167ffffffffffffffff81118282101715610122576101226100d0565b604051610100810167ffffffffffffffff81118282101715610122576101226100d0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156101b7576101b76100d0565b604052919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461008557600080fd5b80356101ec816101bf565b919050565b600060c0828403121561020357600080fd5b61020b6100ff565b8235610216816101bf565b8152602083013560ff8116811461022c57600080fd5b8060208301525060408301356040820152606083013560608201526080830135608082015260a083013560a08201528091505092915050565b803563ffffffff811681146101ec57600080fd5b60006040828403121561028b57600080fd5b6040516040810181811067ffffffffffffffff821117156102ae576102ae6100d0565b6040526102ba83610265565b8152602083013560208201528091505092915050565b600060a082840312156102e257600080fd5b60405160a0810181811067ffffffffffffffff82111715610305576103056100d0565b8060405250823581526020830135602082015261032460408401610265565b604082015261033560608401610265565b6060820152608083013560808201528091505092915050565b803562ffffff811681146101ec57600080fd5b803561ffff811681146101ec57600080fd5b80356bffffffffffffffffffffffff811681146101ec57600080fd5b600067ffffffffffffffff8211156103a9576103a96100d0565b5060051b60200190565b600082601f8301126103c457600080fd5b813560206103d96103d48361038f565b610170565b82815260059290921b840181019181810190868411156103f857600080fd5b8286015b8481101561041c57803561040f816101bf565b83529183019183016103fc565b509695505050505050565b803580151581146101ec57600080fd5b60006020828403121561044957600080fd5b813567ffffffffffffffff8082111561046157600080fd5b90830190610220828603121561047657600080fd5b61047e610128565b61048783610265565b815261049560208401610265565b60208201526104a660408401610265565b60408201526104b76060840161034e565b60608201526104c860808401610361565b60808201526104d960a08401610373565b60a08201526104ea60c08401610265565b60c08201526104fb60e08401610265565b60e082015261010061050e818501610265565b90820152610120610520848201610265565b90820152610140838101359082015261016080840135908201526101806105488185016101e1565b908201526101a0838101358381111561056057600080fd5b61056c888287016103b3565b8284015250506101c091506105828284016101e1565b828201526101e091506105968284016101e1565b8282015261020091506105aa828401610427565b91810191909152949350505050565b600082601f8301126105ca57600080fd5b813560206105da6103d48361038f565b82815260059290921b840181019181810190868411156105f957600080fd5b8286015b8481101561041c57803583529183019183016105fd565b600082601f83011261062557600080fd5b813567ffffffffffffffff81111561063f5761063f6100d0565b61067060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601610170565b81815284602083860101111561068557600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126106b357600080fd5b813560206106c36103d48361038f565b82815260059290921b840181019181810190868411156106e257600080fd5b8286015b8481101561041c57803567ffffffffffffffff8111156107065760008081fd5b6107148986838b0101610614565b8452509183019183016106e6565b60006020828403121561073457600080fd5b813567ffffffffffffffff8082111561074c57600080fd5b9083019060c0828603121561076057600080fd5b6107686100ff565b823581526020830135602082015260408301358281111561078857600080fd5b610794878286016105b9565b6040830152506060830135828111156107ac57600080fd5b6107b8878286016105b9565b6060830152506080830135828111156107d057600080fd5b6107dc878286016106a2565b60808301525060a0830135828111156107f457600080fd5b610800878286016106a2565b60a08301525095945050505050565b60006020828403121561082157600080fd5b813567ffffffffffffffff8082111561083957600080fd5b90830190610100828603121561084e57600080fd5b61085661014c565b823581526020830135602082015260408301356040820152606083013560608201526080830135608082015261088e60a084016101e1565b60a082015260c0830135828111156108a557600080fd5b6108b1878286016105b9565b60c08301525060e0830135828111156108c957600080fd5b6108d587828601610614565b60e0830152509594505050505056fea164736f6c6343000813000a",
}
var AutomationUtilsABI = AutomationUtilsMetaData.ABI
diff --git a/core/gethwrappers/generated/batch_vrf_coordinator_v2plus/batch_vrf_coordinator_v2plus.go b/core/gethwrappers/generated/batch_vrf_coordinator_v2plus/batch_vrf_coordinator_v2plus.go
index 58f134fe2a6..fa2892f5dce 100644
--- a/core/gethwrappers/generated/batch_vrf_coordinator_v2plus/batch_vrf_coordinator_v2plus.go
+++ b/core/gethwrappers/generated/batch_vrf_coordinator_v2plus/batch_vrf_coordinator_v2plus.go
@@ -53,7 +53,7 @@ type VRFTypesRequestCommitmentV2Plus struct {
var BatchVRFCoordinatorV2PlusMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"reason\",\"type\":\"string\"}],\"name\":\"ErrorReturned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"lowLevelData\",\"type\":\"bytes\"}],\"name\":\"RawErrorReturned\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COORDINATOR\",\"outputs\":[{\"internalType\":\"contractIVRFCoordinatorV2Plus\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRFTypes.Proof[]\",\"name\":\"proofs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFTypes.RequestCommitmentV2Plus[]\",\"name\":\"rcs\",\"type\":\"tuple[]\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60a060405234801561001057600080fd5b50604051610cc7380380610cc783398101604081905261002f91610044565b60601b6001600160601b031916608052610074565b60006020828403121561005657600080fd5b81516001600160a01b038116811461006d57600080fd5b9392505050565b60805160601c610c2f610098600039600081816040015261011d0152610c2f6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633b2bcbf11461003b5780636abb17211461008b575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61009e610099366004610665565b6100a0565b005b805182511461010f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e70757420617272617920617267206c656e67746873206d69736d61746368604482015260640160405180910390fd5b60005b8251811015610330577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663330987b384838151811061016957610169610b00565b602002602001015184848151811061018357610183610b00565b60200260200101516040518363ffffffff1660e01b81526004016101a8929190610930565b602060405180830381600087803b1580156101c257600080fd5b505af1925050508015610210575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261020d918101906107c5565b60015b61031c5761021c610b5e565b806308c379a014156102a15750610231610b7a565b8061023c57506102a3565b600061026085848151811061025357610253610b00565b6020026020010151610335565b9050807f4dcab4ce0e741a040f7e0f9b880557f8de685a9520d4bfac272a81c3c3802b2e83604051610292919061091d565b60405180910390a2505061031e565b505b3d8080156102cd576040519150601f19603f3d011682016040523d82523d6000602084013e6102d2565b606091505b5060006102ea85848151811061025357610253610b00565b9050807fbfd42bb5a1bf8153ea750f66ea4944f23f7b9ae51d0462177b9769aa652b61b583604051610292919061091d565b505b8061032881610aa0565b915050610112565b505050565b60008061034583600001516103a4565b9050808360800151604051602001610367929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6000816040516020016103b79190610909565b604051602081830303815290604052805190602001209050919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146103f857600080fd5b919050565b600082601f83011261040e57600080fd5b8135602061041b82610a0b565b604080516104298382610a55565b8481528381019250868401600586901b8801850189101561044957600080fd5b60005b8681101561053957813567ffffffffffffffff8082111561046c57600080fd5b818b01915060c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848f030112156104a457600080fd5b86516104af81610a2f565b8984013583811681146104c157600080fd5b8152838801358a82015260606104d8818601610651565b8983015260806104e9818701610651565b8284015260a091506104fc8287016103d4565b9083015291840135918383111561051257600080fd5b6105208f8c858801016105bf565b908201528852505050938501939085019060010161044c565b509098975050505050505050565b600082601f83011261055857600080fd5b6040516040810181811067ffffffffffffffff8211171561057b5761057b610b2f565b806040525080838560408601111561059257600080fd5b60005b60028110156105b4578135835260209283019290910190600101610595565b509195945050505050565b600082601f8301126105d057600080fd5b813567ffffffffffffffff8111156105ea576105ea610b2f565b60405161061f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160182610a55565b81815284602083860101111561063457600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146103f857600080fd5b600080604080848603121561067957600080fd5b833567ffffffffffffffff8082111561069157600080fd5b818601915086601f8301126106a557600080fd5b813560206106b282610a0b565b85516106be8282610a55565b83815282810191508583016101a0808602880185018d10156106df57600080fd5b600097505b858810156107945780828e0312156106fb57600080fd5b6107036109e1565b61070d8e84610547565b815261071b8e8b8501610547565b8682015260808301358a82015260a0830135606082015260c0830135608082015261074860e084016103d4565b60a082015261010061075c8f828601610547565b60c083015261076f8f6101408601610547565b60e08301526101808401359082015284526001979097019692840192908101906106e4565b509098505050870135935050808311156107ad57600080fd5b50506107bb858286016103fd565b9150509250929050565b6000602082840312156107d757600080fd5b81516bffffffffffffffffffffffff811681146107f357600080fd5b9392505050565b8060005b600281101561081d5781518452602093840193909101906001016107fe565b50505050565b6000815180845260005b818110156108495760208185018101518683018201520161082d565b8181111561085b576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b67ffffffffffffffff8151168252602081015160208301526000604082015163ffffffff8082166040860152806060850151166060860152505073ffffffffffffffffffffffffffffffffffffffff608083015116608084015260a082015160c060a085015261090160c0850182610823565b949350505050565b6040810161091782846107fa565b92915050565b6020815260006107f36020830184610823565b60006101c06109408386516107fa565b602085015161095260408501826107fa565b5060408501516080840152606085015160a0840152608085015160c084015273ffffffffffffffffffffffffffffffffffffffff60a08601511660e084015260c08501516101006109a5818601836107fa565b60e087015191506109ba6101408601836107fa565b860151610180850152506101a083018190526109d88184018561088e565b95945050505050565b604051610120810167ffffffffffffffff81118282101715610a0557610a05610b2f565b60405290565b600067ffffffffffffffff821115610a2557610a25610b2f565b5060051b60200190565b60c0810181811067ffffffffffffffff82111715610a4f57610a4f610b2f565b60405250565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715610a9957610a99610b2f565b6040525050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610af9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115610b775760046000803e5060005160e01c5b90565b600060443d1015610b885790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715610bd657505050505090565b8285019150815181811115610bee5750505050505090565b843d8701016020828501011115610c085750505050505090565b610c1760208286010187610a55565b50909594505050505056fea164736f6c6343000806000a",
+ Bin: "0x60a060405234801561001057600080fd5b50604051610cd3380380610cd383398101604081905261002f91610044565b60601b6001600160601b031916608052610074565b60006020828403121561005657600080fd5b81516001600160a01b038116811461006d57600080fd5b9392505050565b60805160601c610c3b610098600039600081816040015261011d0152610c3b6000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80633b2bcbf11461003b5780636abb17211461008b575b600080fd5b6100627f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61009e610099366004610668565b6100a0565b005b805182511461010f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e70757420617272617920617267206c656e67746873206d69736d61746368604482015260640160405180910390fd5b60005b8251811015610333577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663301f42e984838151811061016957610169610b0c565b602002602001015184848151811061018357610183610b0c565b602002602001015160006040518463ffffffff1660e01b81526004016101ab93929190610933565b602060405180830381600087803b1580156101c557600080fd5b505af1925050508015610213575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610210918101906107c8565b60015b61031f5761021f610b6a565b806308c379a014156102a45750610234610b86565b8061023f57506102a6565b600061026385848151811061025657610256610b0c565b6020026020010151610338565b9050807f4dcab4ce0e741a040f7e0f9b880557f8de685a9520d4bfac272a81c3c3802b2e836040516102959190610920565b60405180910390a25050610321565b505b3d8080156102d0576040519150601f19603f3d011682016040523d82523d6000602084013e6102d5565b606091505b5060006102ed85848151811061025657610256610b0c565b9050807fbfd42bb5a1bf8153ea750f66ea4944f23f7b9ae51d0462177b9769aa652b61b5836040516102959190610920565b505b8061032b81610aac565b915050610112565b505050565b60008061034883600001516103a7565b905080836080015160405160200161036a929190918252602082015260400190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b6000816040516020016103ba919061090c565b604051602081830303815290604052805190602001209050919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146103fb57600080fd5b919050565b600082601f83011261041157600080fd5b8135602061041e82610a17565b6040805161042c8382610a61565b8481528381019250868401600586901b8801850189101561044c57600080fd5b60005b8681101561053c57813567ffffffffffffffff8082111561046f57600080fd5b818b01915060c0807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848f030112156104a757600080fd5b86516104b281610a3b565b8984013583811681146104c457600080fd5b8152838801358a82015260606104db818601610654565b8983015260806104ec818701610654565b8284015260a091506104ff8287016103d7565b9083015291840135918383111561051557600080fd5b6105238f8c858801016105c2565b908201528852505050938501939085019060010161044f565b509098975050505050505050565b600082601f83011261055b57600080fd5b6040516040810181811067ffffffffffffffff8211171561057e5761057e610b3b565b806040525080838560408601111561059557600080fd5b60005b60028110156105b7578135835260209283019290910190600101610598565b509195945050505050565b600082601f8301126105d357600080fd5b813567ffffffffffffffff8111156105ed576105ed610b3b565b60405161062260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8501160182610a61565b81815284602083860101111561063757600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146103fb57600080fd5b600080604080848603121561067c57600080fd5b833567ffffffffffffffff8082111561069457600080fd5b818601915086601f8301126106a857600080fd5b813560206106b582610a17565b85516106c18282610a61565b83815282810191508583016101a0808602880185018d10156106e257600080fd5b600097505b858810156107975780828e0312156106fe57600080fd5b6107066109ed565b6107108e8461054a565b815261071e8e8b850161054a565b8682015260808301358a82015260a0830135606082015260c0830135608082015261074b60e084016103d7565b60a082015261010061075f8f82860161054a565b60c08301526107728f610140860161054a565b60e08301526101808401359082015284526001979097019692840192908101906106e7565b509098505050870135935050808311156107b057600080fd5b50506107be85828601610400565b9150509250929050565b6000602082840312156107da57600080fd5b81516bffffffffffffffffffffffff811681146107f657600080fd5b9392505050565b8060005b6002811015610820578151845260209384019390910190600101610801565b50505050565b6000815180845260005b8181101561084c57602081850181015186830182015201610830565b8181111561085e576000602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b67ffffffffffffffff8151168252602081015160208301526000604082015163ffffffff8082166040860152806060850151166060860152505073ffffffffffffffffffffffffffffffffffffffff608083015116608084015260a082015160c060a085015261090460c0850182610826565b949350505050565b6040810161091a82846107fd565b92915050565b6020815260006107f66020830184610826565b60006101e06109438387516107fd565b602086015161095560408501826107fd565b5060408601516080840152606086015160a0840152608086015160c084015273ffffffffffffffffffffffffffffffffffffffff60a08701511660e084015260c08601516101006109a8818601836107fd565b60e088015191506109bd6101408601836107fd565b870151610180850152506101a083018190526109db81840186610891565b9150506109046101c083018415159052565b604051610120810167ffffffffffffffff81118282101715610a1157610a11610b3b565b60405290565b600067ffffffffffffffff821115610a3157610a31610b3b565b5060051b60200190565b60c0810181811067ffffffffffffffff82111715610a5b57610a5b610b3b565b60405250565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f830116810181811067ffffffffffffffff82111715610aa557610aa5610b3b565b6040525050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610b05577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115610b835760046000803e5060005160e01c5b90565b600060443d1015610b945790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff8160248401118184111715610be257505050505090565b8285019150815181811115610bfa5750505050505090565b843d8701016020828501011115610c145750505050505090565b610c2360208286010187610a61565b50909594505050505056fea164736f6c6343000806000a",
}
var BatchVRFCoordinatorV2PlusABI = BatchVRFCoordinatorV2PlusMetaData.ABI
diff --git a/core/gethwrappers/generated/i_keeper_registry_master_wrapper_2_2/i_keeper_registry_master_wrapper_2_2.go b/core/gethwrappers/generated/i_keeper_registry_master_wrapper_2_2/i_keeper_registry_master_wrapper_2_2.go
index fe514342216..829f3a57e4b 100644
--- a/core/gethwrappers/generated/i_keeper_registry_master_wrapper_2_2/i_keeper_registry_master_wrapper_2_2.go
+++ b/core/gethwrappers/generated/i_keeper_registry_master_wrapper_2_2/i_keeper_registry_master_wrapper_2_2.go
@@ -46,9 +46,28 @@ type AutomationRegistryBase22OnchainConfig struct {
Transcoder common.Address
Registrars []common.Address
UpkeepPrivilegeManager common.Address
+ ChainModule common.Address
ReorgProtectionEnabled bool
}
+type AutomationRegistryBase22OnchainConfigLegacy struct {
+ PaymentPremiumPPB uint32
+ FlatFeeMicroLink uint32
+ CheckGasLimit uint32
+ StalenessSeconds *big.Int
+ GasCeilingMultiplier uint16
+ MinUpkeepSpend *big.Int
+ MaxPerformGas uint32
+ MaxCheckDataSize uint32
+ MaxPerformDataSize uint32
+ MaxRevertDataSize uint32
+ FallbackGasPrice *big.Int
+ FallbackLinkPrice *big.Int
+ Transcoder common.Address
+ Registrars []common.Address
+ UpkeepPrivilegeManager common.Address
+}
+
type AutomationRegistryBase22State struct {
Nonce uint32
OwnerLinkBalance *big.Int
@@ -76,7 +95,7 @@ type AutomationRegistryBase22UpkeepInfo struct {
}
var IAutomationRegistryMasterMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckDataExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfFaultyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrigger\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTriggerType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCheckDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxPerformDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByUpkeepPrivilegeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyUnpausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepCancelled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"AdminPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"CancelledUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"DedupKeyAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"InsufficientFundsUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"PayeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"ReorgedUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"StaleUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"UpkeepCheckDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepOffchainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalPayment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasOverhead\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepTriggerConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepUnpaused\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"name\":\"acceptPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"acceptUpkeepAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"addFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"cancelUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"values\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"triggerData\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"executeCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveUpkeepIDs\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"getAdminPrivilegeConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAutomationForwarderLogic\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCancellationDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConditionalGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFastGasFeedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepID\",\"type\":\"uint256\"}],\"name\":\"getForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLinkAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLinkNativeFeedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLogGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"triggerType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"getMaxPaymentForGas\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"maxPayment\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalanceForUpkeep\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"minBalance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMode\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"}],\"name\":\"getPeerRegistryMigrationPermission\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPerPerformByteGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPerSignerGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getSignerInfo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"ownerLinkBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"expectedLinkBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"totalPremium\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"numUpkeeps\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"latestConfigBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"latestConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"latestEpoch\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.State\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getTransmitterInfo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"lastCollected\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getTriggerType\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getUpkeep\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"maxValidBlocknumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"lastPerformedBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"amountSpent\",\"type\":\"uint96\"},{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structAutomationRegistryBase2_2.UpkeepInfo\",\"name\":\"upkeepInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getUpkeepPrivilegeConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getUpkeepTriggerConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"hasDedupKey\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"migrateUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"pauseUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedUpkeeps\",\"type\":\"bytes\"}],\"name\":\"receiveUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"triggerType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"newPrivilegeConfig\",\"type\":\"bytes\"}],\"name\":\"setAdminPrivilegeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfigBytes\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfig\",\"name\":\"onchainConfig\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfigTypeSafe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"setPayees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"permission\",\"type\":\"uint8\"}],\"name\":\"setPeerRegistryMigrationPermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"setUpkeepCheckData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"setUpkeepGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"setUpkeepOffchainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"newPrivilegeConfig\",\"type\":\"bytes\"}],\"name\":\"setUpkeepPrivilegeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"setUpkeepTriggerConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"simulatePerformUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferUpkeepAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"unpauseUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upkeepTranscoderVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upkeepVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawOwnerFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckDataExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfFaultyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrigger\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTriggerType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCheckDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxPerformDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByUpkeepPrivilegeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyUnpausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepCancelled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"AdminPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"CancelledUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newModule\",\"type\":\"address\"}],\"name\":\"ChainSpecificModuleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"DedupKeyAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"InsufficientFundsUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"PayeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"ReorgedUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"StaleUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"UpkeepCheckDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepOffchainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalPayment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasOverhead\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepTriggerConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepUnpaused\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"name\":\"acceptPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"acceptUpkeepAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"addFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"cancelUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"values\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"triggerData\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"executeCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"uint8\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveUpkeepIDs\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"getAdminPrivilegeConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowedReadOnlyAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAutomationForwarderLogic\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCancellationDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainModule\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"chainModule\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConditionalGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFastGasFeedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepID\",\"type\":\"uint256\"}],\"name\":\"getForwarder\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLinkAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLinkNativeFeedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLogGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"triggerType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"getMaxPaymentForGas\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"maxPayment\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalanceForUpkeep\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"minBalance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"}],\"name\":\"getPeerRegistryMigrationPermission\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPerPerformByteGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPerSignerGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getReorgProtectionEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getSignerInfo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"ownerLinkBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"expectedLinkBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"totalPremium\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"numUpkeeps\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"latestConfigBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"latestConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"latestEpoch\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.State\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfigLegacy\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getTransmitterInfo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"lastCollected\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getTriggerType\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getUpkeep\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"maxValidBlocknumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"lastPerformedBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"amountSpent\",\"type\":\"uint96\"},{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structAutomationRegistryBase2_2.UpkeepInfo\",\"name\":\"upkeepInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getUpkeepPrivilegeConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getUpkeepTriggerConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"hasDedupKey\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"migrateUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"pauseUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedUpkeeps\",\"type\":\"bytes\"}],\"name\":\"receiveUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"triggerType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"newPrivilegeConfig\",\"type\":\"bytes\"}],\"name\":\"setAdminPrivilegeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newModule\",\"type\":\"address\"}],\"name\":\"setChainSpecificModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfigBytes\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"chainModule\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfig\",\"name\":\"onchainConfig\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfigTypeSafe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"setPayees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"permission\",\"type\":\"uint8\"}],\"name\":\"setPeerRegistryMigrationPermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"setUpkeepCheckData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"setUpkeepGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"setUpkeepOffchainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"newPrivilegeConfig\",\"type\":\"bytes\"}],\"name\":\"setUpkeepPrivilegeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"setUpkeepTriggerConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"simulatePerformUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferUpkeepAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"unpauseUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upkeepTranscoderVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upkeepVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawOwnerFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
}
var IAutomationRegistryMasterABI = IAutomationRegistryMasterMetaData.ABI
@@ -365,6 +384,28 @@ func (_IAutomationRegistryMaster *IAutomationRegistryMasterCallerSession) GetAdm
return _IAutomationRegistryMaster.Contract.GetAdminPrivilegeConfig(&_IAutomationRegistryMaster.CallOpts, admin)
}
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetAllowedReadOnlyAddress(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IAutomationRegistryMaster.contract.Call(opts, &out, "getAllowedReadOnlyAddress")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterSession) GetAllowedReadOnlyAddress() (common.Address, error) {
+ return _IAutomationRegistryMaster.Contract.GetAllowedReadOnlyAddress(&_IAutomationRegistryMaster.CallOpts)
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterCallerSession) GetAllowedReadOnlyAddress() (common.Address, error) {
+ return _IAutomationRegistryMaster.Contract.GetAllowedReadOnlyAddress(&_IAutomationRegistryMaster.CallOpts)
+}
+
func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetAutomationForwarderLogic(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
err := _IAutomationRegistryMaster.contract.Call(opts, &out, "getAutomationForwarderLogic")
@@ -431,6 +472,28 @@ func (_IAutomationRegistryMaster *IAutomationRegistryMasterCallerSession) GetCan
return _IAutomationRegistryMaster.Contract.GetCancellationDelay(&_IAutomationRegistryMaster.CallOpts)
}
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetChainModule(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _IAutomationRegistryMaster.contract.Call(opts, &out, "getChainModule")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterSession) GetChainModule() (common.Address, error) {
+ return _IAutomationRegistryMaster.Contract.GetChainModule(&_IAutomationRegistryMaster.CallOpts)
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterCallerSession) GetChainModule() (common.Address, error) {
+ return _IAutomationRegistryMaster.Contract.GetChainModule(&_IAutomationRegistryMaster.CallOpts)
+}
+
func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetConditionalGasOverhead(opts *bind.CallOpts) (*big.Int, error) {
var out []interface{}
err := _IAutomationRegistryMaster.contract.Call(opts, &out, "getConditionalGasOverhead")
@@ -629,28 +692,6 @@ func (_IAutomationRegistryMaster *IAutomationRegistryMasterCallerSession) GetMin
return _IAutomationRegistryMaster.Contract.GetMinBalanceForUpkeep(&_IAutomationRegistryMaster.CallOpts, id)
}
-func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetMode(opts *bind.CallOpts) (uint8, error) {
- var out []interface{}
- err := _IAutomationRegistryMaster.contract.Call(opts, &out, "getMode")
-
- if err != nil {
- return *new(uint8), err
- }
-
- out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
- return out0, err
-
-}
-
-func (_IAutomationRegistryMaster *IAutomationRegistryMasterSession) GetMode() (uint8, error) {
- return _IAutomationRegistryMaster.Contract.GetMode(&_IAutomationRegistryMaster.CallOpts)
-}
-
-func (_IAutomationRegistryMaster *IAutomationRegistryMasterCallerSession) GetMode() (uint8, error) {
- return _IAutomationRegistryMaster.Contract.GetMode(&_IAutomationRegistryMaster.CallOpts)
-}
-
func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetPeerRegistryMigrationPermission(opts *bind.CallOpts, peer common.Address) (uint8, error) {
var out []interface{}
err := _IAutomationRegistryMaster.contract.Call(opts, &out, "getPeerRegistryMigrationPermission", peer)
@@ -717,6 +758,28 @@ func (_IAutomationRegistryMaster *IAutomationRegistryMasterCallerSession) GetPer
return _IAutomationRegistryMaster.Contract.GetPerSignerGasOverhead(&_IAutomationRegistryMaster.CallOpts)
}
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetReorgProtectionEnabled(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _IAutomationRegistryMaster.contract.Call(opts, &out, "getReorgProtectionEnabled")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterSession) GetReorgProtectionEnabled() (bool, error) {
+ return _IAutomationRegistryMaster.Contract.GetReorgProtectionEnabled(&_IAutomationRegistryMaster.CallOpts)
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterCallerSession) GetReorgProtectionEnabled() (bool, error) {
+ return _IAutomationRegistryMaster.Contract.GetReorgProtectionEnabled(&_IAutomationRegistryMaster.CallOpts)
+}
+
func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetSignerInfo(opts *bind.CallOpts, query common.Address) (GetSignerInfo,
error) {
@@ -759,7 +822,7 @@ func (_IAutomationRegistryMaster *IAutomationRegistryMasterCaller) GetState(opts
}
outstruct.State = *abi.ConvertType(out[0], new(AutomationRegistryBase22State)).(*AutomationRegistryBase22State)
- outstruct.Config = *abi.ConvertType(out[1], new(AutomationRegistryBase22OnchainConfig)).(*AutomationRegistryBase22OnchainConfig)
+ outstruct.Config = *abi.ConvertType(out[1], new(AutomationRegistryBase22OnchainConfigLegacy)).(*AutomationRegistryBase22OnchainConfigLegacy)
outstruct.Signers = *abi.ConvertType(out[2], new([]common.Address)).(*[]common.Address)
outstruct.Transmitters = *abi.ConvertType(out[3], new([]common.Address)).(*[]common.Address)
outstruct.F = *abi.ConvertType(out[4], new(uint8)).(*uint8)
@@ -1283,6 +1346,18 @@ func (_IAutomationRegistryMaster *IAutomationRegistryMasterTransactorSession) Se
return _IAutomationRegistryMaster.Contract.SetAdminPrivilegeConfig(&_IAutomationRegistryMaster.TransactOpts, admin, newPrivilegeConfig)
}
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterTransactor) SetChainSpecificModule(opts *bind.TransactOpts, newModule common.Address) (*types.Transaction, error) {
+ return _IAutomationRegistryMaster.contract.Transact(opts, "setChainSpecificModule", newModule)
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterSession) SetChainSpecificModule(newModule common.Address) (*types.Transaction, error) {
+ return _IAutomationRegistryMaster.Contract.SetChainSpecificModule(&_IAutomationRegistryMaster.TransactOpts, newModule)
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterTransactorSession) SetChainSpecificModule(newModule common.Address) (*types.Transaction, error) {
+ return _IAutomationRegistryMaster.Contract.SetChainSpecificModule(&_IAutomationRegistryMaster.TransactOpts, newModule)
+}
+
func (_IAutomationRegistryMaster *IAutomationRegistryMasterTransactor) SetConfig(opts *bind.TransactOpts, signers []common.Address, transmitters []common.Address, f uint8, onchainConfigBytes []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error) {
return _IAutomationRegistryMaster.contract.Transact(opts, "setConfig", signers, transmitters, f, onchainConfigBytes, offchainConfigVersion, offchainConfig)
}
@@ -1767,6 +1842,123 @@ func (_IAutomationRegistryMaster *IAutomationRegistryMasterFilterer) ParseCancel
return event, nil
}
+type IAutomationRegistryMasterChainSpecificModuleUpdatedIterator struct {
+ Event *IAutomationRegistryMasterChainSpecificModuleUpdated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *IAutomationRegistryMasterChainSpecificModuleUpdatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(IAutomationRegistryMasterChainSpecificModuleUpdated)
+ 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(IAutomationRegistryMasterChainSpecificModuleUpdated)
+ 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 *IAutomationRegistryMasterChainSpecificModuleUpdatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *IAutomationRegistryMasterChainSpecificModuleUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type IAutomationRegistryMasterChainSpecificModuleUpdated struct {
+ NewModule common.Address
+ Raw types.Log
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterFilterer) FilterChainSpecificModuleUpdated(opts *bind.FilterOpts) (*IAutomationRegistryMasterChainSpecificModuleUpdatedIterator, error) {
+
+ logs, sub, err := _IAutomationRegistryMaster.contract.FilterLogs(opts, "ChainSpecificModuleUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &IAutomationRegistryMasterChainSpecificModuleUpdatedIterator{contract: _IAutomationRegistryMaster.contract, event: "ChainSpecificModuleUpdated", logs: logs, sub: sub}, nil
+}
+
+func (_IAutomationRegistryMaster *IAutomationRegistryMasterFilterer) WatchChainSpecificModuleUpdated(opts *bind.WatchOpts, sink chan<- *IAutomationRegistryMasterChainSpecificModuleUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _IAutomationRegistryMaster.contract.WatchLogs(opts, "ChainSpecificModuleUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(IAutomationRegistryMasterChainSpecificModuleUpdated)
+ if err := _IAutomationRegistryMaster.contract.UnpackLog(event, "ChainSpecificModuleUpdated", 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 (_IAutomationRegistryMaster *IAutomationRegistryMasterFilterer) ParseChainSpecificModuleUpdated(log types.Log) (*IAutomationRegistryMasterChainSpecificModuleUpdated, error) {
+ event := new(IAutomationRegistryMasterChainSpecificModuleUpdated)
+ if err := _IAutomationRegistryMaster.contract.UnpackLog(event, "ChainSpecificModuleUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
type IAutomationRegistryMasterConfigSetIterator struct {
Event *IAutomationRegistryMasterConfigSet
@@ -5841,7 +6033,7 @@ type GetSignerInfo struct {
}
type GetState struct {
State AutomationRegistryBase22State
- Config AutomationRegistryBase22OnchainConfig
+ Config AutomationRegistryBase22OnchainConfigLegacy
Signers []common.Address
Transmitters []common.Address
F uint8
@@ -5874,6 +6066,8 @@ func (_IAutomationRegistryMaster *IAutomationRegistryMaster) ParseLog(log types.
return _IAutomationRegistryMaster.ParseAdminPrivilegeConfigSet(log)
case _IAutomationRegistryMaster.abi.Events["CancelledUpkeepReport"].ID:
return _IAutomationRegistryMaster.ParseCancelledUpkeepReport(log)
+ case _IAutomationRegistryMaster.abi.Events["ChainSpecificModuleUpdated"].ID:
+ return _IAutomationRegistryMaster.ParseChainSpecificModuleUpdated(log)
case _IAutomationRegistryMaster.abi.Events["ConfigSet"].ID:
return _IAutomationRegistryMaster.ParseConfigSet(log)
case _IAutomationRegistryMaster.abi.Events["DedupKeyAdded"].ID:
@@ -5950,6 +6144,10 @@ func (IAutomationRegistryMasterCancelledUpkeepReport) Topic() common.Hash {
return common.HexToHash("0xc3237c8807c467c1b39b8d0395eff077313e691bf0a7388106792564ebfd5636")
}
+func (IAutomationRegistryMasterChainSpecificModuleUpdated) Topic() common.Hash {
+ return common.HexToHash("0xdefc28b11a7980dbe0c49dbbd7055a1584bc8075097d1e8b3b57fb7283df2ad7")
+}
+
func (IAutomationRegistryMasterConfigSet) Topic() common.Hash {
return common.HexToHash("0x1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e05")
}
@@ -6097,12 +6295,16 @@ type IAutomationRegistryMasterInterface interface {
GetAdminPrivilegeConfig(opts *bind.CallOpts, admin common.Address) ([]byte, error)
+ GetAllowedReadOnlyAddress(opts *bind.CallOpts) (common.Address, error)
+
GetAutomationForwarderLogic(opts *bind.CallOpts) (common.Address, error)
GetBalance(opts *bind.CallOpts, id *big.Int) (*big.Int, error)
GetCancellationDelay(opts *bind.CallOpts) (*big.Int, error)
+ GetChainModule(opts *bind.CallOpts) (common.Address, error)
+
GetConditionalGasOverhead(opts *bind.CallOpts) (*big.Int, error)
GetFastGasFeedAddress(opts *bind.CallOpts) (common.Address, error)
@@ -6121,14 +6323,14 @@ type IAutomationRegistryMasterInterface interface {
GetMinBalanceForUpkeep(opts *bind.CallOpts, id *big.Int) (*big.Int, error)
- GetMode(opts *bind.CallOpts) (uint8, error)
-
GetPeerRegistryMigrationPermission(opts *bind.CallOpts, peer common.Address) (uint8, error)
GetPerPerformByteGasOverhead(opts *bind.CallOpts) (*big.Int, error)
GetPerSignerGasOverhead(opts *bind.CallOpts) (*big.Int, error)
+ GetReorgProtectionEnabled(opts *bind.CallOpts) (bool, error)
+
GetSignerInfo(opts *bind.CallOpts, query common.Address) (GetSignerInfo,
error)
@@ -6201,6 +6403,8 @@ type IAutomationRegistryMasterInterface interface {
SetAdminPrivilegeConfig(opts *bind.TransactOpts, admin common.Address, newPrivilegeConfig []byte) (*types.Transaction, error)
+ SetChainSpecificModule(opts *bind.TransactOpts, newModule common.Address) (*types.Transaction, error)
+
SetConfig(opts *bind.TransactOpts, signers []common.Address, transmitters []common.Address, f uint8, onchainConfigBytes []byte, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error)
SetConfigTypeSafe(opts *bind.TransactOpts, signers []common.Address, transmitters []common.Address, f uint8, onchainConfig AutomationRegistryBase22OnchainConfig, offchainConfigVersion uint64, offchainConfig []byte) (*types.Transaction, error)
@@ -6251,6 +6455,12 @@ type IAutomationRegistryMasterInterface interface {
ParseCancelledUpkeepReport(log types.Log) (*IAutomationRegistryMasterCancelledUpkeepReport, error)
+ FilterChainSpecificModuleUpdated(opts *bind.FilterOpts) (*IAutomationRegistryMasterChainSpecificModuleUpdatedIterator, error)
+
+ WatchChainSpecificModuleUpdated(opts *bind.WatchOpts, sink chan<- *IAutomationRegistryMasterChainSpecificModuleUpdated) (event.Subscription, error)
+
+ ParseChainSpecificModuleUpdated(log types.Log) (*IAutomationRegistryMasterChainSpecificModuleUpdated, error)
+
FilterConfigSet(opts *bind.FilterOpts) (*IAutomationRegistryMasterConfigSetIterator, error)
WatchConfigSet(opts *bind.WatchOpts, sink chan<- *IAutomationRegistryMasterConfigSet) (event.Subscription, error)
diff --git a/core/gethwrappers/generated/keeper_registry_logic_a_wrapper_2_2/keeper_registry_logic_a_wrapper_2_2.go b/core/gethwrappers/generated/keeper_registry_logic_a_wrapper_2_2/keeper_registry_logic_a_wrapper_2_2.go
index c20a476e918..942459c7eda 100644
--- a/core/gethwrappers/generated/keeper_registry_logic_a_wrapper_2_2/keeper_registry_logic_a_wrapper_2_2.go
+++ b/core/gethwrappers/generated/keeper_registry_logic_a_wrapper_2_2/keeper_registry_logic_a_wrapper_2_2.go
@@ -31,8 +31,8 @@ var (
)
var AutomationRegistryLogicAMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractAutomationRegistryLogicB2_2\",\"name\":\"logicB\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckDataExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfFaultyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrigger\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTriggerType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCheckDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxPerformDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByUpkeepPrivilegeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyUnpausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepCancelled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"AdminPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"CancelledUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"DedupKeyAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"InsufficientFundsUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"PayeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"ReorgedUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"StaleUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"UpkeepCheckDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepOffchainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalPayment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasOverhead\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepTriggerConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepUnpaused\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"addFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"cancelUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"values\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"enumAutomationRegistryBase2_2.UpkeepFailureReason\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"triggerData\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"enumAutomationRegistryBase2_2.UpkeepFailureReason\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"enumAutomationRegistryBase2_2.UpkeepFailureReason\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"executeCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"enumAutomationRegistryBase2_2.UpkeepFailureReason\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"migrateUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedUpkeeps\",\"type\":\"bytes\"}],\"name\":\"receiveUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"enumAutomationRegistryBase2_2.Trigger\",\"name\":\"triggerType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"setUpkeepTriggerConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101406040523480156200001257600080fd5b50604051620061d3380380620061d38339810160408190526200003591620003df565b80816001600160a01b0316634b4fd03b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000406565b826001600160a01b031663ca30e6036040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001009190620003df565b836001600160a01b031663b10b673c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001659190620003df565b846001600160a01b0316636709d0e56040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ca9190620003df565b856001600160a01b0316635425d8ac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f9190620003df565b3380600081620002865760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620002b957620002b9816200031b565b505050846002811115620002d157620002d162000429565b60e0816002811115620002e857620002e862000429565b9052506001600160a01b0393841660805291831660a052821660c0528116610100529190911661012052506200043f9050565b336001600160a01b03821603620003755760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200027d565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b0381168114620003dc57600080fd5b50565b600060208284031215620003f257600080fd5b8151620003ff81620003c6565b9392505050565b6000602082840312156200041957600080fd5b815160038110620003ff57600080fd5b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05160e0516101005161012051615d1a620004b96000396000818161010e01526101a90152600081816103e10152611fbd01526000818161356301528181613799015281816139e10152613b890152600061310d015260006131f1015260008181611dff01526123cb0152615d1a6000f3fe60806040523480156200001157600080fd5b50600436106200010c5760003560e01c806385c1b0ba11620000a5578063c8048022116200006f578063c804802214620002b7578063ce7dc5b414620002ce578063f2fde38b14620002e5578063f7d334ba14620002fc576200010c565b806385c1b0ba14620002535780638da5cb5b146200026a5780638e86139b1462000289578063948108f714620002a0576200010c565b80634ee88d3511620000e75780634ee88d3514620001ef5780636ded9eae146200020657806371791aa0146200021d57806379ba50971462000249576200010c565b806328f32f38146200015457806329c5efad146200017e578063349e8cca14620001a7575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e8080156200014d573d6000f35b3d6000fd5b005b6200016b6200016536600462004216565b62000313565b6040519081526020015b60405180910390f35b620001956200018f366004620042fc565b6200068d565b60405162000175949392919062004424565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000175565b620001526200020036600462004461565b62000931565b6200016b62000217366004620044b1565b62000999565b620002346200022e366004620042fc565b620009ff565b60405162000175979695949392919062004564565b620001526200110c565b6200015262000264366004620045b6565b6200120f565b60005473ffffffffffffffffffffffffffffffffffffffff16620001c9565b620001526200029a36600462004643565b62001e80565b62000152620002b1366004620046a6565b62002208565b62000152620002c8366004620046d5565b6200249b565b62000195620002df366004620047ab565b62002862565b62000152620002f636600462004822565b62002932565b620002346200030d366004620046d5565b6200294a565b6000805473ffffffffffffffffffffffffffffffffffffffff1633148015906200034757506200034560093362002988565b155b156200037f576040517fd48b678b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff89163b620003ce576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003d986620029bc565b9050600089307f00000000000000000000000000000000000000000000000000000000000000006040516200040e9062003fa7565b73ffffffffffffffffffffffffffffffffffffffff938416815291831660208301529091166040820152606001604051809103906000f08015801562000458573d6000803e3d6000fd5b5090506200051f826040518060e001604052806000151581526020018c63ffffffff16815260200163ffffffff801681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff168152602001600063ffffffff168152508a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915062002b609050565b6015805474010000000000000000000000000000000000000000900463ffffffff169060146200054f8362004871565b91906101000a81548163ffffffff021916908363ffffffff16021790555050817fbae366358c023f887e791d7a62f2e4316f1026bd77f6fb49501a917b3bc5d0128a8a604051620005c892919063ffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60405180910390a2817fcba2d5723b2ee59e53a8e8a82a4a7caf4fdfe70e9f7c582950bf7e7a5c24e83d878760405162000604929190620048e0565b60405180910390a2817f2b72ac786c97e68dbab71023ed6f2bdbfc80ad9bb7808941929229d71b7d5664856040516200063e9190620048f6565b60405180910390a2817f3e8740446213c8a77d40e08f79136ce3f347d13ed270a6ebdf57159e0faf485084604051620006789190620048f6565b60405180910390a25098975050505050505050565b600060606000806200069e62002f4b565b600086815260046020908152604091829020825160e081018452815460ff811615158252610100810463ffffffff90811694830194909452650100000000008104841694820194909452690100000000000000000090930473ffffffffffffffffffffffffffffffffffffffff166060840152600101546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a0840152780100000000000000000000000000000000000000000000000090041660c08201525a9150600080826060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007b8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007de919062004918565b73ffffffffffffffffffffffffffffffffffffffff166014600101600c9054906101000a900463ffffffff1663ffffffff168960405162000820919062004938565b60006040518083038160008787f1925050503d806000811462000860576040519150601f19603f3d011682016040523d82523d6000602084013e62000865565b606091505b50915091505a62000877908562004956565b935081620008a257600060405180602001604052806000815250600796509650965050505062000928565b80806020019051810190620008b89190620049c7565b909750955086620008e657600060405180602001604052806000815250600496509650965050505062000928565b601654865164010000000090910463ffffffff1610156200092457600060405180602001604052806000815250600596509650965050505062000928565b5050505b92959194509250565b6200093c8362002f86565b6000838152601b602052604090206200095782848362004abc565b50827f2b72ac786c97e68dbab71023ed6f2bdbfc80ad9bb7808941929229d71b7d566483836040516200098c929190620048e0565b60405180910390a2505050565b6000620009f388888860008989604051806020016040528060008152508a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200031392505050565b98975050505050505050565b60006060600080600080600062000a1562002f4b565b600062000a228a6200303c565b905060006012604051806101400160405290816000820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160008201600c9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160189054906101000a900462ffffff1662ffffff1662ffffff16815260200160008201601b9054906101000a900461ffff1661ffff1661ffff16815260200160008201601d9054906101000a900460ff1660ff1660ff16815260200160008201601e9054906101000a900460ff1615151515815260200160008201601f9054906101000a900460ff161515151581526020016001820160009054906101000a900460ff16151515158152505090506000600460008d81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160059054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160099054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160018201600c9054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090508160e001511562000d61576000604051806020016040528060008152506009600084602001516000808263ffffffff169250995099509950995099509950995050505062001100565b604081015163ffffffff9081161462000db2576000604051806020016040528060008152506001600084602001516000808263ffffffff169250995099509950995099509950995050505062001100565b80511562000df8576000604051806020016040528060008152506002600084602001516000808263ffffffff169250995099509950995099509950995050505062001100565b62000e0382620030ea565b602083015160165492975090955060009162000e35918591879190640100000000900463ffffffff168a8a87620032dc565b9050806bffffffffffffffffffffffff168260a001516bffffffffffffffffffffffff16101562000e9f576000604051806020016040528060008152506006600085602001516000808263ffffffff1692509a509a509a509a509a509a509a505050505062001100565b600062000eae8e868f6200332d565b90505a9850600080846060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000f06573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2c919062004918565b73ffffffffffffffffffffffffffffffffffffffff166014600101600c9054906101000a900463ffffffff1663ffffffff168460405162000f6e919062004938565b60006040518083038160008787f1925050503d806000811462000fae576040519150601f19603f3d011682016040523d82523d6000602084013e62000fb3565b606091505b50915091505a62000fc5908c62004956565b9a5081620010455760165481516801000000000000000090910463ffffffff1610156200102257505060408051602080820190925260008082529490910151939c509a50600899505063ffffffff90911695506200110092505050565b602090940151939b5060039a505063ffffffff9092169650620011009350505050565b808060200190518101906200105b9190620049c7565b909e509c508d6200109c57505060408051602080820190925260008082529490910151939c509a50600499505063ffffffff90911695506200110092505050565b6016548d5164010000000090910463ffffffff161015620010ed57505060408051602080820190925260008082529490910151939c509a50600599505063ffffffff90911695506200110092505050565b505050506020015163ffffffff16945050505b92959891949750929550565b60015473ffffffffffffffffffffffffffffffffffffffff16331462001193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600173ffffffffffffffffffffffffffffffffffffffff82166000908152601a602052604090205460ff1660038111156200124e576200124e620043b9565b141580156200129a5750600373ffffffffffffffffffffffffffffffffffffffff82166000908152601a602052604090205460ff166003811115620012975762001297620043b9565b14155b15620012d2576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1662001332576040517fd12d7d8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290036200136e576040517f2c2fc94100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000808567ffffffffffffffff811115620013c557620013c56200409d565b604051908082528060200260200182016040528015620013ef578160200160208202803683370190505b50905060008667ffffffffffffffff8111156200141057620014106200409d565b6040519080825280602002602001820160405280156200149757816020015b6040805160e08101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816200142f5790505b50905060008767ffffffffffffffff811115620014b857620014b86200409d565b604051908082528060200260200182016040528015620014ed57816020015b6060815260200190600190039081620014d75790505b50905060008867ffffffffffffffff8111156200150e576200150e6200409d565b6040519080825280602002602001820160405280156200154357816020015b60608152602001906001900390816200152d5790505b50905060008967ffffffffffffffff8111156200156457620015646200409d565b6040519080825280602002602001820160405280156200159957816020015b6060815260200190600190039081620015835790505b50905060005b8a81101562001b7d578b8b82818110620015bd57620015bd62004be4565b60209081029290920135600081815260048452604090819020815160e081018352815460ff811615158252610100810463ffffffff90811697830197909752650100000000008104871693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff166060830152600101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490931660c08401529a509098506200169c90508962002f86565b60608801516040517f1a5da6c800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c8116600483015290911690631a5da6c890602401600060405180830381600087803b1580156200170c57600080fd5b505af115801562001721573d6000803e3d6000fd5b50505050878582815181106200173b576200173b62004be4565b6020026020010181905250600560008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168682815181106200178f576200178f62004be4565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015260008a81526007909152604090208054620017ce9062004a14565b80601f0160208091040260200160405190810160405280929190818152602001828054620017fc9062004a14565b80156200184d5780601f1062001821576101008083540402835291602001916200184d565b820191906000526020600020905b8154815290600101906020018083116200182f57829003601f168201915b505050505084828151811062001867576200186762004be4565b6020026020010181905250601b60008a81526020019081526020016000208054620018929062004a14565b80601f0160208091040260200160405190810160405280929190818152602001828054620018c09062004a14565b8015620019115780601f10620018e55761010080835404028352916020019162001911565b820191906000526020600020905b815481529060010190602001808311620018f357829003601f168201915b50505050508382815181106200192b576200192b62004be4565b6020026020010181905250601c60008a81526020019081526020016000208054620019569062004a14565b80601f0160208091040260200160405190810160405280929190818152602001828054620019849062004a14565b8015620019d55780601f10620019a957610100808354040283529160200191620019d5565b820191906000526020600020905b815481529060010190602001808311620019b757829003601f168201915b5050505050828281518110620019ef57620019ef62004be4565b60200260200101819052508760a001516bffffffffffffffffffffffff168762001a1a919062004c13565b60008a815260046020908152604080832080547fffffff000000000000000000000000000000000000000000000000000000000016815560010180547fffffffff000000000000000000000000000000000000000000000000000000001690556007909152812091985062001a90919062003fb5565b6000898152601b6020526040812062001aa99162003fb5565b6000898152601c6020526040812062001ac29162003fb5565b600089815260066020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905562001b0360028a6200354f565b5060a0880151604080516bffffffffffffffffffffffff909216825273ffffffffffffffffffffffffffffffffffffffff8c1660208301528a917fb38647142fbb1ea4c000fc4569b37a4e9a9f6313317b84ee3e5326c1a6cd06ff910160405180910390a28062001b748162004c29565b9150506200159f565b508560195462001b8e919062004956565b60195560008b8b868167ffffffffffffffff81111562001bb25762001bb26200409d565b60405190808252806020026020018201604052801562001bdc578160200160208202803683370190505b508988888860405160200162001bfa98979695949392919062004dcf565b60405160208183030381529060405290508973ffffffffffffffffffffffffffffffffffffffff16638e86139b6014600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c71249ab60038e73ffffffffffffffffffffffffffffffffffffffff1663aab9edd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001cb6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001cdc919062004e9f565b866040518463ffffffff1660e01b815260040162001cfd9392919062004ec4565b600060405180830381865afa15801562001d1b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405262001d63919081019062004eeb565b6040518263ffffffff1660e01b815260040162001d819190620048f6565b600060405180830381600087803b15801562001d9c57600080fd5b505af115801562001db1573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d81166004830152602482018b90527f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb91506044016020604051808303816000875af115801562001e4b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e71919062004f24565b50505050505050505050505050565b6002336000908152601a602052604090205460ff16600381111562001ea95762001ea9620043b9565b1415801562001edf57506003336000908152601a602052604090205460ff16600381111562001edc5762001edc620043b9565b14155b1562001f17576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080808080808062001f2d888a018a6200511c565b965096509650965096509650965060005b8751811015620021fc57600073ffffffffffffffffffffffffffffffffffffffff1687828151811062001f755762001f7562004be4565b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff1603620020895785818151811062001fb25762001fb262004be4565b6020026020010151307f000000000000000000000000000000000000000000000000000000000000000060405162001fea9062003fa7565b73ffffffffffffffffffffffffffffffffffffffff938416815291831660208301529091166040820152606001604051809103906000f08015801562002034573d6000803e3d6000fd5b508782815181106200204a576200204a62004be4565b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b62002141888281518110620020a257620020a262004be4565b6020026020010151888381518110620020bf57620020bf62004be4565b6020026020010151878481518110620020dc57620020dc62004be4565b6020026020010151878581518110620020f957620020f962004be4565b602002602001015187868151811062002116576200211662004be4565b602002602001015187878151811062002133576200213362004be4565b602002602001015162002b60565b87818151811062002156576200215662004be4565b60200260200101517f74931a144e43a50694897f241d973aecb5024c0e910f9bb80a163ea3c1cf5a7188838151811062002194576200219462004be4565b602002602001015160a0015133604051620021df9291906bffffffffffffffffffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60405180910390a280620021f38162004c29565b91505062001f3e565b50505050505050505050565b600082815260046020908152604091829020825160e081018452815460ff81161515825263ffffffff6101008204811694830194909452650100000000008104841694820185905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004821660c0820152911462002306576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160a001516200231891906200524d565b600084815260046020526040902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff166c010000000000000000000000006bffffffffffffffffffffffff93841602179055601954620023809184169062004c13565b6019556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526bffffffffffffffffffffffff831660448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af11580156200242a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002450919062004f24565b506040516bffffffffffffffffffffffff83168152339084907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a3505050565b6000818152600460209081526040808320815160e081018352815460ff81161515825263ffffffff6101008204811695830195909552650100000000008104851693820184905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004831660c082015292911415906200258460005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16149050818015620025df5750808015620025dd5750620025d06200355d565b836040015163ffffffff16115b155b1562002617576040517ffbc0357800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801580156200264a575060008481526005602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b1562002682576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006200268e6200355d565b905081620026a657620026a360328262004c13565b90505b6000858152600460205260409020805463ffffffff80841665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff90921691909117909155620027029060029087906200354f16565b5060145460808501516bffffffffffffffffffffffff91821691600091168211156200276b57608086015162002739908362005275565b90508560a001516bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200276b575060a08501515b808660a001516200277d919062005275565b600088815260046020526040902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff166c010000000000000000000000006bffffffffffffffffffffffff93841602179055601554620027e5918391166200524d565b601580547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9290921691909117905560405167ffffffffffffffff84169088907f91cb3bb75cfbd718bbfccc56b7f53d92d7048ef4ca39a3b7b7c6d4af1f79118190600090a350505050505050565b600060606000806200287362002f4b565b6000634b56a42e60e01b88888860405160240162002894939291906200529d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506200291f89826200068d565b929c919b50995090975095505050505050565b6200293c62003619565b62002947816200369c565b50565b600060606000806000806000620029718860405180602001604052806000815250620009ff565b959e949d50929b5090995097509550909350915050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415155b90505b92915050565b6000806000620029e36001620029d16200355d565b620029dd919062004956565b62003793565b601554604080516020810193909352309083015274010000000000000000000000000000000000000000900463ffffffff166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060045b600f81101562002aef578282828151811062002aab5762002aab62004be4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508062002ae68162004c29565b91505062002a8b565b5083600181111562002b055762002b05620043b9565b60f81b81600f8151811062002b1e5762002b1e62004be4565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535062002b5881620052d1565b949350505050565b6012547e01000000000000000000000000000000000000000000000000000000000000900460ff161562002bc0576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601654835163ffffffff909116101562002c06576040517fae7235df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108fc856020015163ffffffff16108062002c445750601554602086015163ffffffff70010000000000000000000000000000000090920482169116115b1562002c7c576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868152600460205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff161562002ce6576040517f6e3b930b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868152600460209081526040808320885181548a8501518b85015160608d01517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009093169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff169390931761010063ffffffff92831602177fffffff000000000000000000000000000000000000000000000000ffffffffff1665010000000000938216939093027fffffff0000000000000000000000000000000000000000ffffffffffffffffff1692909217690100000000000000000073ffffffffffffffffffffffffffffffffffffffff9283160217835560808b01516001909301805460a08d015160c08e01516bffffffffffffffffffffffff9687167fffffffffffffffff000000000000000000000000000000000000000000000000909316929092176c010000000000000000000000009690911695909502949094177fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000009490931693909302919091179091556005835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556007909152902062002ed9848262005314565b508460a001516bffffffffffffffffffffffff1660195462002efc919062004c13565b6019556000868152601b6020526040902062002f19838262005314565b506000868152601c6020526040902062002f34828262005314565b5062002f42600287620038fb565b50505050505050565b321562002f84576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff16331462002fe4576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526004602052604090205465010000000000900463ffffffff9081161462002947576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818160045b600f811015620030d1577fff00000000000000000000000000000000000000000000000000000000000000821683826020811062003085576200308562004be4565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614620030bc57506000949350505050565b80620030c88162004c29565b91505062003043565b5081600f1a600181111562002b585762002b58620043b9565b6000806000836080015162ffffff1690506000808263ffffffff161190506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801562003177573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200319d919062005456565b5094509092505050600081131580620031b557508142105b80620031da5750828015620031da5750620031d1824262004956565b8463ffffffff16105b15620031eb576017549550620031ef565b8095505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156200325b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003281919062005456565b50945090925050506000811315806200329957508142105b80620032be5750828015620032be5750620032b5824262004956565b8463ffffffff16105b15620032cf576018549450620032d3565b8094505b50505050915091565b600080620032f088878b60c0015162003909565b90506000806200330d8b8a63ffffffff16858a8a60018b620039a8565b90925090506200331e81836200524d565b9b9a5050505050505050505050565b60606000836001811115620033465762003346620043b9565b0362003413576000848152600760205260409081902090517f6e04ff0d00000000000000000000000000000000000000000000000000000000916200338e916024016200554e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905062003548565b60018360018111156200342a576200342a620043b9565b036200351657600082806020019051810190620034489190620055c5565b6000868152600760205260409081902090519192507f40691db400000000000000000000000000000000000000000000000000000000916200348f918491602401620056d9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150620035489050565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6000620029b3838362003e4a565b600060017f00000000000000000000000000000000000000000000000000000000000000006002811115620035965762003596620043b9565b036200361457606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620035e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200360f9190620057a1565b905090565b504390565b60005473ffffffffffffffffffffffffffffffffffffffff16331462002f84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016200118a565b3373ffffffffffffffffffffffffffffffffffffffff8216036200371d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200118a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060017f00000000000000000000000000000000000000000000000000000000000000006002811115620037cc57620037cc620043b9565b03620038f1576000606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003821573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038479190620057a1565b9050808310158062003865575061010062003863848362004956565b115b15620038745750600092915050565b6040517f2b407a8200000000000000000000000000000000000000000000000000000000815260048101849052606490632b407a8290602401602060405180830381865afa158015620038cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035489190620057a1565b504090565b919050565b6000620029b3838362003f55565b60008080856001811115620039225762003922620043b9565b0362003933575062015f9062003956565b60018560018111156200394a576200394a620043b9565b036200351657506201adb05b6200396963ffffffff85166014620057bb565b62003976846001620057d5565b620039879060ff16611d4c620057bb565b62003993908362004c13565b6200399f919062004c13565b95945050505050565b60008060008960a0015161ffff1687620039c39190620057bb565b9050838015620039d25750803a105b15620039db57503a5b600060027f0000000000000000000000000000000000000000000000000000000000000000600281111562003a145762003a14620043b9565b0362003b8557604080516000815260208101909152851562003a785760003660405180608001604052806048815260200162005cc66048913960405160200162003a6193929190620057f1565b604051602081830303815290604052905062003ae6565b60165462003a9690640100000000900463ffffffff1660046200581a565b63ffffffff1667ffffffffffffffff81111562003ab75762003ab76200409d565b6040519080825280601f01601f19166020018201604052801562003ae2576020820181803683370190505b5090505b6040517f49948e0e00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000000f906349948e0e9062003b38908490600401620048f6565b602060405180830381865afa15801562003b56573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003b7c9190620057a1565b91505062003cef565b60017f0000000000000000000000000000000000000000000000000000000000000000600281111562003bbc5762003bbc620043b9565b0362003cef57841562003c4457606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003c16573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003c3c9190620057a1565b905062003cef565b6000606c73ffffffffffffffffffffffffffffffffffffffff166341b247a86040518163ffffffff1660e01b815260040160c060405180830381865afa15801562003c93573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003cb9919062005845565b505060165492945062003cde93505050640100000000900463ffffffff1682620057bb565b62003ceb906010620057bb565b9150505b8462003d0e57808b60a0015161ffff1662003d0b9190620057bb565b90505b62003d1e61ffff87168262005890565b90506000878262003d308c8e62004c13565b62003d3c9086620057bb565b62003d48919062004c13565b62003d5c90670de0b6b3a7640000620057bb565b62003d68919062005890565b905060008c6040015163ffffffff1664e8d4a5100062003d899190620057bb565b898e6020015163ffffffff16858f8862003da49190620057bb565b62003db0919062004c13565b62003dc090633b9aca00620057bb565b62003dcc9190620057bb565b62003dd8919062005890565b62003de4919062004c13565b90506b033b2e3c9fd0803ce800000062003dff828462004c13565b111562003e38576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b6000818152600183016020526040812054801562003f4357600062003e7160018362004956565b855490915060009062003e879060019062004956565b905081811462003ef357600086600001828154811062003eab5762003eab62004be4565b906000526020600020015490508087600001848154811062003ed15762003ed162004be4565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062003f075762003f07620058cc565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620029b6565b6000915050620029b6565b5092915050565b600081815260018301602052604081205462003f9e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620029b6565b506000620029b6565b6103ca80620058fc83390190565b50805462003fc39062004a14565b6000825580601f1062003fd4575050565b601f0160209004906000526020600020908101906200294791905b8082111562004005576000815560010162003fef565b5090565b73ffffffffffffffffffffffffffffffffffffffff811681146200294757600080fd5b803563ffffffff81168114620038f657600080fd5b803560028110620038f657600080fd5b60008083601f8401126200406457600080fd5b50813567ffffffffffffffff8111156200407d57600080fd5b6020830191508360208285010111156200409657600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715620040f257620040f26200409d565b60405290565b604051610100810167ffffffffffffffff81118282101715620040f257620040f26200409d565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156200416957620041696200409d565b604052919050565b600067ffffffffffffffff8211156200418e576200418e6200409d565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620041cc57600080fd5b8135620041e3620041dd8262004171565b6200411f565b818152846020838601011115620041f957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b0312156200423357600080fd5b8835620042408162004009565b97506200425060208a016200402c565b96506040890135620042628162004009565b95506200427260608a0162004041565b9450608089013567ffffffffffffffff808211156200429057600080fd5b6200429e8c838d0162004051565b909650945060a08b0135915080821115620042b857600080fd5b620042c68c838d01620041ba565b935060c08b0135915080821115620042dd57600080fd5b50620042ec8b828c01620041ba565b9150509295985092959890939650565b600080604083850312156200431057600080fd5b82359150602083013567ffffffffffffffff8111156200432f57600080fd5b6200433d85828601620041ba565b9150509250929050565b60005b83811015620043645781810151838201526020016200434a565b50506000910152565b600081518084526200438781602086016020860162004347565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600a811062004420577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b84151581526080602082015260006200444160808301866200436d565b9050620044526040830185620043e8565b82606083015295945050505050565b6000806000604084860312156200447757600080fd5b83359250602084013567ffffffffffffffff8111156200449657600080fd5b620044a48682870162004051565b9497909650939450505050565b600080600080600080600060a0888a031215620044cd57600080fd5b8735620044da8162004009565b9650620044ea602089016200402c565b95506040880135620044fc8162004009565b9450606088013567ffffffffffffffff808211156200451a57600080fd5b620045288b838c0162004051565b909650945060808a01359150808211156200454257600080fd5b50620045518a828b0162004051565b989b979a50959850939692959293505050565b871515815260e0602082015260006200458160e08301896200436d565b9050620045926040830188620043e8565b8560608301528460808301528360a08301528260c083015298975050505050505050565b600080600060408486031215620045cc57600080fd5b833567ffffffffffffffff80821115620045e557600080fd5b818601915086601f830112620045fa57600080fd5b8135818111156200460a57600080fd5b8760208260051b85010111156200462057600080fd5b60209283019550935050840135620046388162004009565b809150509250925092565b600080602083850312156200465757600080fd5b823567ffffffffffffffff8111156200466f57600080fd5b6200467d8582860162004051565b90969095509350505050565b80356bffffffffffffffffffffffff81168114620038f657600080fd5b60008060408385031215620046ba57600080fd5b82359150620046cc6020840162004689565b90509250929050565b600060208284031215620046e857600080fd5b5035919050565b600067ffffffffffffffff8211156200470c576200470c6200409d565b5060051b60200190565b600082601f8301126200472857600080fd5b813560206200473b620041dd83620046ef565b82815260059290921b840181019181810190868411156200475b57600080fd5b8286015b84811015620047a057803567ffffffffffffffff811115620047815760008081fd5b620047918986838b0101620041ba565b8452509183019183016200475f565b509695505050505050565b60008060008060608587031215620047c257600080fd5b84359350602085013567ffffffffffffffff80821115620047e257600080fd5b620047f08883890162004716565b945060408701359150808211156200480757600080fd5b50620048168782880162004051565b95989497509550505050565b6000602082840312156200483557600080fd5b8135620035488162004009565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff8083168181036200488d576200488d62004842565b6001019392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152600062002b5860208301848662004897565b602081526000620029b360208301846200436d565b8051620038f68162004009565b6000602082840312156200492b57600080fd5b8151620035488162004009565b600082516200494c81846020870162004347565b9190910192915050565b81810381811115620029b657620029b662004842565b80151581146200294757600080fd5b600082601f8301126200498d57600080fd5b81516200499e620041dd8262004171565b818152846020838601011115620049b457600080fd5b62002b5882602083016020870162004347565b60008060408385031215620049db57600080fd5b8251620049e8816200496c565b602084015190925067ffffffffffffffff81111562004a0657600080fd5b6200433d858286016200497b565b600181811c9082168062004a2957607f821691505b60208210810362004a63577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111562004ab757600081815260208120601f850160051c8101602086101562004a925750805b601f850160051c820191505b8181101562004ab35782815560010162004a9e565b5050505b505050565b67ffffffffffffffff83111562004ad75762004ad76200409d565b62004aef8362004ae8835462004a14565b8362004a69565b6000601f84116001811462004b44576000851562004b0d5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835562004bdd565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101562004b95578685013582556020948501946001909201910162004b73565b508682101562004bd1577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115620029b657620029b662004842565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362004c5d5762004c5d62004842565b5060010190565b600081518084526020808501945080840160005b8381101562004d235781518051151588528381015163ffffffff908116858a01526040808301519091169089015260608082015173ffffffffffffffffffffffffffffffffffffffff16908901526080808201516bffffffffffffffffffffffff169089015260a08082015162004cfe828b01826bffffffffffffffffffffffff169052565b505060c09081015163ffffffff169088015260e0909601959082019060010162004c78565b509495945050505050565b600081518084526020808501945080840160005b8381101562004d2357815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010162004d42565b600081518084526020808501808196508360051b8101915082860160005b8581101562004dc257828403895262004daf8483516200436d565b9885019893509084019060010162004d94565b5091979650505050505050565b60e081528760e082015260006101007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a111562004e0c57600080fd5b8960051b808c8386013783018381038201602085015262004e308282018b62004c64565b915050828103604084015262004e47818962004d2e565b9050828103606084015262004e5d818862004d2e565b9050828103608084015262004e73818762004d76565b905082810360a084015262004e89818662004d76565b905082810360c08401526200331e818562004d76565b60006020828403121562004eb257600080fd5b815160ff811681146200354857600080fd5b60ff8416815260ff831660208201526060604082015260006200399f60608301846200436d565b60006020828403121562004efe57600080fd5b815167ffffffffffffffff81111562004f1657600080fd5b62002b58848285016200497b565b60006020828403121562004f3757600080fd5b815162003548816200496c565b600082601f83011262004f5657600080fd5b8135602062004f69620041dd83620046ef565b82815260059290921b8401810191818101908684111562004f8957600080fd5b8286015b84811015620047a0578035835291830191830162004f8d565b600082601f83011262004fb857600080fd5b8135602062004fcb620041dd83620046ef565b82815260e0928302850182019282820191908785111562004feb57600080fd5b8387015b85811015620050a25781818a031215620050095760008081fd5b62005013620040cc565b813562005020816200496c565b81526200502f8287016200402c565b868201526040620050428184016200402c565b90820152606082810135620050578162004009565b9082015260806200506a83820162004689565b9082015260a06200507d83820162004689565b9082015260c0620050908382016200402c565b90820152845292840192810162004fef565b5090979650505050505050565b600082601f830112620050c157600080fd5b81356020620050d4620041dd83620046ef565b82815260059290921b84018101918181019086841115620050f457600080fd5b8286015b84811015620047a05780356200510e8162004009565b8352918301918301620050f8565b600080600080600080600060e0888a0312156200513857600080fd5b873567ffffffffffffffff808211156200515157600080fd5b6200515f8b838c0162004f44565b985060208a01359150808211156200517657600080fd5b620051848b838c0162004fa6565b975060408a01359150808211156200519b57600080fd5b620051a98b838c01620050af565b965060608a0135915080821115620051c057600080fd5b620051ce8b838c01620050af565b955060808a0135915080821115620051e557600080fd5b620051f38b838c0162004716565b945060a08a01359150808211156200520a57600080fd5b620052188b838c0162004716565b935060c08a01359150808211156200522f57600080fd5b506200523e8a828b0162004716565b91505092959891949750929550565b6bffffffffffffffffffffffff81811683821601908082111562003f4e5762003f4e62004842565b6bffffffffffffffffffffffff82811682821603908082111562003f4e5762003f4e62004842565b604081526000620052b2604083018662004d76565b8281036020840152620052c781858762004897565b9695505050505050565b8051602080830151919081101562004a63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b815167ffffffffffffffff8111156200533157620053316200409d565b620053498162005342845462004a14565b8462004a69565b602080601f8311600181146200539f5760008415620053685750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855562004ab3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015620053ee57888601518255948401946001909101908401620053cd565b50858210156200542b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b805169ffffffffffffffffffff81168114620038f657600080fd5b600080600080600060a086880312156200546f57600080fd5b6200547a866200543b565b94506020860151935060408601519250606086015191506200549f608087016200543b565b90509295509295909350565b60008154620054ba8162004a14565b808552602060018381168015620054da5760018114620055135762005543565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b890101955062005543565b866000528260002060005b858110156200553b5781548a82018601529083019084016200551e565b890184019650505b505050505092915050565b602081526000620029b36020830184620054ab565b600082601f8301126200557557600080fd5b8151602062005588620041dd83620046ef565b82815260059290921b84018101918181019086841115620055a857600080fd5b8286015b84811015620047a05780518352918301918301620055ac565b600060208284031215620055d857600080fd5b815167ffffffffffffffff80821115620055f157600080fd5b9083019061010082860312156200560757600080fd5b62005611620040f8565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201526200564b60a084016200490b565b60a082015260c0830151828111156200566357600080fd5b620056718782860162005563565b60c08301525060e0830151828111156200568a57600080fd5b62005698878286016200497b565b60e08301525095945050505050565b600081518084526020808501945080840160005b8381101562004d2357815187529582019590820190600101620056bb565b60408152825160408201526020830151606082015260408301516080820152606083015160a0820152608083015160c082015273ffffffffffffffffffffffffffffffffffffffff60a08401511660e0820152600060c08401516101008081850152506200574c610140840182620056a7565b905060e08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0848303016101208501526200578a82826200436d565b91505082810360208401526200399f8185620054ab565b600060208284031215620057b457600080fd5b5051919050565b8082028115828204841417620029b657620029b662004842565b60ff8181168382160190811115620029b657620029b662004842565b8284823760008382016000815283516200581081836020880162004347565b0195945050505050565b63ffffffff8181168382160280821691908281146200583d576200583d62004842565b505092915050565b60008060008060008060c087890312156200585f57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b600082620058c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe60c060405234801561001057600080fd5b506040516103ca3803806103ca83398101604081905261002f91610076565b600080546001600160a01b0319166001600160a01b039384161790559181166080521660a0526100b9565b80516001600160a01b038116811461007157600080fd5b919050565b60008060006060848603121561008b57600080fd5b6100948461005a565b92506100a26020850161005a565b91506100b06040850161005a565b90509250925092565b60805160a0516102e76100e36000396000603801526000818160c4015261011701526102e76000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806379188d161461007b578063f00e6a2a146100aa575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e808015610076573d6000f35b3d6000fd5b61008e6100893660046101c1565b6100ee565b6040805192151583526020830191909152015b60405180910390f35b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100a1565b60008054819073ffffffffffffffffffffffffffffffffffffffff16331461011557600080fd5b7f00000000000000000000000000000000000000000000000000000000000000005a91505a61138881101561014957600080fd5b61138881039050856040820482031161016157600080fd5b50803b61016d57600080fd5b6000808551602087016000858af192505a610188908361029a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156101d457600080fd5b82359150602083013567ffffffffffffffff808211156101f357600080fd5b818501915085601f83011261020757600080fd5b81358181111561021957610219610192565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561025f5761025f610192565b8160405282815288602084870101111561027857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b818103818111156102d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea164736f6c6343000813000a307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractAutomationRegistryLogicB2_2\",\"name\":\"logicB\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckDataExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfFaultyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrigger\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTriggerType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCheckDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxPerformDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByUpkeepPrivilegeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyUnpausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepCancelled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"AdminPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"CancelledUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newModule\",\"type\":\"address\"}],\"name\":\"ChainSpecificModuleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"DedupKeyAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"InsufficientFundsUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"PayeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"ReorgedUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"StaleUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"UpkeepCheckDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepOffchainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalPayment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasOverhead\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepTriggerConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepUnpaused\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"addFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"cancelUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"values\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"checkCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"enumAutomationRegistryBase2_2.UpkeepFailureReason\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"triggerData\",\"type\":\"bytes\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"enumAutomationRegistryBase2_2.UpkeepFailureReason\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"checkUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"enumAutomationRegistryBase2_2.UpkeepFailureReason\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fastGasWei\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"linkNative\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"}],\"name\":\"executeCallback\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"upkeepNeeded\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"},{\"internalType\":\"enumAutomationRegistryBase2_2.UpkeepFailureReason\",\"name\":\"upkeepFailureReason\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"migrateUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedUpkeeps\",\"type\":\"bytes\"}],\"name\":\"receiveUpkeeps\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"enumAutomationRegistryBase2_2.Trigger\",\"name\":\"triggerType\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"registerUpkeep\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"setUpkeepTriggerConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101406040523480156200001257600080fd5b5060405162005e7538038062005e758339810160408190526200003591620003b1565b80816001600160a01b031663ca30e6036040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b9190620003b1565b826001600160a01b031663b10b673c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001009190620003b1565b836001600160a01b0316636709d0e56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001659190620003b1565b846001600160a01b0316635425d8ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ca9190620003b1565b856001600160a01b031663a08714c06040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f9190620003b1565b3380600081620002865760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620002b957620002b981620002ed565b5050506001600160a01b0394851660805292841660a05290831660c052821660e052811661010052166101205250620003d8565b336001600160a01b03821603620003475760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200027d565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b0381168114620003ae57600080fd5b50565b600060208284031215620003c457600080fd5b8151620003d18162000398565b9392505050565b60805160a05160c05160e0516101005161012051615a386200043d6000396000818161010e01526101a90152600061313b0152600081816103e101526120130152600061332401526000613408015260008181611e5501526124210152615a386000f3fe60806040523480156200001157600080fd5b50600436106200010c5760003560e01c806385c1b0ba11620000a5578063c8048022116200006f578063c804802214620002b7578063ce7dc5b414620002ce578063f2fde38b14620002e5578063f7d334ba14620002fc576200010c565b806385c1b0ba14620002535780638da5cb5b146200026a5780638e86139b1462000289578063948108f714620002a0576200010c565b80634ee88d3511620000e75780634ee88d3514620001ef5780636ded9eae146200020657806371791aa0146200021d57806379ba50971462000249576200010c565b806328f32f38146200015457806329c5efad146200017e578063349e8cca14620001a7575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e8080156200014d573d6000f35b3d6000fd5b005b6200016b620001653660046200401b565b62000313565b6040519081526020015b60405180910390f35b620001956200018f36600462004101565b6200068d565b60405162000175949392919062004229565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000175565b620001526200020036600462004266565b62000931565b6200016b62000217366004620042b6565b62000999565b620002346200022e36600462004101565b620009ff565b60405162000175979695949392919062004369565b6200015262001162565b6200015262000264366004620043bb565b62001265565b60005473ffffffffffffffffffffffffffffffffffffffff16620001c9565b620001526200029a36600462004448565b62001ed6565b62000152620002b1366004620044ab565b6200225e565b62000152620002c8366004620044da565b620024f1565b62000195620002df366004620045b0565b6200293c565b62000152620002f636600462004627565b62002a02565b620002346200030d366004620044da565b62002a1a565b6000805473ffffffffffffffffffffffffffffffffffffffff1633148015906200034757506200034560093362002a58565b155b156200037f576040517fd48b678b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff89163b620003ce576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003d98662002a8c565b9050600089307f00000000000000000000000000000000000000000000000000000000000000006040516200040e9062003da7565b73ffffffffffffffffffffffffffffffffffffffff938416815291831660208301529091166040820152606001604051809103906000f08015801562000458573d6000803e3d6000fd5b5090506200051f826040518060e001604052806000151581526020018c63ffffffff16815260200163ffffffff801681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff168152602001600063ffffffff168152508a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915062002d389050565b6015805474010000000000000000000000000000000000000000900463ffffffff169060146200054f8362004676565b91906101000a81548163ffffffff021916908363ffffffff16021790555050817fbae366358c023f887e791d7a62f2e4316f1026bd77f6fb49501a917b3bc5d0128a8a604051620005c892919063ffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60405180910390a2817fcba2d5723b2ee59e53a8e8a82a4a7caf4fdfe70e9f7c582950bf7e7a5c24e83d878760405162000604929190620046e5565b60405180910390a2817f2b72ac786c97e68dbab71023ed6f2bdbfc80ad9bb7808941929229d71b7d5664856040516200063e9190620046fb565b60405180910390a2817f3e8740446213c8a77d40e08f79136ce3f347d13ed270a6ebdf57159e0faf485084604051620006789190620046fb565b60405180910390a25098975050505050505050565b600060606000806200069e62003123565b600086815260046020908152604091829020825160e081018452815460ff811615158252610100810463ffffffff90811694830194909452650100000000008104841694820194909452690100000000000000000090930473ffffffffffffffffffffffffffffffffffffffff166060840152600101546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a0840152780100000000000000000000000000000000000000000000000090041660c08201525a9150600080826060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007b8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007de91906200471d565b73ffffffffffffffffffffffffffffffffffffffff166014600101600c9054906101000a900463ffffffff1663ffffffff16896040516200082091906200473d565b60006040518083038160008787f1925050503d806000811462000860576040519150601f19603f3d011682016040523d82523d6000602084013e62000865565b606091505b50915091505a6200087790856200475b565b935081620008a257600060405180602001604052806000815250600796509650965050505062000928565b80806020019051810190620008b89190620047cc565b909750955086620008e657600060405180602001604052806000815250600496509650965050505062000928565b601654865164010000000090910463ffffffff1610156200092457600060405180602001604052806000815250600596509650965050505062000928565b5050505b92959194509250565b6200093c8362003195565b6000838152601b6020526040902062000957828483620048c1565b50827f2b72ac786c97e68dbab71023ed6f2bdbfc80ad9bb7808941929229d71b7d566483836040516200098c929190620046e5565b60405180910390a2505050565b6000620009f388888860008989604051806020016040528060008152508a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200031392505050565b98975050505050505050565b60006060600080600080600062000a1562003123565b600062000a228a6200324b565b905060006012604051806101600160405290816000820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160008201600c9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160189054906101000a900462ffffff1662ffffff1662ffffff16815260200160008201601b9054906101000a900461ffff1661ffff1661ffff16815260200160008201601d9054906101000a900460ff1660ff1660ff16815260200160008201601e9054906101000a900460ff1615151515815260200160008201601f9054906101000a900460ff161515151581526020016001820160009054906101000a900460ff161515151581526020016001820160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152505090506000600460008d81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160059054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160099054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160018201600c9054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090508160e001511562000db7576000604051806020016040528060008152506009600084602001516000808263ffffffff169250995099509950995099509950995050505062001156565b604081015163ffffffff9081161462000e08576000604051806020016040528060008152506001600084602001516000808263ffffffff169250995099509950995099509950995050505062001156565b80511562000e4e576000604051806020016040528060008152506002600084602001516000808263ffffffff169250995099509950995099509950995050505062001156565b62000e598262003301565b602083015160165492975090955060009162000e8b918591879190640100000000900463ffffffff168a8a87620034f3565b9050806bffffffffffffffffffffffff168260a001516bffffffffffffffffffffffff16101562000ef5576000604051806020016040528060008152506006600085602001516000808263ffffffff1692509a509a509a509a509a509a509a505050505062001156565b600062000f048e868f62003544565b90505a9850600080846060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000f5c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f8291906200471d565b73ffffffffffffffffffffffffffffffffffffffff166014600101600c9054906101000a900463ffffffff1663ffffffff168460405162000fc491906200473d565b60006040518083038160008787f1925050503d806000811462001004576040519150601f19603f3d011682016040523d82523d6000602084013e62001009565b606091505b50915091505a6200101b908c6200475b565b9a50816200109b5760165481516801000000000000000090910463ffffffff1610156200107857505060408051602080820190925260008082529490910151939c509a50600899505063ffffffff90911695506200115692505050565b602090940151939b5060039a505063ffffffff9092169650620011569350505050565b80806020019051810190620010b19190620047cc565b909e509c508d620010f257505060408051602080820190925260008082529490910151939c509a50600499505063ffffffff90911695506200115692505050565b6016548d5164010000000090910463ffffffff1610156200114357505060408051602080820190925260008082529490910151939c509a50600599505063ffffffff90911695506200115692505050565b505050506020015163ffffffff16945050505b92959891949750929550565b60015473ffffffffffffffffffffffffffffffffffffffff163314620011e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600173ffffffffffffffffffffffffffffffffffffffff82166000908152601a602052604090205460ff166003811115620012a457620012a4620041be565b14158015620012f05750600373ffffffffffffffffffffffffffffffffffffffff82166000908152601a602052604090205460ff166003811115620012ed57620012ed620041be565b14155b1562001328576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1662001388576040517fd12d7d8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000829003620013c4576040517f2c2fc94100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000808567ffffffffffffffff8111156200141b576200141b62003ea2565b60405190808252806020026020018201604052801562001445578160200160208202803683370190505b50905060008667ffffffffffffffff81111562001466576200146662003ea2565b604051908082528060200260200182016040528015620014ed57816020015b6040805160e08101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff909201910181620014855790505b50905060008767ffffffffffffffff8111156200150e576200150e62003ea2565b6040519080825280602002602001820160405280156200154357816020015b60608152602001906001900390816200152d5790505b50905060008867ffffffffffffffff81111562001564576200156462003ea2565b6040519080825280602002602001820160405280156200159957816020015b6060815260200190600190039081620015835790505b50905060008967ffffffffffffffff811115620015ba57620015ba62003ea2565b604051908082528060200260200182016040528015620015ef57816020015b6060815260200190600190039081620015d95790505b50905060005b8a81101562001bd3578b8b82818110620016135762001613620049e9565b60209081029290920135600081815260048452604090819020815160e081018352815460ff811615158252610100810463ffffffff90811697830197909752650100000000008104871693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff166060830152600101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490931660c08401529a50909850620016f290508962003195565b60608801516040517f1a5da6c800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c8116600483015290911690631a5da6c890602401600060405180830381600087803b1580156200176257600080fd5b505af115801562001777573d6000803e3d6000fd5b5050505087858281518110620017915762001791620049e9565b6020026020010181905250600560008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868281518110620017e557620017e5620049e9565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015260008a81526007909152604090208054620018249062004819565b80601f0160208091040260200160405190810160405280929190818152602001828054620018529062004819565b8015620018a35780601f106200187757610100808354040283529160200191620018a3565b820191906000526020600020905b8154815290600101906020018083116200188557829003601f168201915b5050505050848281518110620018bd57620018bd620049e9565b6020026020010181905250601b60008a81526020019081526020016000208054620018e89062004819565b80601f0160208091040260200160405190810160405280929190818152602001828054620019169062004819565b8015620019675780601f106200193b5761010080835404028352916020019162001967565b820191906000526020600020905b8154815290600101906020018083116200194957829003601f168201915b5050505050838281518110620019815762001981620049e9565b6020026020010181905250601c60008a81526020019081526020016000208054620019ac9062004819565b80601f0160208091040260200160405190810160405280929190818152602001828054620019da9062004819565b801562001a2b5780601f10620019ff5761010080835404028352916020019162001a2b565b820191906000526020600020905b81548152906001019060200180831162001a0d57829003601f168201915b505050505082828151811062001a455762001a45620049e9565b60200260200101819052508760a001516bffffffffffffffffffffffff168762001a70919062004a18565b60008a815260046020908152604080832080547fffffff000000000000000000000000000000000000000000000000000000000016815560010180547fffffffff000000000000000000000000000000000000000000000000000000001690556007909152812091985062001ae6919062003db5565b6000898152601b6020526040812062001aff9162003db5565b6000898152601c6020526040812062001b189162003db5565b600089815260066020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905562001b5960028a62003766565b5060a0880151604080516bffffffffffffffffffffffff909216825273ffffffffffffffffffffffffffffffffffffffff8c1660208301528a917fb38647142fbb1ea4c000fc4569b37a4e9a9f6313317b84ee3e5326c1a6cd06ff910160405180910390a28062001bca8162004a2e565b915050620015f5565b508560195462001be491906200475b565b60195560008b8b868167ffffffffffffffff81111562001c085762001c0862003ea2565b60405190808252806020026020018201604052801562001c32578160200160208202803683370190505b508988888860405160200162001c5098979695949392919062004bd4565b60405160208183030381529060405290508973ffffffffffffffffffffffffffffffffffffffff16638e86139b6014600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c71249ab60038e73ffffffffffffffffffffffffffffffffffffffff1663aab9edd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001d0c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001d32919062004ca4565b866040518463ffffffff1660e01b815260040162001d539392919062004cc9565b600060405180830381865afa15801562001d71573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405262001db9919081019062004cf0565b6040518263ffffffff1660e01b815260040162001dd79190620046fb565b600060405180830381600087803b15801562001df257600080fd5b505af115801562001e07573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d81166004830152602482018b90527f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb91506044016020604051808303816000875af115801562001ea1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001ec7919062004d29565b50505050505050505050505050565b6002336000908152601a602052604090205460ff16600381111562001eff5762001eff620041be565b1415801562001f3557506003336000908152601a602052604090205460ff16600381111562001f325762001f32620041be565b14155b1562001f6d576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080808080808062001f83888a018a62004f21565b965096509650965096509650965060005b87518110156200225257600073ffffffffffffffffffffffffffffffffffffffff1687828151811062001fcb5762001fcb620049e9565b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff1603620020df57858181518110620020085762002008620049e9565b6020026020010151307f0000000000000000000000000000000000000000000000000000000000000000604051620020409062003da7565b73ffffffffffffffffffffffffffffffffffffffff938416815291831660208301529091166040820152606001604051809103906000f0801580156200208a573d6000803e3d6000fd5b50878281518110620020a057620020a0620049e9565b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b62002197888281518110620020f857620020f8620049e9565b6020026020010151888381518110620021155762002115620049e9565b6020026020010151878481518110620021325762002132620049e9565b60200260200101518785815181106200214f576200214f620049e9565b60200260200101518786815181106200216c576200216c620049e9565b6020026020010151878781518110620021895762002189620049e9565b602002602001015162002d38565b878181518110620021ac57620021ac620049e9565b60200260200101517f74931a144e43a50694897f241d973aecb5024c0e910f9bb80a163ea3c1cf5a71888381518110620021ea57620021ea620049e9565b602002602001015160a0015133604051620022359291906bffffffffffffffffffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60405180910390a280620022498162004a2e565b91505062001f94565b50505050505050505050565b600082815260046020908152604091829020825160e081018452815460ff81161515825263ffffffff6101008204811694830194909452650100000000008104841694820185905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004821660c082015291146200235c576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160a001516200236e919062005052565b600084815260046020526040902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff166c010000000000000000000000006bffffffffffffffffffffffff93841602179055601954620023d69184169062004a18565b6019556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526bffffffffffffffffffffffff831660448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af115801562002480573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620024a6919062004d29565b506040516bffffffffffffffffffffffff83168152339084907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a3505050565b6000818152600460209081526040808320815160e081018352815460ff81161515825263ffffffff6101008204811695830195909552650100000000008104851693820184905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004831660c08201529291141590620025da60005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161490506000601260010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357e871e76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200267d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620026a391906200507a565b9050828015620026c75750818015620026c5575080846040015163ffffffff16115b155b15620026ff576040517ffbc0357800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8115801562002732575060008581526005602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b156200276a576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8162002780576200277d60328262004a18565b90505b6000858152600460205260409020805463ffffffff80841665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff90921691909117909155620027dc9060029087906200376616565b5060145460808501516bffffffffffffffffffffffff91821691600091168211156200284557608086015162002813908362005094565b90508560a001516bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562002845575060a08501515b808660a0015162002857919062005094565b600088815260046020526040902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff166c010000000000000000000000006bffffffffffffffffffffffff93841602179055601554620028bf9183911662005052565b601580547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9290921691909117905560405167ffffffffffffffff84169088907f91cb3bb75cfbd718bbfccc56b7f53d92d7048ef4ca39a3b7b7c6d4af1f79118190600090a350505050505050565b600060606000806000634b56a42e60e01b8888886040516024016200296493929190620050bc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529050620029ef89826200068d565b929c919b50995090975095505050505050565b62002a0c62003774565b62002a1781620037f7565b50565b60006060600080600080600062002a418860405180602001604052806000815250620009ff565b959e949d50929b5090995097509550909350915050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415155b90505b92915050565b6000806000601260010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166385df51fd60018473ffffffffffffffffffffffffffffffffffffffff166357e871e76040518163ffffffff1660e01b8152600401602060405180830381865afa15801562002b25573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002b4b91906200507a565b62002b5791906200475b565b6040518263ffffffff1660e01b815260040162002b7691815260200190565b602060405180830381865afa15801562002b94573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002bba91906200507a565b601554604080516020810193909352309083015274010000000000000000000000000000000000000000900463ffffffff166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060045b600f81101562002cc6578382828151811062002c825762002c82620049e9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508062002cbd8162004a2e565b91505062002c62565b5084600181111562002cdc5762002cdc620041be565b60f81b81600f8151811062002cf55762002cf5620049e9565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535062002d2f81620050f0565b95945050505050565b6012547e01000000000000000000000000000000000000000000000000000000000000900460ff161562002d98576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601654835163ffffffff909116101562002dde576040517fae7235df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108fc856020015163ffffffff16108062002e1c5750601554602086015163ffffffff70010000000000000000000000000000000090920482169116115b1562002e54576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868152600460205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff161562002ebe576040517f6e3b930b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868152600460209081526040808320885181548a8501518b85015160608d01517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009093169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff169390931761010063ffffffff92831602177fffffff000000000000000000000000000000000000000000000000ffffffffff1665010000000000938216939093027fffffff0000000000000000000000000000000000000000ffffffffffffffffff1692909217690100000000000000000073ffffffffffffffffffffffffffffffffffffffff9283160217835560808b01516001909301805460a08d015160c08e01516bffffffffffffffffffffffff9687167fffffffffffffffff000000000000000000000000000000000000000000000000909316929092176c010000000000000000000000009690911695909502949094177fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000009490931693909302919091179091556005835281842080547fffffffffffffffffffffffff00000000000000000000000000000000000000001691891691909117905560079091529020620030b1848262005133565b508460a001516bffffffffffffffffffffffff16601954620030d4919062004a18565b6019556000868152601b60205260409020620030f1838262005133565b506000868152601c602052604090206200310c828262005133565b506200311a600287620038ee565b50505050505050565b3273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161462003193576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff163314620031f3576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526004602052604090205465010000000000900463ffffffff9081161462002a17576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818160045b600f811015620032e0577fff000000000000000000000000000000000000000000000000000000000000008216838260208110620032945762003294620049e9565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614620032cb57506000949350505050565b80620032d78162004a2e565b91505062003252565b5081600f1a6001811115620032f957620032f9620041be565b949350505050565b6000806000836080015162ffffff1690506000808263ffffffff161190506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156200338e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620033b4919062005275565b5094509092505050600081131580620033cc57508142105b80620033f15750828015620033f15750620033e882426200475b565b8463ffffffff16105b156200340257601754955062003406565b8095505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801562003472573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003498919062005275565b5094509092505050600081131580620034b057508142105b80620034d55750828015620034d55750620034cc82426200475b565b8463ffffffff16105b15620034e6576018549450620034ea565b8094505b50505050915091565b6000806200350788878b60c00151620038fc565b9050600080620035248b8a63ffffffff16858a8a60018b62003992565b909250905062003535818362005052565b9b9a5050505050505050505050565b606060008360018111156200355d576200355d620041be565b036200362a576000848152600760205260409081902090517f6e04ff0d0000000000000000000000000000000000000000000000000000000091620035a5916024016200536d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506200375f565b6001836001811115620036415762003641620041be565b036200372d576000828060200190518101906200365f9190620053e4565b6000868152600760205260409081902090519192507f40691db40000000000000000000000000000000000000000000000000000000091620036a6918491602401620054f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915291506200375f9050565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b600062002a83838362003c4a565b60005473ffffffffffffffffffffffffffffffffffffffff16331462003193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401620011e0565b3373ffffffffffffffffffffffffffffffffffffffff82160362003878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620011e0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600062002a83838362003d55565b60008080856001811115620039155762003915620041be565b0362003926575062015f9062003949565b60018560018111156200393d576200393d620041be565b036200372d57506201af405b6200395c63ffffffff85166014620055c0565b62003969846001620055da565b6200397a9060ff16611d4c620055c0565b62003986908362004a18565b62002d2f919062004a18565b60008060008960a0015161ffff1687620039ad9190620055c0565b9050838015620039bc5750803a105b15620039c557503a5b6000841562003a4d578a610140015173ffffffffffffffffffffffffffffffffffffffff166318b8f6136040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003a1f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003a4591906200507a565b905062003b0e565b6101408b01516016546040517f1254414000000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff90911690631254414090602401602060405180830381865afa15801562003ad0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003af691906200507a565b8b60a0015161ffff1662003b0b9190620055c0565b90505b62003b1e61ffff871682620055f6565b90506000878262003b308c8e62004a18565b62003b3c9086620055c0565b62003b48919062004a18565b62003b5c90670de0b6b3a7640000620055c0565b62003b689190620055f6565b905060008c6040015163ffffffff1664e8d4a5100062003b899190620055c0565b898e6020015163ffffffff16858f8862003ba49190620055c0565b62003bb0919062004a18565b62003bc090633b9aca00620055c0565b62003bcc9190620055c0565b62003bd89190620055f6565b62003be4919062004a18565b90506b033b2e3c9fd0803ce800000062003bff828462004a18565b111562003c38576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b6000818152600183016020526040812054801562003d4357600062003c716001836200475b565b855490915060009062003c87906001906200475b565b905081811462003cf357600086600001828154811062003cab5762003cab620049e9565b906000526020600020015490508087600001848154811062003cd15762003cd1620049e9565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062003d075762003d0762005632565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062002a86565b600091505062002a86565b5092915050565b600081815260018301602052604081205462003d9e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562002a86565b50600062002a86565b6103ca806200566283390190565b50805462003dc39062004819565b6000825580601f1062003dd4575050565b601f01602090049060005260206000209081019062002a1791905b8082111562003e05576000815560010162003def565b5090565b73ffffffffffffffffffffffffffffffffffffffff8116811462002a1757600080fd5b803563ffffffff8116811462003e4157600080fd5b919050565b80356002811062003e4157600080fd5b60008083601f84011262003e6957600080fd5b50813567ffffffffffffffff81111562003e8257600080fd5b60208301915083602082850101111562003e9b57600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff8111828210171562003ef75762003ef762003ea2565b60405290565b604051610100810167ffffffffffffffff8111828210171562003ef75762003ef762003ea2565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171562003f6e5762003f6e62003ea2565b604052919050565b600067ffffffffffffffff82111562003f935762003f9362003ea2565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011262003fd157600080fd5b813562003fe862003fe28262003f76565b62003f24565b81815284602083860101111562003ffe57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b0312156200403857600080fd5b8835620040458162003e09565b97506200405560208a0162003e2c565b96506040890135620040678162003e09565b95506200407760608a0162003e46565b9450608089013567ffffffffffffffff808211156200409557600080fd5b620040a38c838d0162003e56565b909650945060a08b0135915080821115620040bd57600080fd5b620040cb8c838d0162003fbf565b935060c08b0135915080821115620040e257600080fd5b50620040f18b828c0162003fbf565b9150509295985092959890939650565b600080604083850312156200411557600080fd5b82359150602083013567ffffffffffffffff8111156200413457600080fd5b620041428582860162003fbf565b9150509250929050565b60005b83811015620041695781810151838201526020016200414f565b50506000910152565b600081518084526200418c8160208601602086016200414c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600a811062004225577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b841515815260806020820152600062004246608083018662004172565b9050620042576040830185620041ed565b82606083015295945050505050565b6000806000604084860312156200427c57600080fd5b83359250602084013567ffffffffffffffff8111156200429b57600080fd5b620042a98682870162003e56565b9497909650939450505050565b600080600080600080600060a0888a031215620042d257600080fd5b8735620042df8162003e09565b9650620042ef6020890162003e2c565b95506040880135620043018162003e09565b9450606088013567ffffffffffffffff808211156200431f57600080fd5b6200432d8b838c0162003e56565b909650945060808a01359150808211156200434757600080fd5b50620043568a828b0162003e56565b989b979a50959850939692959293505050565b871515815260e0602082015260006200438660e083018962004172565b9050620043976040830188620041ed565b8560608301528460808301528360a08301528260c083015298975050505050505050565b600080600060408486031215620043d157600080fd5b833567ffffffffffffffff80821115620043ea57600080fd5b818601915086601f830112620043ff57600080fd5b8135818111156200440f57600080fd5b8760208260051b85010111156200442557600080fd5b602092830195509350508401356200443d8162003e09565b809150509250925092565b600080602083850312156200445c57600080fd5b823567ffffffffffffffff8111156200447457600080fd5b620044828582860162003e56565b90969095509350505050565b80356bffffffffffffffffffffffff8116811462003e4157600080fd5b60008060408385031215620044bf57600080fd5b82359150620044d1602084016200448e565b90509250929050565b600060208284031215620044ed57600080fd5b5035919050565b600067ffffffffffffffff82111562004511576200451162003ea2565b5060051b60200190565b600082601f8301126200452d57600080fd5b813560206200454062003fe283620044f4565b82815260059290921b840181019181810190868411156200456057600080fd5b8286015b84811015620045a557803567ffffffffffffffff811115620045865760008081fd5b620045968986838b010162003fbf565b84525091830191830162004564565b509695505050505050565b60008060008060608587031215620045c757600080fd5b84359350602085013567ffffffffffffffff80821115620045e757600080fd5b620045f5888389016200451b565b945060408701359150808211156200460c57600080fd5b506200461b8782880162003e56565b95989497509550505050565b6000602082840312156200463a57600080fd5b81356200375f8162003e09565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff80831681810362004692576200469262004647565b6001019392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b602081526000620032f96020830184866200469c565b60208152600062002a83602083018462004172565b805162003e418162003e09565b6000602082840312156200473057600080fd5b81516200375f8162003e09565b60008251620047518184602087016200414c565b9190910192915050565b8181038181111562002a865762002a8662004647565b801515811462002a1757600080fd5b600082601f8301126200479257600080fd5b8151620047a362003fe28262003f76565b818152846020838601011115620047b957600080fd5b620032f98260208301602087016200414c565b60008060408385031215620047e057600080fd5b8251620047ed8162004771565b602084015190925067ffffffffffffffff8111156200480b57600080fd5b620041428582860162004780565b600181811c908216806200482e57607f821691505b60208210810362004868577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f821115620048bc57600081815260208120601f850160051c81016020861015620048975750805b601f850160051c820191505b81811015620048b857828155600101620048a3565b5050505b505050565b67ffffffffffffffff831115620048dc57620048dc62003ea2565b620048f483620048ed835462004819565b836200486e565b6000601f841160018114620049495760008515620049125750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355620049e2565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156200499a578685013582556020948501946001909201910162004978565b5086821015620049d6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8082018082111562002a865762002a8662004647565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362004a625762004a6262004647565b5060010190565b600081518084526020808501945080840160005b8381101562004b285781518051151588528381015163ffffffff908116858a01526040808301519091169089015260608082015173ffffffffffffffffffffffffffffffffffffffff16908901526080808201516bffffffffffffffffffffffff169089015260a08082015162004b03828b01826bffffffffffffffffffffffff169052565b505060c09081015163ffffffff169088015260e0909601959082019060010162004a7d565b509495945050505050565b600081518084526020808501945080840160005b8381101562004b2857815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010162004b47565b600081518084526020808501808196508360051b8101915082860160005b8581101562004bc757828403895262004bb484835162004172565b9885019893509084019060010162004b99565b5091979650505050505050565b60e081528760e082015260006101007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a111562004c1157600080fd5b8960051b808c8386013783018381038201602085015262004c358282018b62004a69565b915050828103604084015262004c4c818962004b33565b9050828103606084015262004c62818862004b33565b9050828103608084015262004c78818762004b7b565b905082810360a084015262004c8e818662004b7b565b905082810360c084015262003535818562004b7b565b60006020828403121562004cb757600080fd5b815160ff811681146200375f57600080fd5b60ff8416815260ff8316602082015260606040820152600062002d2f606083018462004172565b60006020828403121562004d0357600080fd5b815167ffffffffffffffff81111562004d1b57600080fd5b620032f98482850162004780565b60006020828403121562004d3c57600080fd5b81516200375f8162004771565b600082601f83011262004d5b57600080fd5b8135602062004d6e62003fe283620044f4565b82815260059290921b8401810191818101908684111562004d8e57600080fd5b8286015b84811015620045a5578035835291830191830162004d92565b600082601f83011262004dbd57600080fd5b8135602062004dd062003fe283620044f4565b82815260e0928302850182019282820191908785111562004df057600080fd5b8387015b8581101562004ea75781818a03121562004e0e5760008081fd5b62004e1862003ed1565b813562004e258162004771565b815262004e3482870162003e2c565b86820152604062004e4781840162003e2c565b9082015260608281013562004e5c8162003e09565b90820152608062004e6f8382016200448e565b9082015260a062004e828382016200448e565b9082015260c062004e9583820162003e2c565b90820152845292840192810162004df4565b5090979650505050505050565b600082601f83011262004ec657600080fd5b8135602062004ed962003fe283620044f4565b82815260059290921b8401810191818101908684111562004ef957600080fd5b8286015b84811015620045a557803562004f138162003e09565b835291830191830162004efd565b600080600080600080600060e0888a03121562004f3d57600080fd5b873567ffffffffffffffff8082111562004f5657600080fd5b62004f648b838c0162004d49565b985060208a013591508082111562004f7b57600080fd5b62004f898b838c0162004dab565b975060408a013591508082111562004fa057600080fd5b62004fae8b838c0162004eb4565b965060608a013591508082111562004fc557600080fd5b62004fd38b838c0162004eb4565b955060808a013591508082111562004fea57600080fd5b62004ff88b838c016200451b565b945060a08a01359150808211156200500f57600080fd5b6200501d8b838c016200451b565b935060c08a01359150808211156200503457600080fd5b50620050438a828b016200451b565b91505092959891949750929550565b6bffffffffffffffffffffffff81811683821601908082111562003d4e5762003d4e62004647565b6000602082840312156200508d57600080fd5b5051919050565b6bffffffffffffffffffffffff82811682821603908082111562003d4e5762003d4e62004647565b604081526000620050d1604083018662004b7b565b8281036020840152620050e68185876200469c565b9695505050505050565b8051602080830151919081101562004868577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b815167ffffffffffffffff81111562005150576200515062003ea2565b620051688162005161845462004819565b846200486e565b602080601f831160018114620051be5760008415620051875750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555620048b8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156200520d57888601518255948401946001909101908401620051ec565b50858210156200524a57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b805169ffffffffffffffffffff8116811462003e4157600080fd5b600080600080600060a086880312156200528e57600080fd5b62005299866200525a565b9450602086015193506040860151925060608601519150620052be608087016200525a565b90509295509295909350565b60008154620052d98162004819565b808552602060018381168015620052f95760018114620053325762005362565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b890101955062005362565b866000528260002060005b858110156200535a5781548a82018601529083019084016200533d565b890184019650505b505050505092915050565b60208152600062002a836020830184620052ca565b600082601f8301126200539457600080fd5b81516020620053a762003fe283620044f4565b82815260059290921b84018101918181019086841115620053c757600080fd5b8286015b84811015620045a55780518352918301918301620053cb565b600060208284031215620053f757600080fd5b815167ffffffffffffffff808211156200541057600080fd5b9083019061010082860312156200542657600080fd5b6200543062003efd565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201526200546a60a0840162004710565b60a082015260c0830151828111156200548257600080fd5b620054908782860162005382565b60c08301525060e083015182811115620054a957600080fd5b620054b78782860162004780565b60e08301525095945050505050565b600081518084526020808501945080840160005b8381101562004b2857815187529582019590820190600101620054da565b60408152825160408201526020830151606082015260408301516080820152606083015160a0820152608083015160c082015273ffffffffffffffffffffffffffffffffffffffff60a08401511660e0820152600060c08401516101008081850152506200556b610140840182620054c6565b905060e08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084830301610120850152620055a9828262004172565b915050828103602084015262002d2f8185620052ca565b808202811582820484141762002a865762002a8662004647565b60ff818116838216019081111562002a865762002a8662004647565b6000826200562d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe60c060405234801561001057600080fd5b506040516103ca3803806103ca83398101604081905261002f91610076565b600080546001600160a01b0319166001600160a01b039384161790559181166080521660a0526100b9565b80516001600160a01b038116811461007157600080fd5b919050565b60008060006060848603121561008b57600080fd5b6100948461005a565b92506100a26020850161005a565b91506100b06040850161005a565b90509250925092565b60805160a0516102e76100e36000396000603801526000818160c4015261011701526102e76000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806379188d161461007b578063f00e6a2a146100aa575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e808015610076573d6000f35b3d6000fd5b61008e6100893660046101c1565b6100ee565b6040805192151583526020830191909152015b60405180910390f35b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100a1565b60008054819073ffffffffffffffffffffffffffffffffffffffff16331461011557600080fd5b7f00000000000000000000000000000000000000000000000000000000000000005a91505a61138881101561014957600080fd5b61138881039050856040820482031161016157600080fd5b50803b61016d57600080fd5b6000808551602087016000858af192505a610188908361029a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156101d457600080fd5b82359150602083013567ffffffffffffffff808211156101f357600080fd5b818501915085601f83011261020757600080fd5b81358181111561021957610219610192565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561025f5761025f610192565b8160405282815288602084870101111561027857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b818103818111156102d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea164736f6c6343000813000aa164736f6c6343000813000a",
}
var AutomationRegistryLogicAABI = AutomationRegistryLogicAMetaData.ABI
@@ -639,6 +639,123 @@ func (_AutomationRegistryLogicA *AutomationRegistryLogicAFilterer) ParseCancelle
return event, nil
}
+type AutomationRegistryLogicAChainSpecificModuleUpdatedIterator struct {
+ Event *AutomationRegistryLogicAChainSpecificModuleUpdated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *AutomationRegistryLogicAChainSpecificModuleUpdatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(AutomationRegistryLogicAChainSpecificModuleUpdated)
+ 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(AutomationRegistryLogicAChainSpecificModuleUpdated)
+ 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 *AutomationRegistryLogicAChainSpecificModuleUpdatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *AutomationRegistryLogicAChainSpecificModuleUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type AutomationRegistryLogicAChainSpecificModuleUpdated struct {
+ NewModule common.Address
+ Raw types.Log
+}
+
+func (_AutomationRegistryLogicA *AutomationRegistryLogicAFilterer) FilterChainSpecificModuleUpdated(opts *bind.FilterOpts) (*AutomationRegistryLogicAChainSpecificModuleUpdatedIterator, error) {
+
+ logs, sub, err := _AutomationRegistryLogicA.contract.FilterLogs(opts, "ChainSpecificModuleUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &AutomationRegistryLogicAChainSpecificModuleUpdatedIterator{contract: _AutomationRegistryLogicA.contract, event: "ChainSpecificModuleUpdated", logs: logs, sub: sub}, nil
+}
+
+func (_AutomationRegistryLogicA *AutomationRegistryLogicAFilterer) WatchChainSpecificModuleUpdated(opts *bind.WatchOpts, sink chan<- *AutomationRegistryLogicAChainSpecificModuleUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _AutomationRegistryLogicA.contract.WatchLogs(opts, "ChainSpecificModuleUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(AutomationRegistryLogicAChainSpecificModuleUpdated)
+ if err := _AutomationRegistryLogicA.contract.UnpackLog(event, "ChainSpecificModuleUpdated", 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 (_AutomationRegistryLogicA *AutomationRegistryLogicAFilterer) ParseChainSpecificModuleUpdated(log types.Log) (*AutomationRegistryLogicAChainSpecificModuleUpdated, error) {
+ event := new(AutomationRegistryLogicAChainSpecificModuleUpdated)
+ if err := _AutomationRegistryLogicA.contract.UnpackLog(event, "ChainSpecificModuleUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
type AutomationRegistryLogicADedupKeyAddedIterator struct {
Event *AutomationRegistryLogicADedupKeyAdded
@@ -4446,6 +4563,8 @@ func (_AutomationRegistryLogicA *AutomationRegistryLogicA) ParseLog(log types.Lo
return _AutomationRegistryLogicA.ParseAdminPrivilegeConfigSet(log)
case _AutomationRegistryLogicA.abi.Events["CancelledUpkeepReport"].ID:
return _AutomationRegistryLogicA.ParseCancelledUpkeepReport(log)
+ case _AutomationRegistryLogicA.abi.Events["ChainSpecificModuleUpdated"].ID:
+ return _AutomationRegistryLogicA.ParseChainSpecificModuleUpdated(log)
case _AutomationRegistryLogicA.abi.Events["DedupKeyAdded"].ID:
return _AutomationRegistryLogicA.ParseDedupKeyAdded(log)
case _AutomationRegistryLogicA.abi.Events["FundsAdded"].ID:
@@ -4518,6 +4637,10 @@ func (AutomationRegistryLogicACancelledUpkeepReport) Topic() common.Hash {
return common.HexToHash("0xc3237c8807c467c1b39b8d0395eff077313e691bf0a7388106792564ebfd5636")
}
+func (AutomationRegistryLogicAChainSpecificModuleUpdated) Topic() common.Hash {
+ return common.HexToHash("0xdefc28b11a7980dbe0c49dbbd7055a1584bc8075097d1e8b3b57fb7283df2ad7")
+}
+
func (AutomationRegistryLogicADedupKeyAdded) Topic() common.Hash {
return common.HexToHash("0xa4a4e334c0e330143f9437484fe516c13bc560b86b5b0daf58e7084aaac228f2")
}
@@ -4683,6 +4806,12 @@ type AutomationRegistryLogicAInterface interface {
ParseCancelledUpkeepReport(log types.Log) (*AutomationRegistryLogicACancelledUpkeepReport, error)
+ FilterChainSpecificModuleUpdated(opts *bind.FilterOpts) (*AutomationRegistryLogicAChainSpecificModuleUpdatedIterator, error)
+
+ WatchChainSpecificModuleUpdated(opts *bind.WatchOpts, sink chan<- *AutomationRegistryLogicAChainSpecificModuleUpdated) (event.Subscription, error)
+
+ ParseChainSpecificModuleUpdated(log types.Log) (*AutomationRegistryLogicAChainSpecificModuleUpdated, error)
+
FilterDedupKeyAdded(opts *bind.FilterOpts, dedupKey [][32]byte) (*AutomationRegistryLogicADedupKeyAddedIterator, error)
WatchDedupKeyAdded(opts *bind.WatchOpts, sink chan<- *AutomationRegistryLogicADedupKeyAdded, dedupKey [][32]byte) (event.Subscription, error)
diff --git a/core/gethwrappers/generated/keeper_registry_logic_b_wrapper_2_2/keeper_registry_logic_b_wrapper_2_2.go b/core/gethwrappers/generated/keeper_registry_logic_b_wrapper_2_2/keeper_registry_logic_b_wrapper_2_2.go
index dcdb919d69c..d15bc458774 100644
--- a/core/gethwrappers/generated/keeper_registry_logic_b_wrapper_2_2/keeper_registry_logic_b_wrapper_2_2.go
+++ b/core/gethwrappers/generated/keeper_registry_logic_b_wrapper_2_2/keeper_registry_logic_b_wrapper_2_2.go
@@ -30,7 +30,7 @@ var (
_ = abi.ConvertType
)
-type AutomationRegistryBase22OnchainConfig struct {
+type AutomationRegistryBase22OnchainConfigLegacy struct {
PaymentPremiumPPB uint32
FlatFeeMicroLink uint32
CheckGasLimit uint32
@@ -46,7 +46,6 @@ type AutomationRegistryBase22OnchainConfig struct {
Transcoder common.Address
Registrars []common.Address
UpkeepPrivilegeManager common.Address
- ReorgProtectionEnabled bool
}
type AutomationRegistryBase22State struct {
@@ -76,15 +75,15 @@ type AutomationRegistryBase22UpkeepInfo struct {
}
var AutomationRegistryLogicBMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"enumAutomationRegistryBase2_2.Mode\",\"name\":\"mode\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fastGasFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"automationForwarderLogic\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckDataExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfFaultyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrigger\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTriggerType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCheckDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxPerformDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByUpkeepPrivilegeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyUnpausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepCancelled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"AdminPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"CancelledUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"DedupKeyAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"InsufficientFundsUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"PayeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"ReorgedUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"StaleUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"UpkeepCheckDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepOffchainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalPayment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasOverhead\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepTriggerConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepUnpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"name\":\"acceptPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"acceptUpkeepAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveUpkeepIDs\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"getAdminPrivilegeConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAutomationForwarderLogic\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCancellationDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConditionalGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFastGasFeedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepID\",\"type\":\"uint256\"}],\"name\":\"getForwarder\",\"outputs\":[{\"internalType\":\"contractIAutomationForwarder\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLinkAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLinkNativeFeedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLogGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enumAutomationRegistryBase2_2.Trigger\",\"name\":\"triggerType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"getMaxPaymentForGas\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"maxPayment\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalanceForUpkeep\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"minBalance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getMode\",\"outputs\":[{\"internalType\":\"enumAutomationRegistryBase2_2.Mode\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"}],\"name\":\"getPeerRegistryMigrationPermission\",\"outputs\":[{\"internalType\":\"enumAutomationRegistryBase2_2.MigrationPermission\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPerPerformByteGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPerSignerGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getSignerInfo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"ownerLinkBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"expectedLinkBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"totalPremium\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"numUpkeeps\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"latestConfigBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"latestConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"latestEpoch\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.State\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfig\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getTransmitterInfo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"lastCollected\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getTriggerType\",\"outputs\":[{\"internalType\":\"enumAutomationRegistryBase2_2.Trigger\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getUpkeep\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"maxValidBlocknumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"lastPerformedBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"amountSpent\",\"type\":\"uint96\"},{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structAutomationRegistryBase2_2.UpkeepInfo\",\"name\":\"upkeepInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getUpkeepPrivilegeConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getUpkeepTriggerConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"hasDedupKey\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"pauseUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"newPrivilegeConfig\",\"type\":\"bytes\"}],\"name\":\"setAdminPrivilegeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"setPayees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"},{\"internalType\":\"enumAutomationRegistryBase2_2.MigrationPermission\",\"name\":\"permission\",\"type\":\"uint8\"}],\"name\":\"setPeerRegistryMigrationPermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"setUpkeepCheckData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"setUpkeepGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"setUpkeepOffchainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"newPrivilegeConfig\",\"type\":\"bytes\"}],\"name\":\"setUpkeepPrivilegeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferUpkeepAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"unpauseUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upkeepTranscoderVersion\",\"outputs\":[{\"internalType\":\"enumUpkeepFormat\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upkeepVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawOwnerFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101206040523480156200001257600080fd5b5060405162005054380380620050548339810160408190526200003591620001e9565b84848484843380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c48162000121565b505050846002811115620000dc57620000dc6200025e565b60e0816002811115620000f357620000f36200025e565b9052506001600160a01b0393841660805291831660a052821660c05216610100525062000274945050505050565b336001600160a01b038216036200017b5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114620001e457600080fd5b919050565b600080600080600060a086880312156200020257600080fd5b8551600381106200021257600080fd5b94506200022260208701620001cc565b93506200023260408701620001cc565b92506200024260608701620001cc565b91506200025260808701620001cc565b90509295509295909350565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05160e05161010051614d55620002ff6000396000610587015260008181610525015281816134090152818161398c0152613b1f0152600081816105f401526131fd01526000818161071c01526132d70152600081816107aa01528181611c6701528181611f3c015281816123a5015281816128b8015261293c0152614d556000f3fe608060405234801561001057600080fd5b50600436106103365760003560e01c806379ba5097116101b2578063b121e147116100f9578063ca30e603116100a2578063eb5dcd6c1161007c578063eb5dcd6c146107f4578063ed56b3e114610807578063f2fde38b1461087a578063faa3e9961461088d57600080fd5b8063ca30e603146107a8578063cd7f71b5146107ce578063d7632648146107e157600080fd5b8063b657bc9c116100d3578063b657bc9c1461076d578063b79550be14610780578063c7c3a19a1461078857600080fd5b8063b121e14714610740578063b148ab6b14610753578063b6511a2a1461076657600080fd5b80638dcf0fe71161015b578063aab9edd611610135578063aab9edd614610703578063abc76ae014610712578063b10b673c1461071a57600080fd5b80638dcf0fe7146106ca578063a710b221146106dd578063a72aa27e146106f057600080fd5b80638456cb591161018c5780638456cb59146106915780638765ecbe146106995780638da5cb5b146106ac57600080fd5b806379ba50971461063e57806379ea9943146106465780637d9b97e01461068957600080fd5b8063421d183b116102815780635165f2f51161022a5780636209e1e9116102045780636209e1e9146105df5780636709d0e5146105f2578063671d36ed14610618578063744bfe611461062b57600080fd5b80635165f2f5146105725780635425d8ac146105855780635b6aa71c146105cc57600080fd5b80634b4fd03b1161025b5780634b4fd03b146105235780634ca16c52146105495780635147cd591461055257600080fd5b8063421d183b1461047a57806344cb70b8146104e057806348013d7b1461051357600080fd5b80631a2af011116102e3578063232c1cc5116102bd578063232c1cc5146104585780633b9cce591461045f5780633f4ba83a1461047257600080fd5b80631a2af011146103d45780631e010439146103e7578063207b65161461044557600080fd5b80631865c57d116103145780631865c57d14610388578063187256e8146103a157806319d97a94146103b457600080fd5b8063050ee65d1461033b57806306e3b632146103535780630b7d33e614610373575b600080fd5b6201adb05b6040519081526020015b60405180910390f35b610366610361366004613eaa565b6108d3565b60405161034a9190613ecc565b610386610381366004613f59565b6109f0565b005b610390610aaa565b60405161034a95949392919061416a565b6103866103af3660046142a1565b610f0e565b6103c76103c23660046142de565b610f7f565b60405161034a9190614365565b6103866103e2366004614378565b611021565b6104286103f53660046142de565b6000908152600460205260409020600101546c0100000000000000000000000090046bffffffffffffffffffffffff1690565b6040516bffffffffffffffffffffffff909116815260200161034a565b6103c76104533660046142de565b611127565b6014610340565b61038661046d36600461439d565b611144565b61038661139a565b61048d610488366004614412565b611400565b60408051951515865260ff90941660208601526bffffffffffffffffffffffff9283169385019390935216606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00161034a565b6105036104ee3660046142de565b60009081526008602052604090205460ff1690565b604051901515815260200161034a565b60005b60405161034a919061446e565b7f0000000000000000000000000000000000000000000000000000000000000000610516565b62015f90610340565b6105656105603660046142de565b61151f565b60405161034a9190614481565b6103866105803660046142de565b61152a565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034a565b6104286105da3660046144ae565b6116a1565b6103c76105ed366004614412565b611839565b7f00000000000000000000000000000000000000000000000000000000000000006105a7565b6103866106263660046144e7565b61186d565b610386610639366004614378565b611947565b610386611d62565b6105a76106543660046142de565b6000908152600460205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b610386611e64565b610386611fbf565b6103866106a73660046142de565b612040565b60005473ffffffffffffffffffffffffffffffffffffffff166105a7565b6103866106d8366004613f59565b6121ba565b6103866106eb366004614523565b61220f565b6103866106fe366004614551565b612477565b6040516003815260200161034a565b611d4c610340565b7f00000000000000000000000000000000000000000000000000000000000000006105a7565b61038661074e366004614412565b61256c565b6103866107613660046142de565b612664565b6032610340565b61042861077b3660046142de565b612852565b61038661287f565b61079b6107963660046142de565b6129db565b60405161034a9190614574565b7f00000000000000000000000000000000000000000000000000000000000000006105a7565b6103866107dc366004613f59565b612dae565b6104286107ef3660046142de565b612e45565b610386610802366004614523565b612e50565b610861610815366004614412565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602090815260409182902082518084019093525460ff8082161515808552610100909204169290910182905291565b60408051921515835260ff90911660208301520161034a565b610386610888366004614412565b612fae565b6108c661089b366004614412565b73ffffffffffffffffffffffffffffffffffffffff166000908152601a602052604090205460ff1690565b60405161034a91906146ab565b606060006108e16002612fc2565b905080841061091c576040517f1390f2a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061092884866146ee565b905081811180610936575083155b6109405780610942565b815b905060006109508683614701565b67ffffffffffffffff81111561096857610968614714565b604051908082528060200260200182016040528015610991578160200160208202803683370190505b50905060005b81518110156109e4576109b56109ad88836146ee565b600290612fcc565b8282815181106109c7576109c7614743565b6020908102919091010152806109dc81614772565b915050610997565b50925050505b92915050565b6016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610a51576040517f77c3599200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152601d60205260409020610a6a82848361484c565b50827f2fd8d70753a007014349d4591843cc031c2dd7a260d7dd82eca8253686ae77698383604051610a9d929190614967565b60405180910390a2505050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152604080516102008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526101c081018290526101e0810191909152604080516101408101825260155463ffffffff7401000000000000000000000000000000000000000082041682526bffffffffffffffffffffffff90811660208301526019549282019290925260125490911660608281019190915290819060009060808101610beb6002612fc2565b8152601554780100000000000000000000000000000000000000000000000080820463ffffffff9081166020808601919091527c01000000000000000000000000000000000000000000000000000000008404821660408087019190915260115460608088019190915260125474010000000000000000000000000000000000000000810485166080808a01919091527e01000000000000000000000000000000000000000000000000000000000000820460ff16151560a0998a01528351610200810185526c0100000000000000000000000080840488168252700100000000000000000000000000000000808504891697830197909752808a0488169582019590955296820462ffffff16928701929092527b01000000000000000000000000000000000000000000000000000000900461ffff16908501526014546bffffffffffffffffffffffff8116968501969096529304811660c083015260165480821660e08401526401000000008104821661010084015268010000000000000000900416610120820152601754610140820152601854610160820152910473ffffffffffffffffffffffffffffffffffffffff166101808201529095506101a08101610db86009612fdf565b81526016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260135460ff9081161515604093840152601254600d80548551818602810186019096528086529599508a958a959194600e947d01000000000000000000000000000000000000000000000000000000000090940490931692859190830182828015610e8d57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e62575b5050505050925081805480602002602001604051908101604052809291908181526020018280548015610ef657602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ecb575b50505050509150945094509450945094509091929394565b610f16612fec565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a6020526040902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115610f7657610f7661442f565b02179055505050565b6000818152601d60205260409020805460609190610f9c906147aa565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc8906147aa565b80156110155780601f10610fea57610100808354040283529160200191611015565b820191906000526020600020905b815481529060010190602001808311610ff857829003601f168201915b50505050509050919050565b61102a8261306f565b3373ffffffffffffffffffffffffffffffffffffffff821603611079576040517f8c8728c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff8281169116146111235760008281526006602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915590519091339185917fb1cbb2c4b8480034c27e06da5f096b8233a8fd4497028593a41ff6df79726b3591a45b5050565b6000818152601b60205260409020805460609190610f9c906147aa565b61114c612fec565b600e548114611187576040517fcf54c06a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600e54811015611359576000600e82815481106111a9576111a9614743565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116808452600f909252604083205491935016908585858181106111f3576111f3614743565b90506020020160208101906112089190614412565b905073ffffffffffffffffffffffffffffffffffffffff8116158061129b575073ffffffffffffffffffffffffffffffffffffffff82161580159061127957508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b801561129b575073ffffffffffffffffffffffffffffffffffffffff81811614155b156112d2576040517fb387a23800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff818116146113435773ffffffffffffffffffffffffffffffffffffffff8381166000908152600f6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169183169190911790555b505050808061135190614772565b91505061118a565b507fa46de38886467c59be07a0675f14781206a5477d871628af46c2443822fcb725600e838360405161138e939291906149b4565b60405180910390a15050565b6113a2612fec565b601280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e0100000000000000000000000000009004909116606082015282918291829182919082906114c65760608201516012546000916114b2916bffffffffffffffffffffffff16614a66565b600e549091506114c29082614aba565b9150505b8151602083015160408401516114dd908490614ae5565b6060949094015173ffffffffffffffffffffffffffffffffffffffff9a8b166000908152600f6020526040902054929b919a9499509750921694509092505050565b60006109ea82613123565b6115338161306f565b600081815260046020908152604091829020825160e081018452815460ff8116151580835263ffffffff610100830481169584019590955265010000000000820485169583019590955273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290611632576040517f1b88a78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556116716002836131ce565b5060405182907f7bada562044eb163f6b4003c4553e4e62825344c0418eea087bed5ee05a4745690600090a25050565b60408051610140810182526012546bffffffffffffffffffffffff8116825263ffffffff6c010000000000000000000000008204811660208401527001000000000000000000000000000000008204811693830193909352740100000000000000000000000000000000000000008104909216606082015262ffffff7801000000000000000000000000000000000000000000000000830416608082015261ffff7b0100000000000000000000000000000000000000000000000000000083041660a082015260ff7d0100000000000000000000000000000000000000000000000000000000008304811660c08301527e0100000000000000000000000000000000000000000000000000000000000083048116151560e08301527f01000000000000000000000000000000000000000000000000000000000000009092048216151561010082015260135490911615156101208201526000908180611806836131da565b9150915061182f838787601460020160049054906101000a900463ffffffff16868660006133b8565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601e60205260409020805460609190610f9c906147aa565b6016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146118ce576040517f77c3599200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152601e602052604090206118fe82848361484c565b508273ffffffffffffffffffffffffffffffffffffffff167f7c44b4eb59ee7873514e7e43e7718c269d872965938b288aa143befca62f99d28383604051610a9d929190614967565b6012547f0100000000000000000000000000000000000000000000000000000000000000900460ff16156119a7576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8116611a3d576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600460209081526040808320815160e081018352815460ff81161515825263ffffffff610100820481168387015265010000000000820481168386015273ffffffffffffffffffffffffffffffffffffffff6901000000000000000000909204821660608401526001909301546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a08401527801000000000000000000000000000000000000000000000000900490921660c082015286855260059093529220549091163314611b44576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b4c613403565b816040015163ffffffff161115611b8f576040517fff84e5dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600460205260409020600101546019546c010000000000000000000000009091046bffffffffffffffffffffffff1690611bcf908290614701565b60195560008481526004602081905260409182902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff16905590517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116928201929092526bffffffffffffffffffffffff831660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015611cb2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd69190614b0a565b50604080516bffffffffffffffffffffffff8316815273ffffffffffffffffffffffffffffffffffffffff8516602082015285917ff3b5906e5672f3e524854103bcafbbdba80dbdfeca2c35e116127b1060a68318910160405180910390a25050601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611e6c612fec565b6015546019546bffffffffffffffffffffffff90911690611e8e908290614701565b601955601580547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690556040516bffffffffffffffffffffffff821681527f1d07d0b0be43d3e5fee41a80b579af370affee03fa595bf56d5d4c19328162f19060200160405180910390a16040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526bffffffffffffffffffffffff821660248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044015b6020604051808303816000875af1158015611f9b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111239190614b0a565b611fc7612fec565b601280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016113f6565b6120498161306f565b600081815260046020908152604091829020825160e081018452815460ff8116158015835263ffffffff610100830481169584019590955265010000000000820485169583019590955273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290612148576040517f514b6c2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561218a6002836134b8565b5060405182907f8ab10247ce168c27748e656ecf852b951fcaac790c18106b19aa0ae57a8b741f90600090a25050565b6121c38361306f565b6000838152601c602052604090206121dc82848361484c565b50827f3e8740446213c8a77d40e08f79136ce3f347d13ed270a6ebdf57159e0faf48508383604051610a9d929190614967565b73ffffffffffffffffffffffffffffffffffffffff811661225c576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600f60205260409020541633146122bc576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254600e546000916122df9185916bffffffffffffffffffffffff16906134c4565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff169055601954909150612349906bffffffffffffffffffffffff831690614701565b6019556040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526bffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156123ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124129190614b0a565b5060405133815273ffffffffffffffffffffffffffffffffffffffff808416916bffffffffffffffffffffffff8416918616907f9819093176a1851202c7bcfa46845809b4e47c261866550e94ed3775d2f406989060200160405180910390a4505050565b6108fc8163ffffffff1610806124ac575060155463ffffffff7001000000000000000000000000000000009091048116908216115b156124e3576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124ec8261306f565b60008281526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1661010063ffffffff861690810291909117909155915191825283917fc24c07e655ce79fba8a589778987d3c015bc6af1632bb20cf9182e02a65d972c910160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152601060205260409020541633146125cc576040517f6752e7aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600f602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556010909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b600081815260046020908152604091829020825160e081018452815460ff81161515825263ffffffff6101008204811694830194909452650100000000008104841694820185905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004821660c08201529114612761576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1633146127be576040517f6352a85300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526005602090815260408083208054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821790935560069094528285208054909216909155905173ffffffffffffffffffffffffffffffffffffffff90911692839186917f5cff4db96bef051785e999f44bfcd21c18823e034fb92dd376e3db4ce0feeb2c91a4505050565b60006109ea61286083613123565b600084815260046020526040902054610100900463ffffffff166116a1565b612887612fec565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612914573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129389190614b2c565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33601954846129859190614701565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401611f7c565b604080516101408101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c0820181905260e082018190526101008201526101208101919091526000828152600460209081526040808320815160e081018352815460ff811615158252610100810463ffffffff90811695830195909552650100000000008104851693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff16606083018190526001909101546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a08401527801000000000000000000000000000000000000000000000000900490921660c0820152919015612b7357816060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b6e9190614b45565b612b76565b60005b90506040518061014001604052808273ffffffffffffffffffffffffffffffffffffffff168152602001836020015163ffffffff168152602001600760008781526020019081526020016000208054612bce906147aa565b80601f0160208091040260200160405190810160405280929190818152602001828054612bfa906147aa565b8015612c475780601f10612c1c57610100808354040283529160200191612c47565b820191906000526020600020905b815481529060010190602001808311612c2a57829003601f168201915b505050505081526020018360a001516bffffffffffffffffffffffff1681526020016005600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836040015163ffffffff1667ffffffffffffffff1681526020018360c0015163ffffffff16815260200183608001516bffffffffffffffffffffffff168152602001836000015115158152602001601c60008781526020019081526020016000208054612d24906147aa565b80601f0160208091040260200160405190810160405280929190818152602001828054612d50906147aa565b8015612d9d5780601f10612d7257610100808354040283529160200191612d9d565b820191906000526020600020905b815481529060010190602001808311612d8057829003601f168201915b505050505081525092505050919050565b612db78361306f565b60165463ffffffff16811115612df9576040517fae7235df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600760205260409020612e1282848361484c565b50827fcba2d5723b2ee59e53a8e8a82a4a7caf4fdfe70e9f7c582950bf7e7a5c24e83d8383604051610a9d929190614967565b60006109ea82612852565b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600f6020526040902054163314612eb0576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612eff576040517f8c8728c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152601060205260409020548116908216146111235773ffffffffffffffffffffffffffffffffffffffff82811660008181526010602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055513392917f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836791a45050565b612fb6612fec565b612fbf816136cc565b50565b60006109ea825490565b6000612fd883836137c1565b9392505050565b60606000612fd8836137eb565b60005473ffffffffffffffffffffffffffffffffffffffff16331461306d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401611ddf565b565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633146130cc576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526004602052604090205465010000000000900463ffffffff90811614612fbf576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818160045b600f8110156131b0577fff00000000000000000000000000000000000000000000000000000000000000821683826020811061316857613168614743565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461319e57506000949350505050565b806131a881614772565b91505061312a565b5081600f1a60018111156131c6576131c661442f565b949350505050565b6000612fd88383613846565b6000806000836080015162ffffff1690506000808263ffffffff161190506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613266573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328a9190614b7c565b50945090925050506000811315806132a157508142105b806132c257508280156132c257506132b98242614701565b8463ffffffff16105b156132d15760175495506132d5565b8095505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613340573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133649190614b7c565b509450909250505060008113158061337b57508142105b8061339c575082801561339c57506133938242614701565b8463ffffffff16105b156133ab5760185494506133af565b8094505b50505050915091565b6000806133ca88878b60c00151613895565b90506000806133e58b8a63ffffffff16858a8a60018b613957565b90925090506133f48183614ae5565b9b9a5050505050505050505050565b600060017f000000000000000000000000000000000000000000000000000000000000000060028111156134395761343961442f565b036134b357606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561348a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134ae9190614b2c565b905090565b504390565b6000612fd88383613db0565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e01000000000000000000000000000090049091166060820152906136c057600081606001518561355c9190614a66565b9050600061356a8583614aba565b9050808360400181815161357e9190614ae5565b6bffffffffffffffffffffffff169052506135998582614bcc565b836060018181516135aa9190614ae5565b6bffffffffffffffffffffffff90811690915273ffffffffffffffffffffffffffffffffffffffff89166000908152600b602090815260409182902087518154928901519389015160608a015186166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff919096166201000002167fffffffffffff000000000000000000000000000000000000000000000000ffff60ff95909516610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909416939093171792909216179190911790555050505b60400151949350505050565b3373ffffffffffffffffffffffffffffffffffffffff82160361374b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401611ddf565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008260000182815481106137d8576137d8614743565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561101557602002820191906000526020600020905b8154815260200190600101908083116138275750505050509050919050565b600081815260018301602052604081205461388d575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556109ea565b5060006109ea565b600080808560018111156138ab576138ab61442f565b036138ba575062015f9061390f565b60018560018111156138ce576138ce61442f565b036138dd57506201adb061390f565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61392063ffffffff85166014614bfc565b61392b846001614c13565b61393a9060ff16611d4c614bfc565b61394490836146ee565b61394e91906146ee565b95945050505050565b60008060008960a0015161ffff16876139709190614bfc565b905083801561397e5750803a105b1561398657503a5b600060027f000000000000000000000000000000000000000000000000000000000000000060028111156139bc576139bc61442f565b03613b1b576040805160008152602081019091528515613a1a57600036604051806080016040528060488152602001614d0160489139604051602001613a0493929190614c2c565b6040516020818303038152906040529050613a82565b601654613a3690640100000000900463ffffffff166004614c53565b63ffffffff1667ffffffffffffffff811115613a5457613a54614714565b6040519080825280601f01601f191660200182016040528015613a7e576020820181803683370190505b5090505b6040517f49948e0e00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000000f906349948e0e90613ad2908490600401614365565b602060405180830381865afa158015613aef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b139190614b2c565b915050613c75565b60017f00000000000000000000000000000000000000000000000000000000000000006002811115613b4f57613b4f61442f565b03613c75578415613bd157606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613ba6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bca9190614b2c565b9050613c75565b6000606c73ffffffffffffffffffffffffffffffffffffffff166341b247a86040518163ffffffff1660e01b815260040160c060405180830381865afa158015613c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c439190614c73565b5050601654929450613c6693505050640100000000900463ffffffff1682614bfc565b613c71906010614bfc565b9150505b84613c9157808b60a0015161ffff16613c8e9190614bfc565b90505b613c9f61ffff871682614cbd565b905060008782613caf8c8e6146ee565b613cb99086614bfc565b613cc391906146ee565b613cd590670de0b6b3a7640000614bfc565b613cdf9190614cbd565b905060008c6040015163ffffffff1664e8d4a51000613cfe9190614bfc565b898e6020015163ffffffff16858f88613d179190614bfc565b613d2191906146ee565b613d2f90633b9aca00614bfc565b613d399190614bfc565b613d439190614cbd565b613d4d91906146ee565b90506b033b2e3c9fd0803ce8000000613d6682846146ee565b1115613d9e576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b60008181526001830160205260408120548015613e99576000613dd4600183614701565b8554909150600090613de890600190614701565b9050818114613e4d576000866000018281548110613e0857613e08614743565b9060005260206000200154905080876000018481548110613e2b57613e2b614743565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613e5e57613e5e614cd1565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506109ea565b60009150506109ea565b5092915050565b60008060408385031215613ebd57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015613f0457835183529284019291840191600101613ee8565b50909695505050505050565b60008083601f840112613f2257600080fd5b50813567ffffffffffffffff811115613f3a57600080fd5b602083019150836020828501011115613f5257600080fd5b9250929050565b600080600060408486031215613f6e57600080fd5b83359250602084013567ffffffffffffffff811115613f8c57600080fd5b613f9886828701613f10565b9497909650939450505050565b600081518084526020808501945080840160005b83811015613feb57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613fb9565b509495945050505050565b805163ffffffff1682526000610200602083015161401c602086018263ffffffff169052565b506040830151614034604086018263ffffffff169052565b50606083015161404b606086018262ffffff169052565b506080830151614061608086018261ffff169052565b5060a083015161408160a08601826bffffffffffffffffffffffff169052565b5060c083015161409960c086018263ffffffff169052565b5060e08301516140b160e086018263ffffffff169052565b506101008381015163ffffffff908116918601919091526101208085015190911690850152610140808401519085015261016080840151908501526101808084015173ffffffffffffffffffffffffffffffffffffffff16908501526101a08084015181860183905261412683870182613fa5565b925050506101c0808401516141528287018273ffffffffffffffffffffffffffffffffffffffff169052565b50506101e09283015115159390920192909252919050565b855163ffffffff16815260006101c0602088015161419860208501826bffffffffffffffffffffffff169052565b506040880151604084015260608801516141c260608501826bffffffffffffffffffffffff169052565b506080880151608084015260a08801516141e460a085018263ffffffff169052565b5060c08801516141fc60c085018263ffffffff169052565b5060e088015160e08401526101008089015161421f8286018263ffffffff169052565b505061012088810151151590840152610140830181905261424281840188613ff6565b90508281036101608401526142578187613fa5565b905082810361018084015261426c8186613fa5565b91505061182f6101a083018460ff169052565b73ffffffffffffffffffffffffffffffffffffffff81168114612fbf57600080fd5b600080604083850312156142b457600080fd5b82356142bf8161427f565b91506020830135600481106142d357600080fd5b809150509250929050565b6000602082840312156142f057600080fd5b5035919050565b60005b838110156143125781810151838201526020016142fa565b50506000910152565b600081518084526143338160208601602086016142f7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000612fd8602083018461431b565b6000806040838503121561438b57600080fd5b8235915060208301356142d38161427f565b600080602083850312156143b057600080fd5b823567ffffffffffffffff808211156143c857600080fd5b818501915085601f8301126143dc57600080fd5b8135818111156143eb57600080fd5b8660208260051b850101111561440057600080fd5b60209290920196919550909350505050565b60006020828403121561442457600080fd5b8135612fd88161427f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110612fbf57612fbf61442f565b6020810161447b8361445e565b91905290565b602081016002831061447b5761447b61442f565b803563ffffffff811681146144a957600080fd5b919050565b600080604083850312156144c157600080fd5b8235600281106144d057600080fd5b91506144de60208401614495565b90509250929050565b6000806000604084860312156144fc57600080fd5b83356145078161427f565b9250602084013567ffffffffffffffff811115613f8c57600080fd5b6000806040838503121561453657600080fd5b82356145418161427f565b915060208301356142d38161427f565b6000806040838503121561456457600080fd5b823591506144de60208401614495565b6020815261459b60208201835173ffffffffffffffffffffffffffffffffffffffff169052565b600060208301516145b4604084018263ffffffff169052565b5060408301516101408060608501526145d161016085018361431b565b915060608501516145f260808601826bffffffffffffffffffffffff169052565b50608085015173ffffffffffffffffffffffffffffffffffffffff811660a08601525060a085015167ffffffffffffffff811660c08601525060c085015163ffffffff811660e08601525060e085015161010061465e818701836bffffffffffffffffffffffff169052565b86015190506101206146738682018315159052565b8601518584037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183870152905061182f838261431b565b602081016004831061447b5761447b61442f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808201808211156109ea576109ea6146bf565b818103818111156109ea576109ea6146bf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147a3576147a36146bf565b5060010190565b600181811c908216806147be57607f821691505b6020821081036147f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561484757600081815260208120601f850160051c810160208610156148245750805b601f850160051c820191505b8181101561484357828155600101614830565b5050505b505050565b67ffffffffffffffff83111561486457614864614714565b6148788361487283546147aa565b836147fd565b6000601f8411600181146148ca57600085156148945750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614960565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561491957868501358255602094850194600190920191016148f9565b5086821015614954577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6000604082016040835280865480835260608501915087600052602092508260002060005b82811015614a0b57815473ffffffffffffffffffffffffffffffffffffffff16845292840192600191820191016149d9565b505050838103828501528481528590820160005b86811015614a5a578235614a328161427f565b73ffffffffffffffffffffffffffffffffffffffff1682529183019190830190600101614a1f565b50979650505050505050565b6bffffffffffffffffffffffff828116828216039080821115613ea357613ea36146bf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006bffffffffffffffffffffffff80841680614ad957614ad9614a8b565b92169190910492915050565b6bffffffffffffffffffffffff818116838216019080821115613ea357613ea36146bf565b600060208284031215614b1c57600080fd5b81518015158114612fd857600080fd5b600060208284031215614b3e57600080fd5b5051919050565b600060208284031215614b5757600080fd5b8151612fd88161427f565b805169ffffffffffffffffffff811681146144a957600080fd5b600080600080600060a08688031215614b9457600080fd5b614b9d86614b62565b9450602086015193506040860151925060608601519150614bc060808701614b62565b90509295509295909350565b6bffffffffffffffffffffffff818116838216028082169190828114614bf457614bf46146bf565b505092915050565b80820281158282048414176109ea576109ea6146bf565b60ff81811683821601908111156109ea576109ea6146bf565b828482376000838201600081528351614c498183602088016142f7565b0195945050505050565b63ffffffff818116838216028082169190828114614bf457614bf46146bf565b60008060008060008060c08789031215614c8c57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b600082614ccc57614ccc614a8b565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fastGasFeed\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"automationForwarderLogic\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"allowedReadOnlyAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckDataExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfFaultyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrigger\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTriggerType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCheckDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxPerformDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByUpkeepPrivilegeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyUnpausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepCancelled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"AdminPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"CancelledUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newModule\",\"type\":\"address\"}],\"name\":\"ChainSpecificModuleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"DedupKeyAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"InsufficientFundsUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"PayeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"ReorgedUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"StaleUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"UpkeepCheckDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepOffchainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalPayment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasOverhead\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepTriggerConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepUnpaused\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"}],\"name\":\"acceptPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"acceptUpkeepAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveUpkeepIDs\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"getAdminPrivilegeConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowedReadOnlyAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAutomationForwarderLogic\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCancellationDelay\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainModule\",\"outputs\":[{\"internalType\":\"contractIChainModule\",\"name\":\"chainModule\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getConditionalGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFastGasFeedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepID\",\"type\":\"uint256\"}],\"name\":\"getForwarder\",\"outputs\":[{\"internalType\":\"contractIAutomationForwarder\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLinkAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLinkNativeFeedAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLogGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"enumAutomationRegistryBase2_2.Trigger\",\"name\":\"triggerType\",\"type\":\"uint8\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"getMaxPaymentForGas\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"maxPayment\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getMinBalanceForUpkeep\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"minBalance\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"}],\"name\":\"getPeerRegistryMigrationPermission\",\"outputs\":[{\"internalType\":\"enumAutomationRegistryBase2_2.MigrationPermission\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPerPerformByteGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPerSignerGasOverhead\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getReorgProtectionEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getSignerInfo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"nonce\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"ownerLinkBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"expectedLinkBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"totalPremium\",\"type\":\"uint96\"},{\"internalType\":\"uint256\",\"name\":\"numUpkeeps\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"latestConfigBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"latestConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"latestEpoch\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.State\",\"name\":\"state\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfigLegacy\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"query\",\"type\":\"address\"}],\"name\":\"getTransmitterInfo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"active\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"lastCollected\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getTriggerType\",\"outputs\":[{\"internalType\":\"enumAutomationRegistryBase2_2.Trigger\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getUpkeep\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"checkData\",\"type\":\"bytes\"},{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"maxValidBlocknumber\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"lastPerformedBlockNumber\",\"type\":\"uint32\"},{\"internalType\":\"uint96\",\"name\":\"amountSpent\",\"type\":\"uint96\"},{\"internalType\":\"bool\",\"name\":\"paused\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structAutomationRegistryBase2_2.UpkeepInfo\",\"name\":\"upkeepInfo\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getUpkeepPrivilegeConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"}],\"name\":\"getUpkeepTriggerConfig\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"hasDedupKey\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"pauseUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"newPrivilegeConfig\",\"type\":\"bytes\"}],\"name\":\"setAdminPrivilegeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIChainModule\",\"name\":\"newModule\",\"type\":\"address\"}],\"name\":\"setChainSpecificModule\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"setPayees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"peer\",\"type\":\"address\"},{\"internalType\":\"enumAutomationRegistryBase2_2.MigrationPermission\",\"name\":\"permission\",\"type\":\"uint8\"}],\"name\":\"setPeerRegistryMigrationPermission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"setUpkeepCheckData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"gasLimit\",\"type\":\"uint32\"}],\"name\":\"setUpkeepGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"name\":\"setUpkeepOffchainConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"upkeepId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"newPrivilegeConfig\",\"type\":\"bytes\"}],\"name\":\"setUpkeepPrivilegeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferPayeeship\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"proposed\",\"type\":\"address\"}],\"name\":\"transferUpkeepAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unpause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"unpauseUpkeep\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upkeepTranscoderVersion\",\"outputs\":[{\"internalType\":\"enumUpkeepFormat\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"upkeepVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawOwnerFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawPayment\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101206040523480156200001257600080fd5b5060405162004dfb38038062004dfb8339810160408190526200003591620001bf565b84848484843380600081620000915760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c457620000c481620000f7565b5050506001600160a01b0394851660805292841660a05290831660c052821660e0521661010052506200022f9350505050565b336001600160a01b03821603620001515760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000088565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114620001ba57600080fd5b919050565b600080600080600060a08688031215620001d857600080fd5b620001e386620001a2565b9450620001f360208701620001a2565b93506200020360408701620001a2565b92506200021360608701620001a2565b91506200022360808701620001a2565b90509295509295909350565b60805160a05160c05160e05161010051614b56620002a56000396000610716015260006105880152600081816106080152613379015260008181610779015261345301526000818161080701528181611de3015281816120b80152818161252101528181612a340152612ab80152614b566000f3fe608060405234801561001057600080fd5b50600436106103575760003560e01c806379ba5097116101c8578063b10b673c11610104578063ca30e603116100a2578063eb5dcd6c1161007c578063eb5dcd6c14610851578063ed56b3e114610864578063f2fde38b146108d7578063faa3e996146108ea57600080fd5b8063ca30e60314610805578063cd7f71b51461082b578063d76326481461083e57600080fd5b8063b6511a2a116100de578063b6511a2a146107c3578063b657bc9c146107ca578063b79550be146107dd578063c7c3a19a146107e557600080fd5b8063b10b673c14610777578063b121e1471461079d578063b148ab6b146107b057600080fd5b80638dcf0fe711610171578063a710b2211161014b578063a710b2211461073a578063a72aa27e1461074d578063aab9edd614610760578063abc76ae01461076f57600080fd5b80638dcf0fe7146106de5780638ed02bab146106f1578063a08714c01461071457600080fd5b80638456cb59116101a25780638456cb59146106a55780638765ecbe146106ad5780638da5cb5b146106c057600080fd5b806379ba50971461065257806379ea99431461065a5780637d9b97e01461069d57600080fd5b806343cc055c116102975780635425d8ac116102405780636209e1e91161021a5780636209e1e9146105f35780636709d0e514610606578063671d36ed1461062c578063744bfe611461063f57600080fd5b80635425d8ac146105865780635b6aa71c146105cd5780635b7edd6e146105e057600080fd5b80634ca16c52116102715780634ca16c521461054a5780635147cd59146105535780635165f2f51461057357600080fd5b806343cc055c1461050157806344cb70b81461051857806348013d7b1461053b57600080fd5b80631a2af01111610304578063232c1cc5116102de578063232c1cc5146104795780633b9cce59146104805780633f4ba83a14610493578063421d183b1461049b57600080fd5b80631a2af011146103f55780631e01043914610408578063207b65161461046657600080fd5b80631865c57d116103355780631865c57d146103a9578063187256e8146103c257806319d97a94146103d557600080fd5b8063050ee65d1461035c57806306e3b632146103745780630b7d33e614610394575b600080fd5b6201af405b6040519081526020015b60405180910390f35b610387610382366004613da5565b610930565b60405161036b9190613dc7565b6103a76103a2366004613e54565b610a4d565b005b6103b1610b07565b60405161036b959493929190614057565b6103a76103d036600461418e565b610f51565b6103e86103e33660046141cb565b610fc2565b60405161036b9190614248565b6103a761040336600461425b565b611064565b6104496104163660046141cb565b6000908152600460205260409020600101546c0100000000000000000000000090046bffffffffffffffffffffffff1690565b6040516bffffffffffffffffffffffff909116815260200161036b565b6103e86104743660046141cb565b61116a565b6014610361565b6103a761048e366004614280565b611187565b6103a76113dd565b6104ae6104a93660046142f5565b611443565b60408051951515865260ff90941660208601526bffffffffffffffffffffffff9283169385019390935216606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a00161036b565b60135460ff165b604051901515815260200161036b565b6105086105263660046141cb565b60009081526008602052604090205460ff1690565b600060405161036b9190614341565b62015f90610361565b6105666105613660046141cb565b611562565b60405161036b919061435b565b6103a76105813660046141cb565b61156d565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161036b565b6104496105db366004614388565b6116e4565b6103a76105ee3660046142f5565b6118a1565b6103e86106013660046142f5565b611929565b7f00000000000000000000000000000000000000000000000000000000000000006105a8565b6103a761063a3660046143c1565b61195d565b6103a761064d36600461425b565b611a37565b6103a7611ede565b6105a86106683660046141cb565b6000908152600460205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b6103a7611fe0565b6103a761213b565b6103a76106bb3660046141cb565b6121bc565b60005473ffffffffffffffffffffffffffffffffffffffff166105a8565b6103a76106ec366004613e54565b612336565b601354610100900473ffffffffffffffffffffffffffffffffffffffff166105a8565b7f00000000000000000000000000000000000000000000000000000000000000006105a8565b6103a76107483660046143fd565b61238b565b6103a761075b36600461442b565b6125f3565b6040516003815260200161036b565b611d4c610361565b7f00000000000000000000000000000000000000000000000000000000000000006105a8565b6103a76107ab3660046142f5565b6126e8565b6103a76107be3660046141cb565b6127e0565b6032610361565b6104496107d83660046141cb565b6129ce565b6103a76129fb565b6107f86107f33660046141cb565b612b57565b60405161036b919061444e565b7f00000000000000000000000000000000000000000000000000000000000000006105a8565b6103a7610839366004613e54565b612f2a565b61044961084c3660046141cb565b612fc1565b6103a761085f3660046143fd565b612fcc565b6108be6108723660046142f5565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602090815260409182902082518084019093525460ff8082161515808552610100909204169290910182905291565b60408051921515835260ff90911660208301520161036b565b6103a76108e53660046142f5565b61312a565b6109236108f83660046142f5565b73ffffffffffffffffffffffffffffffffffffffff166000908152601a602052604090205460ff1690565b60405161036b9190614585565b6060600061093e600261313e565b9050808410610979576040517f1390f2a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061098584866145c8565b905081811180610993575083155b61099d578061099f565b815b905060006109ad86836145db565b67ffffffffffffffff8111156109c5576109c56145ee565b6040519080825280602002602001820160405280156109ee578160200160208202803683370190505b50905060005b8151811015610a4157610a12610a0a88836145c8565b600290613148565b828281518110610a2457610a2461461d565b602090810291909101015280610a398161464c565b9150506109f4565b50925050505b92915050565b6016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610aae576040517f77c3599200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152601d60205260409020610ac7828483614726565b50827f2fd8d70753a007014349d4591843cc031c2dd7a260d7dd82eca8253686ae77698383604051610afa929190614841565b60405180910390a2505050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152604080516101e08101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526101c0810191909152604080516101408101825260155463ffffffff7401000000000000000000000000000000000000000082041682526bffffffffffffffffffffffff90811660208301526019549282019290925260125490911660608281019190915290819060009060808101610c40600261313e565b8152601554780100000000000000000000000000000000000000000000000080820463ffffffff9081166020808601919091527c01000000000000000000000000000000000000000000000000000000008404821660408087019190915260115460608088019190915260125474010000000000000000000000000000000000000000810485166080808a01919091527e01000000000000000000000000000000000000000000000000000000000000820460ff16151560a0998a015283516101e0810185526c0100000000000000000000000080840488168252700100000000000000000000000000000000808504891697830197909752808a0488169582019590955296820462ffffff16928701929092527b01000000000000000000000000000000000000000000000000000000900461ffff16908501526014546bffffffffffffffffffffffff8116968501969096529304811660c083015260165480821660e08401526401000000008104821661010084015268010000000000000000900416610120820152601754610140820152601854610160820152910473ffffffffffffffffffffffffffffffffffffffff166101808201529095506101a08101610e0d600961315b565b81526016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff16602091820152601254600d80546040805182860281018601909152818152949850899489949293600e937d01000000000000000000000000000000000000000000000000000000000090910460ff16928591830182828015610ed057602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610ea5575b5050505050925081805480602002602001604051908101604052809291908181526020018280548015610f3957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610f0e575b50505050509150945094509450945094509091929394565b610f59613168565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a6020526040902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115610fb957610fb9614312565b02179055505050565b6000818152601d60205260409020805460609190610fdf90614684565b80601f016020809104026020016040519081016040528092919081815260200182805461100b90614684565b80156110585780601f1061102d57610100808354040283529160200191611058565b820191906000526020600020905b81548152906001019060200180831161103b57829003601f168201915b50505050509050919050565b61106d826131eb565b3373ffffffffffffffffffffffffffffffffffffffff8216036110bc576040517f8c8728c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff8281169116146111665760008281526006602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915590519091339185917fb1cbb2c4b8480034c27e06da5f096b8233a8fd4497028593a41ff6df79726b3591a45b5050565b6000818152601b60205260409020805460609190610fdf90614684565b61118f613168565b600e5481146111ca576040517fcf54c06a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600e5481101561139c576000600e82815481106111ec576111ec61461d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116808452600f909252604083205491935016908585858181106112365761123661461d565b905060200201602081019061124b91906142f5565b905073ffffffffffffffffffffffffffffffffffffffff811615806112de575073ffffffffffffffffffffffffffffffffffffffff8216158015906112bc57508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156112de575073ffffffffffffffffffffffffffffffffffffffff81811614155b15611315576040517fb387a23800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff818116146113865773ffffffffffffffffffffffffffffffffffffffff8381166000908152600f6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169183169190911790555b50505080806113949061464c565b9150506111cd565b507fa46de38886467c59be07a0675f14781206a5477d871628af46c2443822fcb725600e83836040516113d19392919061488e565b60405180910390a15050565b6113e5613168565b601280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e0100000000000000000000000000009004909116606082015282918291829182919082906115095760608201516012546000916114f5916bffffffffffffffffffffffff16614940565b600e549091506115059082614994565b9150505b8151602083015160408401516115209084906149bf565b6060949094015173ffffffffffffffffffffffffffffffffffffffff9a8b166000908152600f6020526040902054929b919a9499509750921694509092505050565b6000610a478261329f565b611576816131eb565b600081815260046020908152604091829020825160e081018452815460ff8116151580835263ffffffff610100830481169584019590955265010000000000820485169583019590955273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290611675576040517f1b88a78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556116b460028361334a565b5060405182907f7bada562044eb163f6b4003c4553e4e62825344c0418eea087bed5ee05a4745690600090a25050565b60408051610160810182526012546bffffffffffffffffffffffff8116825263ffffffff6c010000000000000000000000008204811660208401527001000000000000000000000000000000008204811693830193909352740100000000000000000000000000000000000000008104909216606082015262ffffff7801000000000000000000000000000000000000000000000000830416608082015261ffff7b0100000000000000000000000000000000000000000000000000000083041660a082015260ff7d0100000000000000000000000000000000000000000000000000000000008304811660c08301527e0100000000000000000000000000000000000000000000000000000000000083048116151560e08301527f01000000000000000000000000000000000000000000000000000000000000009092048216151561010080830191909152601354928316151561012083015273ffffffffffffffffffffffffffffffffffffffff920491909116610140820152600090818061186e83613356565b91509150611897838787601460020160049054906101000a900463ffffffff1686866000613534565b9695505050505050565b6118a9613168565b601380547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff8416908102919091179091556040519081527fdefc28b11a7980dbe0c49dbbd7055a1584bc8075097d1e8b3b57fb7283df2ad79060200160405180910390a150565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601e60205260409020805460609190610fdf90614684565b6016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146119be576040517f77c3599200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152601e602052604090206119ee828483614726565b508273ffffffffffffffffffffffffffffffffffffffff167f7c44b4eb59ee7873514e7e43e7718c269d872965938b288aa143befca62f99d28383604051610afa929190614841565b6012547f0100000000000000000000000000000000000000000000000000000000000000900460ff1615611a97576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8116611b2d576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600460209081526040808320815160e081018352815460ff81161515825263ffffffff610100820481168387015265010000000000820481168386015273ffffffffffffffffffffffffffffffffffffffff6901000000000000000000909204821660608401526001909301546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a08401527801000000000000000000000000000000000000000000000000900490921660c082015286855260059093529220549091163314611c34576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601260010160019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166357e871e76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611ca4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc891906149e4565b816040015163ffffffff161115611d0b576040517fff84e5dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600460205260409020600101546019546c010000000000000000000000009091046bffffffffffffffffffffffff1690611d4b9082906145db565b60195560008481526004602081905260409182902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff16905590517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116928201929092526bffffffffffffffffffffffff831660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5291906149fd565b50604080516bffffffffffffffffffffffff8316815273ffffffffffffffffffffffffffffffffffffffff8516602082015285917ff3b5906e5672f3e524854103bcafbbdba80dbdfeca2c35e116127b1060a68318910160405180910390a25050601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611f64576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611fe8613168565b6015546019546bffffffffffffffffffffffff9091169061200a9082906145db565b601955601580547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690556040516bffffffffffffffffffffffff821681527f1d07d0b0be43d3e5fee41a80b579af370affee03fa595bf56d5d4c19328162f19060200160405180910390a16040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526bffffffffffffffffffffffff821660248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044015b6020604051808303816000875af1158015612117573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061116691906149fd565b612143613168565b601280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611439565b6121c5816131eb565b600081815260046020908152604091829020825160e081018452815460ff8116158015835263ffffffff610100830481169584019590955265010000000000820485169583019590955273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c0820152906122c4576040517f514b6c2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905561230660028361357f565b5060405182907f8ab10247ce168c27748e656ecf852b951fcaac790c18106b19aa0ae57a8b741f90600090a25050565b61233f836131eb565b6000838152601c60205260409020612358828483614726565b50827f3e8740446213c8a77d40e08f79136ce3f347d13ed270a6ebdf57159e0faf48508383604051610afa929190614841565b73ffffffffffffffffffffffffffffffffffffffff81166123d8576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600f6020526040902054163314612438576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254600e5460009161245b9185916bffffffffffffffffffffffff169061358b565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff1690556019549091506124c5906bffffffffffffffffffffffff8316906145db565b6019556040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526bffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561256a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061258e91906149fd565b5060405133815273ffffffffffffffffffffffffffffffffffffffff808416916bffffffffffffffffffffffff8416918616907f9819093176a1851202c7bcfa46845809b4e47c261866550e94ed3775d2f406989060200160405180910390a4505050565b6108fc8163ffffffff161080612628575060155463ffffffff7001000000000000000000000000000000009091048116908216115b1561265f576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612668826131eb565b60008281526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1661010063ffffffff861690810291909117909155915191825283917fc24c07e655ce79fba8a589778987d3c015bc6af1632bb20cf9182e02a65d972c910160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff818116600090815260106020526040902054163314612748576040517f6752e7aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600f602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556010909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b600081815260046020908152604091829020825160e081018452815460ff81161515825263ffffffff6101008204811694830194909452650100000000008104841694820185905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004821660c082015291146128dd576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff16331461293a576040517f6352a85300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526005602090815260408083208054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821790935560069094528285208054909216909155905173ffffffffffffffffffffffffffffffffffffffff90911692839186917f5cff4db96bef051785e999f44bfcd21c18823e034fb92dd376e3db4ce0feeb2c91a4505050565b6000610a476129dc8361329f565b600084815260046020526040902054610100900463ffffffff166116e4565b612a03613168565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612a90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ab491906149e4565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb3360195484612b0191906145db565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016120f8565b604080516101408101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c0820181905260e082018190526101008201526101208101919091526000828152600460209081526040808320815160e081018352815460ff811615158252610100810463ffffffff90811695830195909552650100000000008104851693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff16606083018190526001909101546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a08401527801000000000000000000000000000000000000000000000000900490921660c0820152919015612cef57816060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612cea9190614a1f565b612cf2565b60005b90506040518061014001604052808273ffffffffffffffffffffffffffffffffffffffff168152602001836020015163ffffffff168152602001600760008781526020019081526020016000208054612d4a90614684565b80601f0160208091040260200160405190810160405280929190818152602001828054612d7690614684565b8015612dc35780601f10612d9857610100808354040283529160200191612dc3565b820191906000526020600020905b815481529060010190602001808311612da657829003601f168201915b505050505081526020018360a001516bffffffffffffffffffffffff1681526020016005600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836040015163ffffffff1667ffffffffffffffff1681526020018360c0015163ffffffff16815260200183608001516bffffffffffffffffffffffff168152602001836000015115158152602001601c60008781526020019081526020016000208054612ea090614684565b80601f0160208091040260200160405190810160405280929190818152602001828054612ecc90614684565b8015612f195780601f10612eee57610100808354040283529160200191612f19565b820191906000526020600020905b815481529060010190602001808311612efc57829003601f168201915b505050505081525092505050919050565b612f33836131eb565b60165463ffffffff16811115612f75576040517fae7235df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600760205260409020612f8e828483614726565b50827fcba2d5723b2ee59e53a8e8a82a4a7caf4fdfe70e9f7c582950bf7e7a5c24e83d8383604051610afa929190614841565b6000610a47826129ce565b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600f602052604090205416331461302c576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff82160361307b576040517f8c8728c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152601060205260409020548116908216146111665773ffffffffffffffffffffffffffffffffffffffff82811660008181526010602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055513392917f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836791a45050565b613132613168565b61313b81613793565b50565b6000610a47825490565b60006131548383613888565b9392505050565b60606000613154836138b2565b60005473ffffffffffffffffffffffffffffffffffffffff1633146131e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401611f5b565b565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff163314613248576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526004602052604090205465010000000000900463ffffffff9081161461313b576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818160045b600f81101561332c577fff0000000000000000000000000000000000000000000000000000000000000082168382602081106132e4576132e461461d565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461331a57506000949350505050565b806133248161464c565b9150506132a6565b5081600f1a600181111561334257613342614312565b949350505050565b6000613154838361390d565b6000806000836080015162ffffff1690506000808263ffffffff161190506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156133e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134069190614a56565b509450909250505060008113158061341d57508142105b8061343e575082801561343e575061343582426145db565b8463ffffffff16105b1561344d576017549550613451565b8095505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156134bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134e09190614a56565b50945090925050506000811315806134f757508142105b806135185750828015613518575061350f82426145db565b8463ffffffff16105b1561352757601854945061352b565b8094505b50505050915091565b60008061354688878b60c0015161395c565b90506000806135618b8a63ffffffff16858a8a60018b613a1e565b909250905061357081836149bf565b9b9a5050505050505050505050565b60006131548383613cab565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e01000000000000000000000000000090049091166060820152906137875760008160600151856136239190614940565b905060006136318583614994565b9050808360400181815161364591906149bf565b6bffffffffffffffffffffffff169052506136608582614aa6565b8360600181815161367191906149bf565b6bffffffffffffffffffffffff90811690915273ffffffffffffffffffffffffffffffffffffffff89166000908152600b602090815260409182902087518154928901519389015160608a015186166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff919096166201000002167fffffffffffff000000000000000000000000000000000000000000000000ffff60ff95909516610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909416939093171792909216179190911790555050505b60400151949350505050565b3373ffffffffffffffffffffffffffffffffffffffff821603613812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401611f5b565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600082600001828154811061389f5761389f61461d565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561105857602002820191906000526020600020905b8154815260200190600101908083116138ee5750505050509050919050565b600081815260018301602052604081205461395457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a47565b506000610a47565b6000808085600181111561397257613972614312565b03613981575062015f906139d6565b600185600181111561399557613995614312565b036139a457506201af406139d6565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6139e763ffffffff85166014614ad6565b6139f2846001614aed565b613a019060ff16611d4c614ad6565b613a0b90836145c8565b613a1591906145c8565b95945050505050565b60008060008960a0015161ffff1687613a379190614ad6565b9050838015613a455750803a105b15613a4d57503a5b60008415613ad0578a610140015173ffffffffffffffffffffffffffffffffffffffff166318b8f6136040518163ffffffff1660e01b8152600401602060405180830381865afa158015613aa5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ac991906149e4565b9050613b8c565b6101408b01516016546040517f1254414000000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff90911690631254414090602401602060405180830381865afa158015613b52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7691906149e4565b8b60a0015161ffff16613b899190614ad6565b90505b613b9a61ffff871682614b06565b905060008782613baa8c8e6145c8565b613bb49086614ad6565b613bbe91906145c8565b613bd090670de0b6b3a7640000614ad6565b613bda9190614b06565b905060008c6040015163ffffffff1664e8d4a51000613bf99190614ad6565b898e6020015163ffffffff16858f88613c129190614ad6565b613c1c91906145c8565b613c2a90633b9aca00614ad6565b613c349190614ad6565b613c3e9190614b06565b613c4891906145c8565b90506b033b2e3c9fd0803ce8000000613c6182846145c8565b1115613c99576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b60008181526001830160205260408120548015613d94576000613ccf6001836145db565b8554909150600090613ce3906001906145db565b9050818114613d48576000866000018281548110613d0357613d0361461d565b9060005260206000200154905080876000018481548110613d2657613d2661461d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613d5957613d59614b1a565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a47565b6000915050610a47565b5092915050565b60008060408385031215613db857600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015613dff57835183529284019291840191600101613de3565b50909695505050505050565b60008083601f840112613e1d57600080fd5b50813567ffffffffffffffff811115613e3557600080fd5b602083019150836020828501011115613e4d57600080fd5b9250929050565b600080600060408486031215613e6957600080fd5b83359250602084013567ffffffffffffffff811115613e8757600080fd5b613e9386828701613e0b565b9497909650939450505050565b600081518084526020808501945080840160005b83811015613ee657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613eb4565b509495945050505050565b805163ffffffff16825260006101e06020830151613f17602086018263ffffffff169052565b506040830151613f2f604086018263ffffffff169052565b506060830151613f46606086018262ffffff169052565b506080830151613f5c608086018261ffff169052565b5060a0830151613f7c60a08601826bffffffffffffffffffffffff169052565b5060c0830151613f9460c086018263ffffffff169052565b5060e0830151613fac60e086018263ffffffff169052565b506101008381015163ffffffff908116918601919091526101208085015190911690850152610140808401519085015261016080840151908501526101808084015173ffffffffffffffffffffffffffffffffffffffff16908501526101a08084015181860183905261402183870182613ea0565b925050506101c08084015161404d8287018273ffffffffffffffffffffffffffffffffffffffff169052565b5090949350505050565b855163ffffffff16815260006101c0602088015161408560208501826bffffffffffffffffffffffff169052565b506040880151604084015260608801516140af60608501826bffffffffffffffffffffffff169052565b506080880151608084015260a08801516140d160a085018263ffffffff169052565b5060c08801516140e960c085018263ffffffff169052565b5060e088015160e08401526101008089015161410c8286018263ffffffff169052565b505061012088810151151590840152610140830181905261412f81840188613ef1565b90508281036101608401526141448187613ea0565b90508281036101808401526141598186613ea0565b9150506118976101a083018460ff169052565b73ffffffffffffffffffffffffffffffffffffffff8116811461313b57600080fd5b600080604083850312156141a157600080fd5b82356141ac8161416c565b91506020830135600481106141c057600080fd5b809150509250929050565b6000602082840312156141dd57600080fd5b5035919050565b6000815180845260005b8181101561420a576020818501810151868301820152016141ee565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061315460208301846141e4565b6000806040838503121561426e57600080fd5b8235915060208301356141c08161416c565b6000806020838503121561429357600080fd5b823567ffffffffffffffff808211156142ab57600080fd5b818501915085601f8301126142bf57600080fd5b8135818111156142ce57600080fd5b8660208260051b85010111156142e357600080fd5b60209290920196919550909350505050565b60006020828403121561430757600080fd5b81356131548161416c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b602081016003831061435557614355614312565b91905290565b602081016002831061435557614355614312565b803563ffffffff8116811461438357600080fd5b919050565b6000806040838503121561439b57600080fd5b8235600281106143aa57600080fd5b91506143b86020840161436f565b90509250929050565b6000806000604084860312156143d657600080fd5b83356143e18161416c565b9250602084013567ffffffffffffffff811115613e8757600080fd5b6000806040838503121561441057600080fd5b823561441b8161416c565b915060208301356141c08161416c565b6000806040838503121561443e57600080fd5b823591506143b86020840161436f565b6020815261447560208201835173ffffffffffffffffffffffffffffffffffffffff169052565b6000602083015161448e604084018263ffffffff169052565b5060408301516101408060608501526144ab6101608501836141e4565b915060608501516144cc60808601826bffffffffffffffffffffffff169052565b50608085015173ffffffffffffffffffffffffffffffffffffffff811660a08601525060a085015167ffffffffffffffff811660c08601525060c085015163ffffffff811660e08601525060e0850151610100614538818701836bffffffffffffffffffffffff169052565b860151905061012061454d8682018315159052565b8601518584037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00183870152905061189783826141e4565b602081016004831061435557614355614312565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610a4757610a47614599565b81810381811115610a4757610a47614599565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361467d5761467d614599565b5060010190565b600181811c9082168061469857607f821691505b6020821081036146d1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561472157600081815260208120601f850160051c810160208610156146fe5750805b601f850160051c820191505b8181101561471d5782815560010161470a565b5050505b505050565b67ffffffffffffffff83111561473e5761473e6145ee565b6147528361474c8354614684565b836146d7565b6000601f8411600181146147a4576000851561476e5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835561483a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156147f357868501358255602094850194600190920191016147d3565b508682101561482e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6000604082016040835280865480835260608501915087600052602092508260002060005b828110156148e557815473ffffffffffffffffffffffffffffffffffffffff16845292840192600191820191016148b3565b505050838103828501528481528590820160005b8681101561493457823561490c8161416c565b73ffffffffffffffffffffffffffffffffffffffff16825291830191908301906001016148f9565b50979650505050505050565b6bffffffffffffffffffffffff828116828216039080821115613d9e57613d9e614599565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006bffffffffffffffffffffffff808416806149b3576149b3614965565b92169190910492915050565b6bffffffffffffffffffffffff818116838216019080821115613d9e57613d9e614599565b6000602082840312156149f657600080fd5b5051919050565b600060208284031215614a0f57600080fd5b8151801515811461315457600080fd5b600060208284031215614a3157600080fd5b81516131548161416c565b805169ffffffffffffffffffff8116811461438357600080fd5b600080600080600060a08688031215614a6e57600080fd5b614a7786614a3c565b9450602086015193506040860151925060608601519150614a9a60808701614a3c565b90509295509295909350565b6bffffffffffffffffffffffff818116838216028082169190828114614ace57614ace614599565b505092915050565b8082028115828204841417610a4757610a47614599565b60ff8181168382160190811115610a4757610a47614599565b600082614b1557614b15614965565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000813000a",
}
var AutomationRegistryLogicBABI = AutomationRegistryLogicBMetaData.ABI
var AutomationRegistryLogicBBin = AutomationRegistryLogicBMetaData.Bin
-func DeployAutomationRegistryLogicB(auth *bind.TransactOpts, backend bind.ContractBackend, mode uint8, link common.Address, linkNativeFeed common.Address, fastGasFeed common.Address, automationForwarderLogic common.Address) (common.Address, *types.Transaction, *AutomationRegistryLogicB, error) {
+func DeployAutomationRegistryLogicB(auth *bind.TransactOpts, backend bind.ContractBackend, link common.Address, linkNativeFeed common.Address, fastGasFeed common.Address, automationForwarderLogic common.Address, allowedReadOnlyAddress common.Address) (common.Address, *types.Transaction, *AutomationRegistryLogicB, error) {
parsed, err := AutomationRegistryLogicBMetaData.GetAbi()
if err != nil {
return common.Address{}, nil, nil, err
@@ -93,7 +92,7 @@ func DeployAutomationRegistryLogicB(auth *bind.TransactOpts, backend bind.Contra
return common.Address{}, nil, nil, errors.New("GetABI returned nil")
}
- address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AutomationRegistryLogicBBin), backend, mode, link, linkNativeFeed, fastGasFeed, automationForwarderLogic)
+ address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(AutomationRegistryLogicBBin), backend, link, linkNativeFeed, fastGasFeed, automationForwarderLogic, allowedReadOnlyAddress)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -260,6 +259,28 @@ func (_AutomationRegistryLogicB *AutomationRegistryLogicBCallerSession) GetAdmin
return _AutomationRegistryLogicB.Contract.GetAdminPrivilegeConfig(&_AutomationRegistryLogicB.CallOpts, admin)
}
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetAllowedReadOnlyAddress(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _AutomationRegistryLogicB.contract.Call(opts, &out, "getAllowedReadOnlyAddress")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBSession) GetAllowedReadOnlyAddress() (common.Address, error) {
+ return _AutomationRegistryLogicB.Contract.GetAllowedReadOnlyAddress(&_AutomationRegistryLogicB.CallOpts)
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBCallerSession) GetAllowedReadOnlyAddress() (common.Address, error) {
+ return _AutomationRegistryLogicB.Contract.GetAllowedReadOnlyAddress(&_AutomationRegistryLogicB.CallOpts)
+}
+
func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetAutomationForwarderLogic(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
err := _AutomationRegistryLogicB.contract.Call(opts, &out, "getAutomationForwarderLogic")
@@ -326,6 +347,28 @@ func (_AutomationRegistryLogicB *AutomationRegistryLogicBCallerSession) GetCance
return _AutomationRegistryLogicB.Contract.GetCancellationDelay(&_AutomationRegistryLogicB.CallOpts)
}
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetChainModule(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _AutomationRegistryLogicB.contract.Call(opts, &out, "getChainModule")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBSession) GetChainModule() (common.Address, error) {
+ return _AutomationRegistryLogicB.Contract.GetChainModule(&_AutomationRegistryLogicB.CallOpts)
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBCallerSession) GetChainModule() (common.Address, error) {
+ return _AutomationRegistryLogicB.Contract.GetChainModule(&_AutomationRegistryLogicB.CallOpts)
+}
+
func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetConditionalGasOverhead(opts *bind.CallOpts) (*big.Int, error) {
var out []interface{}
err := _AutomationRegistryLogicB.contract.Call(opts, &out, "getConditionalGasOverhead")
@@ -524,28 +567,6 @@ func (_AutomationRegistryLogicB *AutomationRegistryLogicBCallerSession) GetMinBa
return _AutomationRegistryLogicB.Contract.GetMinBalanceForUpkeep(&_AutomationRegistryLogicB.CallOpts, id)
}
-func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetMode(opts *bind.CallOpts) (uint8, error) {
- var out []interface{}
- err := _AutomationRegistryLogicB.contract.Call(opts, &out, "getMode")
-
- if err != nil {
- return *new(uint8), err
- }
-
- out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
- return out0, err
-
-}
-
-func (_AutomationRegistryLogicB *AutomationRegistryLogicBSession) GetMode() (uint8, error) {
- return _AutomationRegistryLogicB.Contract.GetMode(&_AutomationRegistryLogicB.CallOpts)
-}
-
-func (_AutomationRegistryLogicB *AutomationRegistryLogicBCallerSession) GetMode() (uint8, error) {
- return _AutomationRegistryLogicB.Contract.GetMode(&_AutomationRegistryLogicB.CallOpts)
-}
-
func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetPeerRegistryMigrationPermission(opts *bind.CallOpts, peer common.Address) (uint8, error) {
var out []interface{}
err := _AutomationRegistryLogicB.contract.Call(opts, &out, "getPeerRegistryMigrationPermission", peer)
@@ -612,6 +633,28 @@ func (_AutomationRegistryLogicB *AutomationRegistryLogicBCallerSession) GetPerSi
return _AutomationRegistryLogicB.Contract.GetPerSignerGasOverhead(&_AutomationRegistryLogicB.CallOpts)
}
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetReorgProtectionEnabled(opts *bind.CallOpts) (bool, error) {
+ var out []interface{}
+ err := _AutomationRegistryLogicB.contract.Call(opts, &out, "getReorgProtectionEnabled")
+
+ if err != nil {
+ return *new(bool), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+
+ return out0, err
+
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBSession) GetReorgProtectionEnabled() (bool, error) {
+ return _AutomationRegistryLogicB.Contract.GetReorgProtectionEnabled(&_AutomationRegistryLogicB.CallOpts)
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBCallerSession) GetReorgProtectionEnabled() (bool, error) {
+ return _AutomationRegistryLogicB.Contract.GetReorgProtectionEnabled(&_AutomationRegistryLogicB.CallOpts)
+}
+
func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetSignerInfo(opts *bind.CallOpts, query common.Address) (GetSignerInfo,
error) {
@@ -654,7 +697,7 @@ func (_AutomationRegistryLogicB *AutomationRegistryLogicBCaller) GetState(opts *
}
outstruct.State = *abi.ConvertType(out[0], new(AutomationRegistryBase22State)).(*AutomationRegistryBase22State)
- outstruct.Config = *abi.ConvertType(out[1], new(AutomationRegistryBase22OnchainConfig)).(*AutomationRegistryBase22OnchainConfig)
+ outstruct.Config = *abi.ConvertType(out[1], new(AutomationRegistryBase22OnchainConfigLegacy)).(*AutomationRegistryBase22OnchainConfigLegacy)
outstruct.Signers = *abi.ConvertType(out[2], new([]common.Address)).(*[]common.Address)
outstruct.Transmitters = *abi.ConvertType(out[3], new([]common.Address)).(*[]common.Address)
outstruct.F = *abi.ConvertType(out[4], new(uint8)).(*uint8)
@@ -968,6 +1011,18 @@ func (_AutomationRegistryLogicB *AutomationRegistryLogicBTransactorSession) SetA
return _AutomationRegistryLogicB.Contract.SetAdminPrivilegeConfig(&_AutomationRegistryLogicB.TransactOpts, admin, newPrivilegeConfig)
}
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBTransactor) SetChainSpecificModule(opts *bind.TransactOpts, newModule common.Address) (*types.Transaction, error) {
+ return _AutomationRegistryLogicB.contract.Transact(opts, "setChainSpecificModule", newModule)
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBSession) SetChainSpecificModule(newModule common.Address) (*types.Transaction, error) {
+ return _AutomationRegistryLogicB.Contract.SetChainSpecificModule(&_AutomationRegistryLogicB.TransactOpts, newModule)
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBTransactorSession) SetChainSpecificModule(newModule common.Address) (*types.Transaction, error) {
+ return _AutomationRegistryLogicB.Contract.SetChainSpecificModule(&_AutomationRegistryLogicB.TransactOpts, newModule)
+}
+
func (_AutomationRegistryLogicB *AutomationRegistryLogicBTransactor) SetPayees(opts *bind.TransactOpts, payees []common.Address) (*types.Transaction, error) {
return _AutomationRegistryLogicB.contract.Transact(opts, "setPayees", payees)
}
@@ -1392,6 +1447,123 @@ func (_AutomationRegistryLogicB *AutomationRegistryLogicBFilterer) ParseCancelle
return event, nil
}
+type AutomationRegistryLogicBChainSpecificModuleUpdatedIterator struct {
+ Event *AutomationRegistryLogicBChainSpecificModuleUpdated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *AutomationRegistryLogicBChainSpecificModuleUpdatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(AutomationRegistryLogicBChainSpecificModuleUpdated)
+ 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(AutomationRegistryLogicBChainSpecificModuleUpdated)
+ 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 *AutomationRegistryLogicBChainSpecificModuleUpdatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *AutomationRegistryLogicBChainSpecificModuleUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type AutomationRegistryLogicBChainSpecificModuleUpdated struct {
+ NewModule common.Address
+ Raw types.Log
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBFilterer) FilterChainSpecificModuleUpdated(opts *bind.FilterOpts) (*AutomationRegistryLogicBChainSpecificModuleUpdatedIterator, error) {
+
+ logs, sub, err := _AutomationRegistryLogicB.contract.FilterLogs(opts, "ChainSpecificModuleUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &AutomationRegistryLogicBChainSpecificModuleUpdatedIterator{contract: _AutomationRegistryLogicB.contract, event: "ChainSpecificModuleUpdated", logs: logs, sub: sub}, nil
+}
+
+func (_AutomationRegistryLogicB *AutomationRegistryLogicBFilterer) WatchChainSpecificModuleUpdated(opts *bind.WatchOpts, sink chan<- *AutomationRegistryLogicBChainSpecificModuleUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _AutomationRegistryLogicB.contract.WatchLogs(opts, "ChainSpecificModuleUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(AutomationRegistryLogicBChainSpecificModuleUpdated)
+ if err := _AutomationRegistryLogicB.contract.UnpackLog(event, "ChainSpecificModuleUpdated", 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 (_AutomationRegistryLogicB *AutomationRegistryLogicBFilterer) ParseChainSpecificModuleUpdated(log types.Log) (*AutomationRegistryLogicBChainSpecificModuleUpdated, error) {
+ event := new(AutomationRegistryLogicBChainSpecificModuleUpdated)
+ if err := _AutomationRegistryLogicB.contract.UnpackLog(event, "ChainSpecificModuleUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
type AutomationRegistryLogicBDedupKeyAddedIterator struct {
Event *AutomationRegistryLogicBDedupKeyAdded
@@ -5199,7 +5371,7 @@ type GetSignerInfo struct {
}
type GetState struct {
State AutomationRegistryBase22State
- Config AutomationRegistryBase22OnchainConfig
+ Config AutomationRegistryBase22OnchainConfigLegacy
Signers []common.Address
Transmitters []common.Address
F uint8
@@ -5218,6 +5390,8 @@ func (_AutomationRegistryLogicB *AutomationRegistryLogicB) ParseLog(log types.Lo
return _AutomationRegistryLogicB.ParseAdminPrivilegeConfigSet(log)
case _AutomationRegistryLogicB.abi.Events["CancelledUpkeepReport"].ID:
return _AutomationRegistryLogicB.ParseCancelledUpkeepReport(log)
+ case _AutomationRegistryLogicB.abi.Events["ChainSpecificModuleUpdated"].ID:
+ return _AutomationRegistryLogicB.ParseChainSpecificModuleUpdated(log)
case _AutomationRegistryLogicB.abi.Events["DedupKeyAdded"].ID:
return _AutomationRegistryLogicB.ParseDedupKeyAdded(log)
case _AutomationRegistryLogicB.abi.Events["FundsAdded"].ID:
@@ -5290,6 +5464,10 @@ func (AutomationRegistryLogicBCancelledUpkeepReport) Topic() common.Hash {
return common.HexToHash("0xc3237c8807c467c1b39b8d0395eff077313e691bf0a7388106792564ebfd5636")
}
+func (AutomationRegistryLogicBChainSpecificModuleUpdated) Topic() common.Hash {
+ return common.HexToHash("0xdefc28b11a7980dbe0c49dbbd7055a1584bc8075097d1e8b3b57fb7283df2ad7")
+}
+
func (AutomationRegistryLogicBDedupKeyAdded) Topic() common.Hash {
return common.HexToHash("0xa4a4e334c0e330143f9437484fe516c13bc560b86b5b0daf58e7084aaac228f2")
}
@@ -5415,12 +5593,16 @@ type AutomationRegistryLogicBInterface interface {
GetAdminPrivilegeConfig(opts *bind.CallOpts, admin common.Address) ([]byte, error)
+ GetAllowedReadOnlyAddress(opts *bind.CallOpts) (common.Address, error)
+
GetAutomationForwarderLogic(opts *bind.CallOpts) (common.Address, error)
GetBalance(opts *bind.CallOpts, id *big.Int) (*big.Int, error)
GetCancellationDelay(opts *bind.CallOpts) (*big.Int, error)
+ GetChainModule(opts *bind.CallOpts) (common.Address, error)
+
GetConditionalGasOverhead(opts *bind.CallOpts) (*big.Int, error)
GetFastGasFeedAddress(opts *bind.CallOpts) (common.Address, error)
@@ -5439,14 +5621,14 @@ type AutomationRegistryLogicBInterface interface {
GetMinBalanceForUpkeep(opts *bind.CallOpts, id *big.Int) (*big.Int, error)
- GetMode(opts *bind.CallOpts) (uint8, error)
-
GetPeerRegistryMigrationPermission(opts *bind.CallOpts, peer common.Address) (uint8, error)
GetPerPerformByteGasOverhead(opts *bind.CallOpts) (*big.Int, error)
GetPerSignerGasOverhead(opts *bind.CallOpts) (*big.Int, error)
+ GetReorgProtectionEnabled(opts *bind.CallOpts) (bool, error)
+
GetSignerInfo(opts *bind.CallOpts, query common.Address) (GetSignerInfo,
error)
@@ -5489,6 +5671,8 @@ type AutomationRegistryLogicBInterface interface {
SetAdminPrivilegeConfig(opts *bind.TransactOpts, admin common.Address, newPrivilegeConfig []byte) (*types.Transaction, error)
+ SetChainSpecificModule(opts *bind.TransactOpts, newModule common.Address) (*types.Transaction, error)
+
SetPayees(opts *bind.TransactOpts, payees []common.Address) (*types.Transaction, error)
SetPeerRegistryMigrationPermission(opts *bind.TransactOpts, peer common.Address, permission uint8) (*types.Transaction, error)
@@ -5529,6 +5713,12 @@ type AutomationRegistryLogicBInterface interface {
ParseCancelledUpkeepReport(log types.Log) (*AutomationRegistryLogicBCancelledUpkeepReport, error)
+ FilterChainSpecificModuleUpdated(opts *bind.FilterOpts) (*AutomationRegistryLogicBChainSpecificModuleUpdatedIterator, error)
+
+ WatchChainSpecificModuleUpdated(opts *bind.WatchOpts, sink chan<- *AutomationRegistryLogicBChainSpecificModuleUpdated) (event.Subscription, error)
+
+ ParseChainSpecificModuleUpdated(log types.Log) (*AutomationRegistryLogicBChainSpecificModuleUpdated, error)
+
FilterDedupKeyAdded(opts *bind.FilterOpts, dedupKey [][32]byte) (*AutomationRegistryLogicBDedupKeyAddedIterator, error)
WatchDedupKeyAdded(opts *bind.WatchOpts, sink chan<- *AutomationRegistryLogicBDedupKeyAdded, dedupKey [][32]byte) (event.Subscription, error)
diff --git a/core/gethwrappers/generated/keeper_registry_wrapper_2_2/keeper_registry_wrapper_2_2.go b/core/gethwrappers/generated/keeper_registry_wrapper_2_2/keeper_registry_wrapper_2_2.go
index 1648ed97229..0e0ec33fe81 100644
--- a/core/gethwrappers/generated/keeper_registry_wrapper_2_2/keeper_registry_wrapper_2_2.go
+++ b/core/gethwrappers/generated/keeper_registry_wrapper_2_2/keeper_registry_wrapper_2_2.go
@@ -46,12 +46,13 @@ type AutomationRegistryBase22OnchainConfig struct {
Transcoder common.Address
Registrars []common.Address
UpkeepPrivilegeManager common.Address
+ ChainModule common.Address
ReorgProtectionEnabled bool
}
var AutomationRegistryMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractAutomationRegistryLogicB2_2\",\"name\":\"logicA\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckDataExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfFaultyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrigger\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTriggerType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCheckDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxPerformDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByUpkeepPrivilegeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyUnpausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepCancelled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"AdminPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"CancelledUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"DedupKeyAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"InsufficientFundsUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"PayeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"ReorgedUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"StaleUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"UpkeepCheckDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepOffchainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalPayment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasOverhead\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepTriggerConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepUnpaused\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfigBytes\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfig\",\"name\":\"onchainConfig\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfigTypeSafe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"simulatePerformUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"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\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x6101406040523480156200001257600080fd5b50604051620055a0380380620055a08339810160408190526200003591620003df565b80816001600160a01b0316634b4fd03b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000406565b826001600160a01b031663ca30e6036040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001009190620003df565b836001600160a01b031663b10b673c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001659190620003df565b846001600160a01b0316636709d0e56040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ca9190620003df565b856001600160a01b0316635425d8ac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f9190620003df565b3380600081620002865760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620002b957620002b9816200031b565b505050846002811115620002d157620002d162000429565b60e0816002811115620002e857620002e862000429565b9052506001600160a01b0393841660805291831660a052821660c0528116610100529190911661012052506200043f9050565b336001600160a01b03821603620003755760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200027d565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b0381168114620003dc57600080fd5b50565b600060208284031215620003f257600080fd5b8151620003ff81620003c6565b9392505050565b6000602082840312156200041957600080fd5b815160038110620003ff57600080fd5b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05160e05161010051610120516150ff620004a16000396000818160d6015261016f0152600050506000818161253d01528181613447015281816135da0152613af701526000505060005050600061134a01526150ff6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c8063a4c0ed3611610081578063b1dc65a41161005b578063b1dc65a4146102e0578063e3d0e712146102f3578063f2fde38b14610306576100d4565b8063a4c0ed3614610262578063aed2e92914610275578063afcb95d71461029f576100d4565b806379ba5097116100b257806379ba5097146101c757806381ff7048146101cf5780638da5cb5b14610244576100d4565b8063181f5a771461011b578063349e8cca1461016d5780636cad5469146101b4575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e808015610114573d6000f35b3d6000fd5b005b6101576040518060400160405280601881526020017f4175746f6d6174696f6e526567697374727920322e322e30000000000000000081525081565b6040516101649190613d76565b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101196101c23660046141a5565b610319565b610119611230565b61022160155460115463ffffffff780100000000000000000000000000000000000000000000000083048116937c01000000000000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610164565b60005473ffffffffffffffffffffffffffffffffffffffff1661018f565b6101196102703660046142bb565b611332565b610288610283366004614317565b61154e565b604080519215158352602083019190915201610164565b601154601254604080516000815260208101939093527401000000000000000000000000000000000000000090910463ffffffff1690820152606001610164565b6101196102ee3660046143a8565b6116c6565b61011961030136600461445f565b61226f565b6101196103143660046144ee565b612298565b6103216122ac565b601f8651111561035d576040517f25d0209c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360ff1660000361039a576040517fe77dba5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845186511415806103b957506103b184600361453a565b60ff16865111155b156103f0576040517f1d2d1c5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254600e546bffffffffffffffffffffffff9091169060005b816bffffffffffffffffffffffff168110156104725761045f600e828154811061043657610436614556565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16848461232f565b508061046a81614585565b91505061040a565b5060008060005b836bffffffffffffffffffffffff1681101561057b57600d81815481106104a2576104a2614556565b600091825260209091200154600e805473ffffffffffffffffffffffffffffffffffffffff909216945090829081106104dd576104dd614556565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff8681168452600c8352604080852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690559116808452600b90925290912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905591508061057381614585565b915050610479565b50610588600d6000613c4b565b610594600e6000613c4b565b604080516080810182526000808252602082018190529181018290526060810182905290805b8c518110156109fd57600c60008e83815181106105d9576105d9614556565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040016000205460ff1615610644576040517f77cea0fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168d828151811061066e5761066e614556565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036106c3576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052806001151581526020018260ff16815250600c60008f84815181106106f4576106f4614556565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260400160002082518154939092015160ff16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092171790558b518c908290811061079c5761079c614556565b60200260200101519150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361080c576040517f58a70a0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b60209081526040918290208251608081018452905460ff80821615801584526101008304909116938301939093526bffffffffffffffffffffffff6201000082048116948301949094526e010000000000000000000000000000900490921660608301529093506108c7576040517f6a7281ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001835260ff80821660208086019182526bffffffffffffffffffffffff808b166060880190815273ffffffffffffffffffffffffffffffffffffffff87166000908152600b909352604092839020885181549551948a0151925184166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff939094166201000002929092167fffffffffffff000000000000000000000000000000000000000000000000ffff94909616610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090951694909417179190911692909217919091179055806109f581614585565b9150506105ba565b50508a51610a139150600d9060208d0190613c69565b508851610a2790600e9060208c0190613c69565b50604051806101400160405280856bffffffffffffffffffffffff168152602001886000015163ffffffff168152602001886020015163ffffffff168152602001600063ffffffff168152602001886060015162ffffff168152602001886080015161ffff1681526020018960ff1681526020016012600001601e9054906101000a900460ff16151581526020016012600001601f9054906101000a900460ff1615158152602001886101e001511515815250601260008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160186101000a81548162ffffff021916908362ffffff16021790555060a082015181600001601b6101000a81548161ffff021916908361ffff16021790555060c082015181600001601d6101000a81548160ff021916908360ff16021790555060e082015181600001601e6101000a81548160ff02191690831515021790555061010082015181600001601f6101000a81548160ff0219169083151502179055506101208201518160010160006101000a81548160ff0219169083151502179055509050506040518061018001604052808860a001516bffffffffffffffffffffffff16815260200188610180015173ffffffffffffffffffffffffffffffffffffffff168152602001601460010160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001886040015163ffffffff1681526020018860c0015163ffffffff168152602001601460010160149054906101000a900463ffffffff1663ffffffff168152602001601460010160189054906101000a900463ffffffff1663ffffffff1681526020016014600101601c9054906101000a900463ffffffff1663ffffffff1681526020018860e0015163ffffffff16815260200188610100015163ffffffff16815260200188610120015163ffffffff168152602001886101c0015173ffffffffffffffffffffffffffffffffffffffff16815250601460008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550606082015181600101600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160020160006101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160086101000a81548163ffffffff021916908363ffffffff16021790555061016082015181600201600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505086610140015160178190555086610160015160188190555060006014600101601c9054906101000a900463ffffffff169050611017612537565b601580547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff938416021780825560019260189161109291859178010000000000000000000000000000000000000000000000009004166145bd565b92506101000a81548163ffffffff021916908363ffffffff1602179055506000886040516020016110c3919061462b565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905260155490915061112c90469030907801000000000000000000000000000000000000000000000000900463ffffffff168f8f8f878f8f6125ec565b60115560005b61113c6009612696565b81101561116c576111596111516009836126a6565b6009906126b9565b508061116481614585565b915050611132565b5060005b896101a00151518110156111c3576111b08a6101a00151828151811061119857611198614556565b602002602001015160096126db90919063ffffffff16565b50806111bb81614585565b915050611170565b507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0582601154601460010160189054906101000a900463ffffffff168f8f8f878f8f60405161121a999897969594939291906147a6565b60405180910390a1505050505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113a1576040517fc8bad78d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081146113db576040517fdfe9309000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113e98284018461483c565b60008181526004602052604090205490915065010000000000900463ffffffff90811614611443576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526004602052604090206001015461147e9085906c0100000000000000000000000090046bffffffffffffffffffffffff16614855565b600082815260046020526040902060010180546bffffffffffffffffffffffff929092166c01000000000000000000000000027fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff9092169190911790556019546114e990859061487a565b6019556040516bffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff86169082907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a35050505050565b6000806115596126fd565b6012547e01000000000000000000000000000000000000000000000000000000000000900460ff16156115b8576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260046020908152604091829020825160e081018452815460ff811615158252610100810463ffffffff908116838601819052650100000000008304821684880152690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff16606084018190526001909401546bffffffffffffffffffffffff80821660808601526c0100000000000000000000000082041660a0850152780100000000000000000000000000000000000000000000000090041660c08301528451601f890185900485028101850190955287855290936116b793899089908190840183828082843760009201919091525061273592505050565b9093509150505b935093915050565b60005a60408051610140810182526012546bffffffffffffffffffffffff8116825263ffffffff6c010000000000000000000000008204811660208401527001000000000000000000000000000000008204811693830193909352740100000000000000000000000000000000000000008104909216606082015262ffffff7801000000000000000000000000000000000000000000000000830416608082015261ffff7b0100000000000000000000000000000000000000000000000000000083041660a082015260ff7d0100000000000000000000000000000000000000000000000000000000008304811660c08301527e010000000000000000000000000000000000000000000000000000000000008304811615801560e08401527f010000000000000000000000000000000000000000000000000000000000000090930481161515610100830152601354161515610120820152919250611858576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b602052604090205460ff166118a1576040517f1099ed7500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011548a35146118dd576040517fdfdcf8e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c08101516118ed90600161488d565b60ff16861415806118fe5750858414155b15611935576040517f0244f71a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119458a8a8a8a8a8a8a8a61295e565b60006119518a8a612bc7565b9050600081604001515167ffffffffffffffff81111561197357611973613d89565b604051908082528060200260200182016040528015611a3757816020015b604080516101e0810182526000610100820181815261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c0830182905282526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816119915790505b5090506000805b836040015151811015611e81576004600085604001518381518110611a6557611a65614556565b6020908102919091018101518252818101929092526040908101600020815160e081018352815460ff811615158252610100810463ffffffff90811695830195909552650100000000008104851693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff166060830152600101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c08201528351849083908110611b4a57611b4a614556565b602002602001015160000181905250611b7f84604001518281518110611b7257611b72614556565b6020026020010151612c80565b838281518110611b9157611b91614556565b6020026020010151608001906001811115611bae57611bae6148a6565b90816001811115611bc157611bc16148a6565b81525050611c3585848381518110611bdb57611bdb614556565b60200260200101516080015186606001518481518110611bfd57611bfd614556565b60200260200101518760a001518581518110611c1b57611c1b614556565b602002602001015151886000015189602001516001612d2b565b838281518110611c4757611c47614556565b6020026020010151604001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050611cd484604001518281518110611c8e57611c8e614556565b602002602001015185608001518381518110611cac57611cac614556565b6020026020010151858481518110611cc657611cc6614556565b602002602001015188612d76565b848381518110611ce657611ce6614556565b6020026020010151602001858481518110611d0357611d03614556565b602002602001015160e0018281525082151515158152505050828181518110611d2e57611d2e614556565b60200260200101516020015115611d5157611d4a6001836148d5565b9150611d56565b611e6f565b611dbc838281518110611d6b57611d6b614556565b6020026020010151600001516060015185606001518381518110611d9157611d91614556565b60200260200101518660a001518481518110611daf57611daf614556565b6020026020010151612735565b848381518110611dce57611dce614556565b6020026020010151606001858481518110611deb57611deb614556565b602002602001015160a0018281525082151515158152505050828181518110611e1657611e16614556565b602002602001015160a0015186611e2d91906148f0565b9550611e6f84604001518281518110611e4857611e48614556565b6020026020010151848381518110611e6257611e62614556565b6020026020010151612ef9565b80611e7981614585565b915050611a3e565b508061ffff16600003611e98575050505050612265565b60c0840151611ea890600161488d565b611eb79060ff1661044c614903565b616b6c611ec58d6010614903565b5a611ed090896148f0565b611eda919061487a565b611ee4919061487a565b611eee919061487a565b9450611b58611f0161ffff831687614949565b611f0b919061487a565b945060008060008060005b87604001515181101561210c57868181518110611f3557611f35614556565b602002602001015160200151156120fa57611f918a888381518110611f5c57611f5c614556565b6020026020010151608001518a60a001518481518110611f7e57611f7e614556565b6020026020010151518c60c0015161300b565b878281518110611fa357611fa3614556565b602002602001015160c0018181525050611fff8989604001518381518110611fcd57611fcd614556565b6020026020010151898481518110611fe757611fe7614556565b60200260200101518b600001518c602001518b61302b565b909350915061200e8285614855565b935061201a8386614855565b945086818151811061202e5761202e614556565b60200260200101516060015115158860400151828151811061205257612052614556565b60200260200101517fad8cc9579b21dfe2c2f6ea35ba15b656e46b4f5b0cb424f52739b8ce5cac9c5b84866120879190614855565b8a858151811061209957612099614556565b602002602001015160a001518b86815181106120b7576120b7614556565b602002602001015160c001518d6080015187815181106120d9576120d9614556565b60200260200101516040516120f1949392919061495d565b60405180910390a35b8061210481614585565b915050611f16565b5050336000908152600b6020526040902080548492506002906121449084906201000090046bffffffffffffffffffffffff16614855565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555080601260000160008282829054906101000a90046bffffffffffffffffffffffff1661219e9190614855565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060008f6001600381106121e1576121e1614556565b602002013560001c9050600060088264ffffffffff16901c9050876060015163ffffffff168163ffffffff16111561225b57601280547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8416021790555b5050505050505050505b5050505050505050565b612290868686868060200190518101906122899190614a40565b8686610319565b505050505050565b6122a06122ac565b6122a98161311e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016112ad565b565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e010000000000000000000000000000900490911660608201529061252b5760008160600151856123c79190614bae565b905060006123d58583614bd3565b905080836040018181516123e99190614855565b6bffffffffffffffffffffffff169052506124048582614bfe565b836060018181516124159190614855565b6bffffffffffffffffffffffff90811690915273ffffffffffffffffffffffffffffffffffffffff89166000908152600b602090815260409182902087518154928901519389015160608a015186166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff919096166201000002167fffffffffffff000000000000000000000000000000000000000000000000ffff60ff95909516610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909416939093171792909216179190911790555050505b60400151949350505050565b600060017f0000000000000000000000000000000000000000000000000000000000000000600281111561256d5761256d6148a6565b036125e757606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e29190614c2e565b905090565b504390565b6000808a8a8a8a8a8a8a8a8a60405160200161261099989796959493929190614c47565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179b9a5050505050505050505050565b60006126a0825490565b92915050565b60006126b28383613213565b9392505050565b60006126b28373ffffffffffffffffffffffffffffffffffffffff841661323d565b60006126b28373ffffffffffffffffffffffffffffffffffffffff8416613337565b321561232d576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60125460009081907f0100000000000000000000000000000000000000000000000000000000000000900460ff161561279a576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790556040517f4585e33b0000000000000000000000000000000000000000000000000000000090612816908590602401613d76565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290517f79188d1600000000000000000000000000000000000000000000000000000000815290935073ffffffffffffffffffffffffffffffffffffffff8616906379188d16906128e99087908790600401614cdc565b60408051808303816000875af1158015612907573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292b9190614cf5565b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905590969095509350505050565b60008787604051612970929190614d23565b604051908190038120612987918b90602001614d33565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201208383019092526000808452908301819052909250906000805b88811015612b5e576001858783602081106129f3576129f3614556565b612a0091901a601b61488d565b8c8c85818110612a1257612a12614556565b905060200201358b8b86818110612a2b57612a2b614556565b9050602002013560405160008152602001604052604051612a68949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612a8a573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff81166000908152600c602090815290849020838501909452925460ff8082161515808552610100909204169383019390935290955093509050612b38576040517f0f4c073700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826020015160080260ff166001901b840193508080612b5690614585565b9150506129d6565b50827e01010101010101010101010101010101010101010101010101010101010101841614612bb9576040517fc103be2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050505050565b612c006040518060c001604052806000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6000612c0e83850185614e24565b6040810151516060820151519192509081141580612c3157508082608001515114155b80612c415750808260a001515114155b15612c78576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509392505050565b6000818160045b600f811015612d0d577fff000000000000000000000000000000000000000000000000000000000000008216838260208110612cc557612cc5614556565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612cfb57506000949350505050565b80612d0581614585565b915050612c87565b5081600f1a6001811115612d2357612d236148a6565b949350505050565b600080612d3d88878b60c00151613386565b9050600080612d588b8a63ffffffff16858a8a60018b613412565b9092509050612d678183614855565b9b9a5050505050505050505050565b600080808085608001516001811115612d9157612d916148a6565b03612db657612da28787878761386b565b612db157600092509050612ef0565b612e2d565b600185608001516001811115612dce57612dce6148a6565b03612dfb576000612de088888761396d565b9250905080612df55750600092509050612ef0565b50612e2d565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e35612537565b85516040015163ffffffff1611612e8957867fc3237c8807c467c1b39b8d0395eff077313e691bf0a7388106792564ebfd563687604051612e769190613d76565b60405180910390a2600092509050612ef0565b84604001516bffffffffffffffffffffffff16856000015160a001516bffffffffffffffffffffffff161015612ee957867f377c8b0c126ae5248d27aca1c76fac4608aff85673ee3caf09747e1044549e0287604051612e769190613d76565b6001925090505b94509492505050565b600081608001516001811115612f1157612f116148a6565b03612f8357612f1e612537565b6000838152600460205260409020600101805463ffffffff929092167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555050565b600181608001516001811115612f9b57612f9b6148a6565b036130075760e08101805160009081526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055915191517fa4a4e334c0e330143f9437484fe516c13bc560b86b5b0daf58e7084aaac228f29190a25b5050565b6000613018848484613386565b905080851015612d235750929392505050565b600080613046888760a001518860c001518888886001613412565b909250905060006130578284614855565b600089815260046020526040902060010180549192508291600c9061309b9084906c0100000000000000000000000090046bffffffffffffffffffffffff16614bae565b82546101009290920a6bffffffffffffffffffffffff81810219909316918316021790915560008a8152600460205260408120600101805485945090926130e491859116614855565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050965096945050505050565b3373ffffffffffffffffffffffffffffffffffffffff82160361319d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016112ad565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600082600001828154811061322a5761322a614556565b9060005260206000200154905092915050565b600081815260018301602052604081205480156133265760006132616001836148f0565b8554909150600090613275906001906148f0565b90508181146132da57600086600001828154811061329557613295614556565b90600052602060002001549050808760000184815481106132b8576132b8614556565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806132eb576132eb614f11565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126a0565b60009150506126a0565b5092915050565b600081815260018301602052604081205461337e575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556126a0565b5060006126a0565b6000808085600181111561339c5761339c6148a6565b036133ab575062015f906133ca565b60018560018111156133bf576133bf6148a6565b03612dfb57506201adb05b6133db63ffffffff85166014614903565b6133e684600161488d565b6133f59060ff16611d4c614903565b6133ff908361487a565b613409919061487a565b95945050505050565b60008060008960a0015161ffff168761342b9190614903565b90508380156134395750803a105b1561344157503a5b600060027f00000000000000000000000000000000000000000000000000000000000000006002811115613477576134776148a6565b036135d65760408051600081526020810190915285156134d5576000366040518060800160405280604881526020016150ab604891396040516020016134bf93929190614f40565b604051602081830303815290604052905061353d565b6016546134f190640100000000900463ffffffff166004614f67565b63ffffffff1667ffffffffffffffff81111561350f5761350f613d89565b6040519080825280601f01601f191660200182016040528015613539576020820181803683370190505b5090505b6040517f49948e0e00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000000f906349948e0e9061358d908490600401613d76565b602060405180830381865afa1580156135aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ce9190614c2e565b915050613730565b60017f0000000000000000000000000000000000000000000000000000000000000000600281111561360a5761360a6148a6565b0361373057841561368c57606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136859190614c2e565b9050613730565b6000606c73ffffffffffffffffffffffffffffffffffffffff166341b247a86040518163ffffffff1660e01b815260040160c060405180830381865afa1580156136da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136fe9190614f87565b505060165492945061372193505050640100000000900463ffffffff1682614903565b61372c906010614903565b9150505b8461374c57808b60a0015161ffff166137499190614903565b90505b61375a61ffff871682614949565b90506000878261376a8c8e61487a565b6137749086614903565b61377e919061487a565b61379090670de0b6b3a7640000614903565b61379a9190614949565b905060008c6040015163ffffffff1664e8d4a510006137b99190614903565b898e6020015163ffffffff16858f886137d29190614903565b6137dc919061487a565b6137ea90633b9aca00614903565b6137f49190614903565b6137fe9190614949565b613808919061487a565b90506b033b2e3c9fd0803ce8000000613821828461487a565b1115613859576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b600080848060200190518101906138829190614fd1565b845160c00151815191925063ffffffff908116911610156138df57857f405288ea7be309e16cfdf481367f90a413e1d4634fcdaf8966546db9b93012e8866040516138cd9190613d76565b60405180910390a26000915050612d23565b826101200151801561391357506020810151158015906139135750602081015181516139109063ffffffff16613af1565b14155b8061392c5750613921612537565b815163ffffffff1610155b1561396157857f6aa7f60c176da7af894b384daea2249497448137f5943c1237ada8bc92bdc301866040516138cd9190613d76565b50600195945050505050565b6000806000848060200190518101906139869190615029565b90506000868260000151836020015184604001516040516020016139e894939291909384526020840192909252604083015260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016606082015260640190565b6040516020818303038152906040528051906020012090508461012001518015613a365750608082015115801590613a3657508160800151613a33836060015163ffffffff16613af1565b14155b80613a525750613a44612537565b826060015163ffffffff1610155b15613a9c57867f6aa7f60c176da7af894b384daea2249497448137f5943c1237ada8bc92bdc30187604051613a879190613d76565b60405180910390a26000935091506116be9050565b60008181526008602052604090205460ff1615613ae357867f405288ea7be309e16cfdf481367f90a413e1d4634fcdaf8966546db9b93012e887604051613a879190613d76565b600197909650945050505050565b600060017f00000000000000000000000000000000000000000000000000000000000000006002811115613b2757613b276148a6565b03613c41576000606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613b7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9e9190614c2e565b90508083101580613bb95750610100613bb784836148f0565b115b15613bc75750600092915050565b6040517f2b407a8200000000000000000000000000000000000000000000000000000000815260048101849052606490632b407a8290602401602060405180830381865afa158015613c1d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b29190614c2e565b504090565b919050565b50805460008255906000526020600020908101906122a99190613cf3565b828054828255906000526020600020908101928215613ce3579160200282015b82811115613ce357825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190613c89565b50613cef929150613cf3565b5090565b5b80821115613cef5760008155600101613cf4565b60005b83811015613d23578181015183820152602001613d0b565b50506000910152565b60008151808452613d44816020860160208601613d08565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126b26020830184613d2c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610200810167ffffffffffffffff81118282101715613ddc57613ddc613d89565b60405290565b60405160c0810167ffffffffffffffff81118282101715613ddc57613ddc613d89565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e4c57613e4c613d89565b604052919050565b600067ffffffffffffffff821115613e6e57613e6e613d89565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146122a957600080fd5b8035613c4681613e78565b600082601f830112613eb657600080fd5b81356020613ecb613ec683613e54565b613e05565b82815260059290921b84018101918181019086841115613eea57600080fd5b8286015b84811015613f0e578035613f0181613e78565b8352918301918301613eee565b509695505050505050565b803560ff81168114613c4657600080fd5b63ffffffff811681146122a957600080fd5b8035613c4681613f2a565b62ffffff811681146122a957600080fd5b8035613c4681613f47565b61ffff811681146122a957600080fd5b8035613c4681613f63565b6bffffffffffffffffffffffff811681146122a957600080fd5b8035613c4681613f7e565b80151581146122a957600080fd5b8035613c4681613fa3565b60006102008284031215613fcf57600080fd5b613fd7613db8565b9050613fe282613f3c565b8152613ff060208301613f3c565b602082015261400160408301613f3c565b604082015261401260608301613f58565b606082015261402360808301613f73565b608082015261403460a08301613f98565b60a082015261404560c08301613f3c565b60c082015261405660e08301613f3c565b60e0820152610100614069818401613f3c565b9082015261012061407b838201613f3c565b90820152610140828101359082015261016080830135908201526101806140a3818401613e9a565b908201526101a08281013567ffffffffffffffff8111156140c357600080fd5b6140cf85828601613ea5565b8284015250506101c06140e3818401613e9a565b908201526101e06140f5838201613fb1565b9082015292915050565b803567ffffffffffffffff81168114613c4657600080fd5b600082601f83011261412857600080fd5b813567ffffffffffffffff81111561414257614142613d89565b61417360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613e05565b81815284602083860101111561418857600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156141be57600080fd5b863567ffffffffffffffff808211156141d657600080fd5b6141e28a838b01613ea5565b975060208901359150808211156141f857600080fd5b6142048a838b01613ea5565b965061421260408a01613f19565b9550606089013591508082111561422857600080fd5b6142348a838b01613fbc565b945061424260808a016140ff565b935060a089013591508082111561425857600080fd5b5061426589828a01614117565b9150509295509295509295565b60008083601f84011261428457600080fd5b50813567ffffffffffffffff81111561429c57600080fd5b6020830191508360208285010111156142b457600080fd5b9250929050565b600080600080606085870312156142d157600080fd5b84356142dc81613e78565b935060208501359250604085013567ffffffffffffffff8111156142ff57600080fd5b61430b87828801614272565b95989497509550505050565b60008060006040848603121561432c57600080fd5b83359250602084013567ffffffffffffffff81111561434a57600080fd5b61435686828701614272565b9497909650939450505050565b60008083601f84011261437557600080fd5b50813567ffffffffffffffff81111561438d57600080fd5b6020830191508360208260051b85010111156142b457600080fd5b60008060008060008060008060e0898b0312156143c457600080fd5b606089018a8111156143d557600080fd5b8998503567ffffffffffffffff808211156143ef57600080fd5b6143fb8c838d01614272565b909950975060808b013591508082111561441457600080fd5b6144208c838d01614363565b909750955060a08b013591508082111561443957600080fd5b506144468b828c01614363565b999c989b50969995989497949560c00135949350505050565b60008060008060008060c0878903121561447857600080fd5b863567ffffffffffffffff8082111561449057600080fd5b61449c8a838b01613ea5565b975060208901359150808211156144b257600080fd5b6144be8a838b01613ea5565b96506144cc60408a01613f19565b955060608901359150808211156144e257600080fd5b6142348a838b01614117565b60006020828403121561450057600080fd5b81356126b281613e78565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff81811683821602908116908181146133305761333061450b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145b6576145b661450b565b5060010190565b63ffffffff8181168382160190808211156133305761333061450b565b600081518084526020808501945080840160005b8381101561462057815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016145ee565b509495945050505050565b6020815261464260208201835163ffffffff169052565b6000602083015161465b604084018263ffffffff169052565b50604083015163ffffffff8116606084015250606083015162ffffff8116608084015250608083015161ffff811660a08401525060a08301516bffffffffffffffffffffffff811660c08401525060c083015163ffffffff811660e08401525060e08301516101006146d48185018363ffffffff169052565b84015190506101206146ed8482018363ffffffff169052565b84015190506101406147068482018363ffffffff169052565b840151610160848101919091528401516101808085019190915284015190506101a06147498185018373ffffffffffffffffffffffffffffffffffffffff169052565b808501519150506102006101c081818601526147696102208601846145da565b908601519092506101e06147948682018373ffffffffffffffffffffffffffffffffffffffff169052565b90950151151593019290925250919050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526147d68184018a6145da565b905082810360808401526147ea81896145da565b905060ff871660a084015282810360c08401526148078187613d2c565b905067ffffffffffffffff851660e084015282810361010084015261482c8185613d2c565b9c9b505050505050505050505050565b60006020828403121561484e57600080fd5b5035919050565b6bffffffffffffffffffffffff8181168382160190808211156133305761333061450b565b808201808211156126a0576126a061450b565b60ff81811683821601908111156126a0576126a061450b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b61ffff8181168382160190808211156133305761333061450b565b818103818111156126a0576126a061450b565b80820281158282048414176126a0576126a061450b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000826149585761495861491a565b500490565b6bffffffffffffffffffffffff851681528360208201528260408201526080606082015260006149906080830184613d2c565b9695505050505050565b8051613c4681613f2a565b8051613c4681613f47565b8051613c4681613f63565b8051613c4681613f7e565b8051613c4681613e78565b600082601f8301126149e257600080fd5b815160206149f2613ec683613e54565b82815260059290921b84018101918181019086841115614a1157600080fd5b8286015b84811015613f0e578051614a2881613e78565b8352918301918301614a15565b8051613c4681613fa3565b600060208284031215614a5257600080fd5b815167ffffffffffffffff80821115614a6a57600080fd5b908301906102008286031215614a7f57600080fd5b614a87613db8565b614a908361499a565b8152614a9e6020840161499a565b6020820152614aaf6040840161499a565b6040820152614ac0606084016149a5565b6060820152614ad1608084016149b0565b6080820152614ae260a084016149bb565b60a0820152614af360c0840161499a565b60c0820152614b0460e0840161499a565b60e0820152610100614b1781850161499a565b90820152610120614b2984820161499a565b9082015261014083810151908201526101608084015190820152610180614b518185016149c6565b908201526101a08381015183811115614b6957600080fd5b614b75888287016149d1565b8284015250506101c09150614b8b8284016149c6565b828201526101e09150614b9f828401614a35565b91810191909152949350505050565b6bffffffffffffffffffffffff8281168282160390808211156133305761333061450b565b60006bffffffffffffffffffffffff80841680614bf257614bf261491a565b92169190910492915050565b6bffffffffffffffffffffffff818116838216028082169190828114614c2657614c2661450b565b505092915050565b600060208284031215614c4057600080fd5b5051919050565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152614c8e8285018b6145da565b91508382036080850152614ca2828a6145da565b915060ff881660a085015283820360c0850152614cbf8288613d2c565b90861660e0850152838103610100850152905061482c8185613d2c565b828152604060208201526000612d236040830184613d2c565b60008060408385031215614d0857600080fd5b8251614d1381613fa3565b6020939093015192949293505050565b8183823760009101908152919050565b8281526080810160608360208401379392505050565b600082601f830112614d5a57600080fd5b81356020614d6a613ec683613e54565b82815260059290921b84018101918181019086841115614d8957600080fd5b8286015b84811015613f0e5780358352918301918301614d8d565b600082601f830112614db557600080fd5b81356020614dc5613ec683613e54565b82815260059290921b84018101918181019086841115614de457600080fd5b8286015b84811015613f0e57803567ffffffffffffffff811115614e085760008081fd5b614e168986838b0101614117565b845250918301918301614de8565b600060208284031215614e3657600080fd5b813567ffffffffffffffff80821115614e4e57600080fd5b9083019060c08286031215614e6257600080fd5b614e6a613de2565b8235815260208301356020820152604083013582811115614e8a57600080fd5b614e9687828601614d49565b604083015250606083013582811115614eae57600080fd5b614eba87828601614d49565b606083015250608083013582811115614ed257600080fd5b614ede87828601614da4565b60808301525060a083013582811115614ef657600080fd5b614f0287828601614da4565b60a08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b828482376000838201600081528351614f5d818360208801613d08565b0195945050505050565b63ffffffff818116838216028082169190828114614c2657614c2661450b565b60008060008060008060c08789031215614fa057600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b600060408284031215614fe357600080fd5b6040516040810181811067ffffffffffffffff8211171561500657615006613d89565b604052825161501481613f2a565b81526020928301519281019290925250919050565b600060a0828403121561503b57600080fd5b60405160a0810181811067ffffffffffffffff8211171561505e5761505e613d89565b80604052508251815260208301516020820152604083015161507f81613f2a565b6040820152606083015161509281613f2a565b6060820152608092830151928101929092525091905056fe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractAutomationRegistryLogicB2_2\",\"name\":\"logicA\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ArrayHasNoEntries\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotCancel\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CheckDataExceedsLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateEntry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DuplicateSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GasLimitOutsideRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfFaultyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectNumberOfSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientFunds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRecipient\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTrigger\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTriggerType\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxCheckDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxPerformDataSizeCanOnlyIncrease\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MigrationNotPermitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotAContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyActiveTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByLINKToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrRegistrar\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByProposedPayee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByUpkeepPrivilegeManager\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyPausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlySimulatedBackend\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyUnpausedUpkeep\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ParameterLengthError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentGreaterThanAllLINK\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrantCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RegistryPaused\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RepeatedTransmitter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reason\",\"type\":\"bytes\"}],\"name\":\"TargetCheckReverted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOracles\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TranscoderNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepAlreadyExists\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepCancelled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotCanceled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UpkeepNotNeeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValueNotChanged\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"AdminPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"CancelledUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newModule\",\"type\":\"address\"}],\"name\":\"ChainSpecificModuleUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dedupKey\",\"type\":\"bytes32\"}],\"name\":\"DedupKeyAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"FundsAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"FundsWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"InsufficientFundsUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"amount\",\"type\":\"uint96\"}],\"name\":\"OwnerFundsWithdrawn\",\"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\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"payees\",\"type\":\"address[]\"}],\"name\":\"PayeesUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"PayeeshipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"transmitter\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payee\",\"type\":\"address\"}],\"name\":\"PaymentWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"ReorgedUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"StaleUpkeepReport\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"UpkeepAdminTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"atBlockHeight\",\"type\":\"uint64\"}],\"name\":\"UpkeepCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newCheckData\",\"type\":\"bytes\"}],\"name\":\"UpkeepCheckDataSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"gasLimit\",\"type\":\"uint96\"}],\"name\":\"UpkeepGasLimitSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"remainingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destination\",\"type\":\"address\"}],\"name\":\"UpkeepMigrated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepOffchainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepPaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"totalPayment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasOverhead\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"trigger\",\"type\":\"bytes\"}],\"name\":\"UpkeepPerformed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"privilegeConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepPrivilegeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startingBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"importedFrom\",\"type\":\"address\"}],\"name\":\"UpkeepReceived\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"performGas\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"admin\",\"type\":\"address\"}],\"name\":\"UpkeepRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"triggerConfig\",\"type\":\"bytes\"}],\"name\":\"UpkeepTriggerConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"UpkeepUnpaused\",\"type\":\"event\"},{\"stateMutability\":\"nonpayable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fallbackTo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfigBytes\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"paymentPremiumPPB\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeMicroLink\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"checkGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint24\",\"name\":\"stalenessSeconds\",\"type\":\"uint24\"},{\"internalType\":\"uint16\",\"name\":\"gasCeilingMultiplier\",\"type\":\"uint16\"},{\"internalType\":\"uint96\",\"name\":\"minUpkeepSpend\",\"type\":\"uint96\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxCheckDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerformDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxRevertDataSize\",\"type\":\"uint32\"},{\"internalType\":\"uint256\",\"name\":\"fallbackGasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"fallbackLinkPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"transcoder\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"registrars\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"upkeepPrivilegeManager\",\"type\":\"address\"},{\"internalType\":\"contractIChainModule\",\"name\":\"chainModule\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"reorgProtectionEnabled\",\"type\":\"bool\"}],\"internalType\":\"structAutomationRegistryBase2_2.OnchainConfig\",\"name\":\"onchainConfig\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setConfigTypeSafe\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"performData\",\"type\":\"bytes\"}],\"name\":\"simulatePerformUpkeep\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"gasUsed\",\"type\":\"uint256\"}],\"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\":\"rawReport\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x6101406040523480156200001257600080fd5b506040516200534d3803806200534d8339810160408190526200003591620003b1565b80816001600160a01b031663ca30e6036040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b9190620003b1565b826001600160a01b031663b10b673c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000da573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001009190620003b1565b836001600160a01b0316636709d0e56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001659190620003b1565b846001600160a01b0316635425d8ac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ca9190620003b1565b856001600160a01b031663a08714c06040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f9190620003b1565b3380600081620002865760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620002b957620002b981620002ed565b5050506001600160a01b0394851660805292841660a05290831660c052821660e052811661010052166101205250620003d8565b336001600160a01b03821603620003475760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200027d565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b0381168114620003ae57600080fd5b50565b600060208284031215620003c457600080fd5b8151620003d18162000398565b9392505050565b60805160a05160c05160e0516101005161012051614f28620004256000396000818160d6015261016f01526000611b29015260005050600050506000505060006104330152614f286000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c8063aed2e92911610081578063e3d0e7121161005b578063e3d0e712146102e0578063f2fde38b146102f3578063f75f6b1114610306576100d4565b8063aed2e92914610262578063afcb95d71461028c578063b1dc65a4146102cd576100d4565b806381ff7048116100b257806381ff7048146101bc5780638da5cb5b14610231578063a4c0ed361461024f576100d4565b8063181f5a771461011b578063349e8cca1461016d57806379ba5097146101b4575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e808015610114573d6000f35b3d6000fd5b005b6101576040518060400160405280601881526020017f4175746f6d6174696f6e526567697374727920322e322e30000000000000000081525081565b6040516101649190613c24565b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b610119610319565b61020e60155460115463ffffffff780100000000000000000000000000000000000000000000000083048116937c01000000000000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610164565b60005473ffffffffffffffffffffffffffffffffffffffff1661018f565b61011961025d366004613cb2565b61041b565b610275610270366004613d0e565b610637565b604080519215158352602083019190915201610164565b601154601254604080516000815260208101939093527401000000000000000000000000000000000000000090910463ffffffff1690820152606001610164565b6101196102db366004613d9f565b6107ad565b6101196102ee366004614070565b610ae8565b61011961030136600461413d565b610b11565b610119610314366004614341565b610b25565b60015473ffffffffffffffffffffffffffffffffffffffff16331461039f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461048a576040517fc8bad78d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081146104c4576040517fdfe9309000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006104d2828401846143d0565b60008181526004602052604090205490915065010000000000900463ffffffff9081161461052c576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600460205260409020600101546105679085906c0100000000000000000000000090046bffffffffffffffffffffffff16614418565b600082815260046020526040902060010180546bffffffffffffffffffffffff929092166c01000000000000000000000000027fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff9092169190911790556019546105d290859061443d565b6019556040516bffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff86169082907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a35050505050565b600080610642611b11565b6012547e01000000000000000000000000000000000000000000000000000000000000900460ff16156106a1576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260046020908152604091829020825160e081018452815460ff811615158252610100810463ffffffff908116838601819052650100000000008304821684880152690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff16606084018190526001909401546bffffffffffffffffffffffff80821660808601526c0100000000000000000000000082041660a0850152780100000000000000000000000000000000000000000000000090041660c08301528451601f890185900485028101850190955287855290936107a0938990899081908401838280828437600092019190915250611b8292505050565b9097909650945050505050565b60005a60408051610160810182526012546bffffffffffffffffffffffff8116825263ffffffff6c010000000000000000000000008204811660208401527001000000000000000000000000000000008204811693830193909352740100000000000000000000000000000000000000008104909216606082015262ffffff7801000000000000000000000000000000000000000000000000830416608082015261ffff7b0100000000000000000000000000000000000000000000000000000083041660a082015260ff7d0100000000000000000000000000000000000000000000000000000000008304811660c08301527e010000000000000000000000000000000000000000000000000000000000008304811615801560e08401527f01000000000000000000000000000000000000000000000000000000000000009093048116151561010080840191909152601354918216151561012084015273ffffffffffffffffffffffffffffffffffffffff910416610140820152919250610963576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b602052604090205460ff166109ac576040517f1099ed7500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011548a35146109e8576040517fdfdcf8e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c08101516109f890600161447f565b60ff1686141580610a095750858414155b15610a40576040517f0244f71a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a508a8a8a8a8a8a8a8a611dab565b6000610a5c8a8a612014565b905060208b0135600881901c63ffffffff16610a798484876120cf565b836060015163ffffffff168163ffffffff161115610ad957601280547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8416021790555b50505050505050505050505050565b610b0986868686806020019051810190610b02919061453e565b8686610b25565b505050505050565b610b196129ca565b610b2281612a4b565b50565b610b2d6129ca565b601f86511115610b69576040517f25d0209c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360ff16600003610ba6576040517fe77dba5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84518651141580610bc55750610bbd8460036146c0565b60ff16865111155b15610bfc576040517f1d2d1c5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254600e546bffffffffffffffffffffffff9091169060005b816bffffffffffffffffffffffff16811015610c7e57610c6b600e8281548110610c4257610c42614450565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff168484612b40565b5080610c76816146dc565b915050610c16565b5060008060005b836bffffffffffffffffffffffff16811015610d8757600d8181548110610cae57610cae614450565b600091825260209091200154600e805473ffffffffffffffffffffffffffffffffffffffff90921694509082908110610ce957610ce9614450565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff8681168452600c8352604080852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690559116808452600b90925290912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055915080610d7f816146dc565b915050610c85565b50610d94600d6000613b03565b610da0600e6000613b03565b604080516080810182526000808252602082018190529181018290526060810182905290805b8c5181101561120957600c60008e8381518110610de557610de5614450565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040016000205460ff1615610e50576040517f77cea0fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168d8281518110610e7a57610e7a614450565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610ecf576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052806001151581526020018260ff16815250600c60008f8481518110610f0057610f00614450565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260400160002082518154939092015160ff16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092171790558b518c9082908110610fa857610fa8614450565b60200260200101519150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611018576040517f58a70a0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b60209081526040918290208251608081018452905460ff80821615801584526101008304909116938301939093526bffffffffffffffffffffffff6201000082048116948301949094526e010000000000000000000000000000900490921660608301529093506110d3576040517f6a7281ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001835260ff80821660208086019182526bffffffffffffffffffffffff808b166060880190815273ffffffffffffffffffffffffffffffffffffffff87166000908152600b909352604092839020885181549551948a0151925184166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff939094166201000002929092167fffffffffffff000000000000000000000000000000000000000000000000ffff94909616610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009095169490941717919091169290921791909117905580611201816146dc565b915050610dc6565b50508a5161121f9150600d9060208d0190613b21565b50885161123390600e9060208c0190613b21565b50604051806101600160405280856bffffffffffffffffffffffff168152602001886000015163ffffffff168152602001886020015163ffffffff168152602001600063ffffffff168152602001886060015162ffffff168152602001886080015161ffff1681526020018960ff1681526020016012600001601e9054906101000a900460ff16151581526020016012600001601f9054906101000a900460ff161515815260200188610200015115158152602001886101e0015173ffffffffffffffffffffffffffffffffffffffff16815250601260008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160186101000a81548162ffffff021916908362ffffff16021790555060a082015181600001601b6101000a81548161ffff021916908361ffff16021790555060c082015181600001601d6101000a81548160ff021916908360ff16021790555060e082015181600001601e6101000a81548160ff02191690831515021790555061010082015181600001601f6101000a81548160ff0219169083151502179055506101208201518160010160006101000a81548160ff0219169083151502179055506101408201518160010160016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506040518061018001604052808860a001516bffffffffffffffffffffffff16815260200188610180015173ffffffffffffffffffffffffffffffffffffffff168152602001601460010160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001886040015163ffffffff1681526020018860c0015163ffffffff168152602001601460010160149054906101000a900463ffffffff1663ffffffff168152602001601460010160189054906101000a900463ffffffff1663ffffffff1681526020016014600101601c9054906101000a900463ffffffff1663ffffffff1681526020018860e0015163ffffffff16815260200188610100015163ffffffff16815260200188610120015163ffffffff168152602001886101c0015173ffffffffffffffffffffffffffffffffffffffff16815250601460008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550606082015181600101600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160020160006101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160086101000a81548163ffffffff021916908363ffffffff16021790555061016082015181600201600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505086610140015160178190555086610160015160188190555060006014600101601c9054906101000a900463ffffffff169050876101e0015173ffffffffffffffffffffffffffffffffffffffff166357e871e76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f89190614714565b601580547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff9384160217808255600192601891611973918591780100000000000000000000000000000000000000000000000090041661472d565b92506101000a81548163ffffffff021916908363ffffffff1602179055506000886040516020016119a4919061479b565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152919052601554909150611a0d90469030907801000000000000000000000000000000000000000000000000900463ffffffff168f8f8f878f8f612d48565b60115560005b611a1d6009612df2565b811015611a4d57611a3a611a32600983612dfc565b600990612e0f565b5080611a45816146dc565b915050611a13565b5060005b896101a0015151811015611aa457611a918a6101a001518281518110611a7957611a79614450565b60200260200101516009612e3190919063ffffffff16565b5080611a9c816146dc565b915050611a51565b507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0582601154601460010160189054906101000a900463ffffffff168f8f8f878f8f604051611afb9998979695949392919061493f565b60405180910390a1505050505050505050505050565b3273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614611b80576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60125460009081907f0100000000000000000000000000000000000000000000000000000000000000900460ff1615611be7576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790556040517f4585e33b0000000000000000000000000000000000000000000000000000000090611c63908590602401613c24565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290517f79188d1600000000000000000000000000000000000000000000000000000000815290935073ffffffffffffffffffffffffffffffffffffffff8616906379188d1690611d3690879087906004016149d5565b60408051808303816000875af1158015611d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7891906149ee565b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905590969095509350505050565b60008787604051611dbd929190614a1c565b604051908190038120611dd4918b90602001614a2c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201208383019092526000808452908301819052909250906000805b88811015611fab57600185878360208110611e4057611e40614450565b611e4d91901a601b61447f565b8c8c85818110611e5f57611e5f614450565b905060200201358b8b86818110611e7857611e78614450565b9050602002013560405160008152602001604052604051611eb5949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015611ed7573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff81166000908152600c602090815290849020838501909452925460ff8082161515808552610100909204169383019390935290955093509050611f85576040517f0f4c073700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826020015160080260ff166001901b840193508080611fa3906146dc565b915050611e23565b50827e01010101010101010101010101010101010101010101010101010101010101841614612006576040517fc103be2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050505050565b61204d6040518060c001604052806000815260200160008152602001606081526020016060815260200160608152602001606081525090565b600061205b83850185614b1d565b604081015151606082015151919250908114158061207e57508082608001515114155b8061208e5750808260a001515114155b156120c5576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5090505b92915050565b600082604001515167ffffffffffffffff8111156120ef576120ef613e56565b6040519080825280602002602001820160405280156121b357816020015b604080516101e0810182526000610100820181815261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c0830182905282526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161210d5790505b50905060008085610140015173ffffffffffffffffffffffffffffffffffffffff166357e871e76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222d9190614714565b905060005b85604001515181101561267757600460008760400151838151811061225957612259614450565b6020908102919091018101518252818101929092526040908101600020815160e081018352815460ff811615158252610100810463ffffffff90811695830195909552650100000000008104851693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff166060830152600101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c0820152845185908390811061233e5761233e614450565b6020026020010151600001819052506123738660400151828151811061236657612366614450565b6020026020010151612e53565b84828151811061238557612385614450565b60200260200101516080019060018111156123a2576123a2614c0a565b908160018111156123b5576123b5614c0a565b81525050612429878583815181106123cf576123cf614450565b602002602001015160800151886060015184815181106123f1576123f1614450565b60200260200101518960a00151858151811061240f5761240f614450565b6020026020010151518a600001518b602001516001612efe565b84828151811061243b5761243b614450565b6020026020010151604001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff16815250506124c98660400151828151811061248257612482614450565b602002602001015183886080015184815181106124a1576124a1614450565b60200260200101518785815181106124bb576124bb614450565b60200260200101518b612f49565b8583815181106124db576124db614450565b60200260200101516020018684815181106124f8576124f8614450565b602002602001015160e001828152508215151515815250505083818151811061252357612523614450565b602002602001015160200151156125465761253f600184614c39565b925061254b565b612665565b6125b184828151811061256057612560614450565b602002602001015160000151606001518760600151838151811061258657612586614450565b60200260200101518860a0015184815181106125a4576125a4614450565b6020026020010151611b82565b8583815181106125c3576125c3614450565b60200260200101516060018684815181106125e0576125e0614450565b602002602001015160a001828152508215151515815250505083818151811061260b5761260b614450565b602002602001015160a00151856126229190614c54565b94506126658660400151828151811061263d5761263d614450565b60200260200101518386848151811061265857612658614450565b60200260200101516130c8565b8061266f816146dc565b915050612232565b508161ffff1660000361268c57505050505050565b60c086015161269c90600161447f565b6126ab9060ff1661044c614c67565b616dc46126b9366010614c67565b5a6126c49088614c54565b6126ce919061443d565b6126d8919061443d565b6126e2919061443d565b9350611c206126f561ffff841686614cad565b6126ff919061443d565b935060008060008060005b8960400151518110156129005787818151811061272957612729614450565b602002602001015160200151156128ee576127858989838151811061275057612750614450565b6020026020010151608001518c60a00151848151811061277257612772614450565b6020026020010151518e60c001516131cd565b88828151811061279757612797614450565b602002602001015160c00181815250506127f38b8b6040015183815181106127c1576127c1614450565b60200260200101518a84815181106127db576127db614450565b60200260200101518d600001518e602001518c6131ed565b90935091506128028285614418565b935061280e8386614418565b945087818151811061282257612822614450565b60200260200101516060015115158a60400151828151811061284657612846614450565b60200260200101517fad8cc9579b21dfe2c2f6ea35ba15b656e46b4f5b0cb424f52739b8ce5cac9c5b848661287b9190614418565b8b858151811061288d5761288d614450565b602002602001015160a001518c86815181106128ab576128ab614450565b602002602001015160c001518f6080015187815181106128cd576128cd614450565b60200260200101516040516128e59493929190614cc1565b60405180910390a35b806128f8816146dc565b91505061270a565b5050336000908152600b6020526040902080548492506002906129389084906201000090046bffffffffffffffffffffffff16614418565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555080601260000160008282829054906101000a90046bffffffffffffffffffffffff166129929190614418565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610396565b3373ffffffffffffffffffffffffffffffffffffffff821603612aca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610396565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e0100000000000000000000000000009004909116606082015290612d3c576000816060015185612bd89190614cfe565b90506000612be68583614d23565b90508083604001818151612bfa9190614418565b6bffffffffffffffffffffffff16905250612c158582614d4e565b83606001818151612c269190614418565b6bffffffffffffffffffffffff90811690915273ffffffffffffffffffffffffffffffffffffffff89166000908152600b602090815260409182902087518154928901519389015160608a015186166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff919096166201000002167fffffffffffff000000000000000000000000000000000000000000000000ffff60ff95909516610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909416939093171792909216179190911790555050505b60400151949350505050565b6000808a8a8a8a8a8a8a8a8a604051602001612d6c99989796959493929190614d7e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179b9a5050505050505050505050565b60006120c9825490565b6000612e0883836132e0565b9392505050565b6000612e088373ffffffffffffffffffffffffffffffffffffffff841661330a565b6000612e088373ffffffffffffffffffffffffffffffffffffffff8416613404565b6000818160045b600f811015612ee0577fff000000000000000000000000000000000000000000000000000000000000008216838260208110612e9857612e98614450565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612ece57506000949350505050565b80612ed8816146dc565b915050612e5a565b5081600f1a6001811115612ef657612ef6614c0a565b949350505050565b600080612f1088878b60c00151613453565b9050600080612f2b8b8a63ffffffff16858a8a60018b6134df565b9092509050612f3a8183614418565b9b9a5050505050505050505050565b600080808085608001516001811115612f6457612f64614c0a565b03612f8a57612f76888888888861376c565b612f85576000925090506130be565b613002565b600185608001516001811115612fa257612fa2614c0a565b03612fd0576000612fb5898989886138f5565b9250905080612fca57506000925090506130be565b50613002565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516040015163ffffffff16871061305757877fc3237c8807c467c1b39b8d0395eff077313e691bf0a7388106792564ebfd5636876040516130449190613c24565b60405180910390a26000925090506130be565b84604001516bffffffffffffffffffffffff16856000015160a001516bffffffffffffffffffffffff1610156130b757877f377c8b0c126ae5248d27aca1c76fac4608aff85673ee3caf09747e1044549e02876040516130449190613c24565b6001925090505b9550959350505050565b6000816080015160018111156130e0576130e0614c0a565b0361314457600083815260046020526040902060010180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000063ffffffff851602179055505050565b60018160800151600181111561315c5761315c614c0a565b036131c85760e08101805160009081526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055915191517fa4a4e334c0e330143f9437484fe516c13bc560b86b5b0daf58e7084aaac228f29190a25b505050565b60006131da848484613453565b905080851015612ef65750929392505050565b600080613208888760a001518860c0015188888860016134df565b909250905060006132198284614418565b600089815260046020526040902060010180549192508291600c9061325d9084906c0100000000000000000000000090046bffffffffffffffffffffffff16614cfe565b82546101009290920a6bffffffffffffffffffffffff81810219909316918316021790915560008a8152600460205260408120600101805485945090926132a691859116614418565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050965096945050505050565b60008260000182815481106132f7576132f7614450565b9060005260206000200154905092915050565b600081815260018301602052604081205480156133f357600061332e600183614c54565b855490915060009061334290600190614c54565b90508181146133a757600086600001828154811061336257613362614450565b906000526020600020015490508087600001848154811061338557613385614450565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806133b8576133b8614e13565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506120c9565b60009150506120c9565b5092915050565b600081815260018301602052604081205461344b575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556120c9565b5060006120c9565b6000808085600181111561346957613469614c0a565b03613478575062015f90613497565b600185600181111561348c5761348c614c0a565b03612fd057506201af405b6134a863ffffffff85166014614c67565b6134b384600161447f565b6134c29060ff16611d4c614c67565b6134cc908361443d565b6134d6919061443d565b95945050505050565b60008060008960a0015161ffff16876134f89190614c67565b90508380156135065750803a105b1561350e57503a5b60008415613591578a610140015173ffffffffffffffffffffffffffffffffffffffff166318b8f6136040518163ffffffff1660e01b8152600401602060405180830381865afa158015613566573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358a9190614714565b905061364d565b6101408b01516016546040517f1254414000000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff16600482015273ffffffffffffffffffffffffffffffffffffffff90911690631254414090602401602060405180830381865afa158015613613573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136379190614714565b8b60a0015161ffff1661364a9190614c67565b90505b61365b61ffff871682614cad565b90506000878261366b8c8e61443d565b6136759086614c67565b61367f919061443d565b61369190670de0b6b3a7640000614c67565b61369b9190614cad565b905060008c6040015163ffffffff1664e8d4a510006136ba9190614c67565b898e6020015163ffffffff16858f886136d39190614c67565b6136dd919061443d565b6136eb90633b9aca00614c67565b6136f59190614c67565b6136ff9190614cad565b613709919061443d565b90506b033b2e3c9fd0803ce8000000613722828461443d565b111561375a576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b600080848060200190518101906137839190614e42565b845160c00151815191925063ffffffff908116911610156137e057867f405288ea7be309e16cfdf481367f90a413e1d4634fcdaf8966546db9b93012e8866040516137ce9190613c24565b60405180910390a260009150506134d6565b82610120015180156138a157506020810151158015906138a15750602081015161014084015182516040517f85df51fd00000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff909116906385df51fd90602401602060405180830381865afa15801561387a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061389e9190614714565b14155b806138b35750805163ffffffff168611155b156138e857867f6aa7f60c176da7af894b384daea2249497448137f5943c1237ada8bc92bdc301866040516137ce9190613c24565b5060019695505050505050565b60008060008480602001905181019061390e9190614e9a565b905060008782600001518360200151846040015160405160200161397094939291909384526020840192909252604083015260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016606082015260640190565b6040516020818303038152906040528051906020012090508461012001518015613a4c5750608082015115801590613a4c5750608082015161014086015160608401516040517f85df51fd00000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015273ffffffffffffffffffffffffffffffffffffffff909116906385df51fd90602401602060405180830381865afa158015613a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a499190614714565b14155b80613a61575086826060015163ffffffff1610155b15613aab57877f6aa7f60c176da7af894b384daea2249497448137f5943c1237ada8bc92bdc30187604051613a969190613c24565b60405180910390a2600093509150613afa9050565b60008181526008602052604090205460ff1615613af257877f405288ea7be309e16cfdf481367f90a413e1d4634fcdaf8966546db9b93012e887604051613a969190613c24565b600193509150505b94509492505050565b5080546000825590600052602060002090810190610b229190613bab565b828054828255906000526020600020908101928215613b9b579160200282015b82811115613b9b57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190613b41565b50613ba7929150613bab565b5090565b5b80821115613ba75760008155600101613bac565b6000815180845260005b81811015613be657602081850181015186830182015201613bca565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000612e086020830184613bc0565b73ffffffffffffffffffffffffffffffffffffffff81168114610b2257600080fd5b8035613c6481613c37565b919050565b60008083601f840112613c7b57600080fd5b50813567ffffffffffffffff811115613c9357600080fd5b602083019150836020828501011115613cab57600080fd5b9250929050565b60008060008060608587031215613cc857600080fd5b8435613cd381613c37565b935060208501359250604085013567ffffffffffffffff811115613cf657600080fd5b613d0287828801613c69565b95989497509550505050565b600080600060408486031215613d2357600080fd5b83359250602084013567ffffffffffffffff811115613d4157600080fd5b613d4d86828701613c69565b9497909650939450505050565b60008083601f840112613d6c57600080fd5b50813567ffffffffffffffff811115613d8457600080fd5b6020830191508360208260051b8501011115613cab57600080fd5b60008060008060008060008060e0898b031215613dbb57600080fd5b606089018a811115613dcc57600080fd5b8998503567ffffffffffffffff80821115613de657600080fd5b613df28c838d01613c69565b909950975060808b0135915080821115613e0b57600080fd5b613e178c838d01613d5a565b909750955060a08b0135915080821115613e3057600080fd5b50613e3d8b828c01613d5a565b999c989b50969995989497949560c00135949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610220810167ffffffffffffffff81118282101715613ea957613ea9613e56565b60405290565b60405160c0810167ffffffffffffffff81118282101715613ea957613ea9613e56565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613f1957613f19613e56565b604052919050565b600067ffffffffffffffff821115613f3b57613f3b613e56565b5060051b60200190565b600082601f830112613f5657600080fd5b81356020613f6b613f6683613f21565b613ed2565b82815260059290921b84018101918181019086841115613f8a57600080fd5b8286015b84811015613fae578035613fa181613c37565b8352918301918301613f8e565b509695505050505050565b803560ff81168114613c6457600080fd5b600082601f830112613fdb57600080fd5b813567ffffffffffffffff811115613ff557613ff5613e56565b61402660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613ed2565b81815284602083860101111561403b57600080fd5b816020850160208301376000918101602001919091529392505050565b803567ffffffffffffffff81168114613c6457600080fd5b60008060008060008060c0878903121561408957600080fd5b863567ffffffffffffffff808211156140a157600080fd5b6140ad8a838b01613f45565b975060208901359150808211156140c357600080fd5b6140cf8a838b01613f45565b96506140dd60408a01613fb9565b955060608901359150808211156140f357600080fd5b6140ff8a838b01613fca565b945061410d60808a01614058565b935060a089013591508082111561412357600080fd5b5061413089828a01613fca565b9150509295509295509295565b60006020828403121561414f57600080fd5b8135612e0881613c37565b63ffffffff81168114610b2257600080fd5b8035613c648161415a565b62ffffff81168114610b2257600080fd5b8035613c6481614177565b61ffff81168114610b2257600080fd5b8035613c6481614193565b6bffffffffffffffffffffffff81168114610b2257600080fd5b8035613c64816141ae565b8015158114610b2257600080fd5b8035613c64816141d3565b600061022082840312156141ff57600080fd5b614207613e85565b90506142128261416c565b81526142206020830161416c565b60208201526142316040830161416c565b604082015261424260608301614188565b6060820152614253608083016141a3565b608082015261426460a083016141c8565b60a082015261427560c0830161416c565b60c082015261428660e0830161416c565b60e082015261010061429981840161416c565b908201526101206142ab83820161416c565b90820152610140828101359082015261016080830135908201526101806142d3818401613c59565b908201526101a08281013567ffffffffffffffff8111156142f357600080fd5b6142ff85828601613f45565b8284015250506101c0614313818401613c59565b908201526101e0614325838201613c59565b908201526102006143378382016141e1565b9082015292915050565b60008060008060008060c0878903121561435a57600080fd5b863567ffffffffffffffff8082111561437257600080fd5b61437e8a838b01613f45565b9750602089013591508082111561439457600080fd5b6143a08a838b01613f45565b96506143ae60408a01613fb9565b955060608901359150808211156143c457600080fd5b6140ff8a838b016141ec565b6000602082840312156143e257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6bffffffffffffffffffffffff8181168382160190808211156133fd576133fd6143e9565b808201808211156120c9576120c96143e9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60ff81811683821601908111156120c9576120c96143e9565b8051613c648161415a565b8051613c6481614177565b8051613c6481614193565b8051613c64816141ae565b8051613c6481613c37565b600082601f8301126144e057600080fd5b815160206144f0613f6683613f21565b82815260059290921b8401810191818101908684111561450f57600080fd5b8286015b84811015613fae57805161452681613c37565b8352918301918301614513565b8051613c64816141d3565b60006020828403121561455057600080fd5b815167ffffffffffffffff8082111561456857600080fd5b90830190610220828603121561457d57600080fd5b614585613e85565b61458e83614498565b815261459c60208401614498565b60208201526145ad60408401614498565b60408201526145be606084016144a3565b60608201526145cf608084016144ae565b60808201526145e060a084016144b9565b60a08201526145f160c08401614498565b60c082015261460260e08401614498565b60e0820152610100614615818501614498565b90820152610120614627848201614498565b908201526101408381015190820152610160808401519082015261018061464f8185016144c4565b908201526101a0838101518381111561466757600080fd5b614673888287016144cf565b8284015250506101c091506146898284016144c4565b828201526101e0915061469d8284016144c4565b8282015261020091506146b1828401614533565b91810191909152949350505050565b60ff81811683821602908116908181146133fd576133fd6143e9565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361470d5761470d6143e9565b5060010190565b60006020828403121561472657600080fd5b5051919050565b63ffffffff8181168382160190808211156133fd576133fd6143e9565b600081518084526020808501945080840160005b8381101561479057815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161475e565b509495945050505050565b602081526147b260208201835163ffffffff169052565b600060208301516147cb604084018263ffffffff169052565b50604083015163ffffffff8116606084015250606083015162ffffff8116608084015250608083015161ffff811660a08401525060a08301516bffffffffffffffffffffffff811660c08401525060c083015163ffffffff811660e08401525060e08301516101006148448185018363ffffffff169052565b840151905061012061485d8482018363ffffffff169052565b84015190506101406148768482018363ffffffff169052565b840151610160848101919091528401516101808085019190915284015190506101a06148b98185018373ffffffffffffffffffffffffffffffffffffffff169052565b808501519150506102206101c081818601526148d961024086018461474a565b908601519092506101e06149048682018373ffffffffffffffffffffffffffffffffffffffff169052565b860151905061020061492d8682018373ffffffffffffffffffffffffffffffffffffffff169052565b90950151151593019290925250919050565b600061012063ffffffff808d1684528b6020850152808b1660408501525080606084015261496f8184018a61474a565b90508281036080840152614983818961474a565b905060ff871660a084015282810360c08401526149a08187613bc0565b905067ffffffffffffffff851660e08401528281036101008401526149c58185613bc0565b9c9b505050505050505050505050565b828152604060208201526000612ef66040830184613bc0565b60008060408385031215614a0157600080fd5b8251614a0c816141d3565b6020939093015192949293505050565b8183823760009101908152919050565b8281526080810160608360208401379392505050565b600082601f830112614a5357600080fd5b81356020614a63613f6683613f21565b82815260059290921b84018101918181019086841115614a8257600080fd5b8286015b84811015613fae5780358352918301918301614a86565b600082601f830112614aae57600080fd5b81356020614abe613f6683613f21565b82815260059290921b84018101918181019086841115614add57600080fd5b8286015b84811015613fae57803567ffffffffffffffff811115614b015760008081fd5b614b0f8986838b0101613fca565b845250918301918301614ae1565b600060208284031215614b2f57600080fd5b813567ffffffffffffffff80821115614b4757600080fd5b9083019060c08286031215614b5b57600080fd5b614b63613eaf565b8235815260208301356020820152604083013582811115614b8357600080fd5b614b8f87828601614a42565b604083015250606083013582811115614ba757600080fd5b614bb387828601614a42565b606083015250608083013582811115614bcb57600080fd5b614bd787828601614a9d565b60808301525060a083013582811115614bef57600080fd5b614bfb87828601614a9d565b60a08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b61ffff8181168382160190808211156133fd576133fd6143e9565b818103818111156120c9576120c96143e9565b80820281158282048414176120c9576120c96143e9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082614cbc57614cbc614c7e565b500490565b6bffffffffffffffffffffffff85168152836020820152826040820152608060608201526000614cf46080830184613bc0565b9695505050505050565b6bffffffffffffffffffffffff8281168282160390808211156133fd576133fd6143e9565b60006bffffffffffffffffffffffff80841680614d4257614d42614c7e565b92169190910492915050565b6bffffffffffffffffffffffff818116838216028082169190828114614d7657614d766143e9565b505092915050565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152614dc58285018b61474a565b91508382036080850152614dd9828a61474a565b915060ff881660a085015283820360c0850152614df68288613bc0565b90861660e085015283810361010085015290506149c58185613bc0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600060408284031215614e5457600080fd5b6040516040810181811067ffffffffffffffff82111715614e7757614e77613e56565b6040528251614e858161415a565b81526020928301519281019290925250919050565b600060a08284031215614eac57600080fd5b60405160a0810181811067ffffffffffffffff82111715614ecf57614ecf613e56565b806040525082518152602083015160208201526040830151614ef08161415a565b60408201526060830151614f038161415a565b6060820152608092830151928101929092525091905056fea164736f6c6343000813000a",
}
var AutomationRegistryABI = AutomationRegistryMetaData.ABI
@@ -670,6 +671,123 @@ func (_AutomationRegistry *AutomationRegistryFilterer) ParseCancelledUpkeepRepor
return event, nil
}
+type AutomationRegistryChainSpecificModuleUpdatedIterator struct {
+ Event *AutomationRegistryChainSpecificModuleUpdated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *AutomationRegistryChainSpecificModuleUpdatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(AutomationRegistryChainSpecificModuleUpdated)
+ 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(AutomationRegistryChainSpecificModuleUpdated)
+ 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 *AutomationRegistryChainSpecificModuleUpdatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *AutomationRegistryChainSpecificModuleUpdatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type AutomationRegistryChainSpecificModuleUpdated struct {
+ NewModule common.Address
+ Raw types.Log
+}
+
+func (_AutomationRegistry *AutomationRegistryFilterer) FilterChainSpecificModuleUpdated(opts *bind.FilterOpts) (*AutomationRegistryChainSpecificModuleUpdatedIterator, error) {
+
+ logs, sub, err := _AutomationRegistry.contract.FilterLogs(opts, "ChainSpecificModuleUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return &AutomationRegistryChainSpecificModuleUpdatedIterator{contract: _AutomationRegistry.contract, event: "ChainSpecificModuleUpdated", logs: logs, sub: sub}, nil
+}
+
+func (_AutomationRegistry *AutomationRegistryFilterer) WatchChainSpecificModuleUpdated(opts *bind.WatchOpts, sink chan<- *AutomationRegistryChainSpecificModuleUpdated) (event.Subscription, error) {
+
+ logs, sub, err := _AutomationRegistry.contract.WatchLogs(opts, "ChainSpecificModuleUpdated")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(AutomationRegistryChainSpecificModuleUpdated)
+ if err := _AutomationRegistry.contract.UnpackLog(event, "ChainSpecificModuleUpdated", 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 (_AutomationRegistry *AutomationRegistryFilterer) ParseChainSpecificModuleUpdated(log types.Log) (*AutomationRegistryChainSpecificModuleUpdated, error) {
+ event := new(AutomationRegistryChainSpecificModuleUpdated)
+ if err := _AutomationRegistry.contract.UnpackLog(event, "ChainSpecificModuleUpdated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
type AutomationRegistryConfigSetIterator struct {
Event *AutomationRegistryConfigSet
@@ -4731,6 +4849,8 @@ func (_AutomationRegistry *AutomationRegistry) ParseLog(log types.Log) (generate
return _AutomationRegistry.ParseAdminPrivilegeConfigSet(log)
case _AutomationRegistry.abi.Events["CancelledUpkeepReport"].ID:
return _AutomationRegistry.ParseCancelledUpkeepReport(log)
+ case _AutomationRegistry.abi.Events["ChainSpecificModuleUpdated"].ID:
+ return _AutomationRegistry.ParseChainSpecificModuleUpdated(log)
case _AutomationRegistry.abi.Events["ConfigSet"].ID:
return _AutomationRegistry.ParseConfigSet(log)
case _AutomationRegistry.abi.Events["DedupKeyAdded"].ID:
@@ -4807,6 +4927,10 @@ func (AutomationRegistryCancelledUpkeepReport) Topic() common.Hash {
return common.HexToHash("0xc3237c8807c467c1b39b8d0395eff077313e691bf0a7388106792564ebfd5636")
}
+func (AutomationRegistryChainSpecificModuleUpdated) Topic() common.Hash {
+ return common.HexToHash("0xdefc28b11a7980dbe0c49dbbd7055a1584bc8075097d1e8b3b57fb7283df2ad7")
+}
+
func (AutomationRegistryConfigSet) Topic() common.Hash {
return common.HexToHash("0x1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e05")
}
@@ -4978,6 +5102,12 @@ type AutomationRegistryInterface interface {
ParseCancelledUpkeepReport(log types.Log) (*AutomationRegistryCancelledUpkeepReport, error)
+ FilterChainSpecificModuleUpdated(opts *bind.FilterOpts) (*AutomationRegistryChainSpecificModuleUpdatedIterator, error)
+
+ WatchChainSpecificModuleUpdated(opts *bind.WatchOpts, sink chan<- *AutomationRegistryChainSpecificModuleUpdated) (event.Subscription, error)
+
+ ParseChainSpecificModuleUpdated(log types.Log) (*AutomationRegistryChainSpecificModuleUpdated, error)
+
FilterConfigSet(opts *bind.FilterOpts) (*AutomationRegistryConfigSetIterator, error)
WatchConfigSet(opts *bind.WatchOpts, sink chan<- *AutomationRegistryConfigSet) (event.Subscription, error)
diff --git a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go
index 1475c56499f..6a53141253b 100644
--- a/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go
+++ b/core/gethwrappers/generated/vrf_coordinator_v2_5/vrf_coordinator_v2_5.go
@@ -30,11 +30,6 @@ var (
_ = abi.ConvertType
)
-type VRFCoordinatorV25FeeConfig struct {
- FulfillmentFlatFeeLinkPPM uint32
- FulfillmentFlatFeeNativePPM uint32
-}
-
type VRFCoordinatorV25RequestCommitment struct {
BlockNum uint64
SubId *big.Int
@@ -66,8 +61,8 @@ type VRFV2PlusClientRandomWordsRequest struct {
}
var VRFCoordinatorV25MetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"want\",\"type\":\"uint256\"}],\"name\":\"InsufficientGasForConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structVRFCoordinatorV2_5.FeeConfig\",\"name\":\"feeConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"deregisterMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"deregisterProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2_5.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRequestConfig\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrationVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fallbackWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeConfig\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_provingKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"}],\"internalType\":\"structVRFCoordinatorV2_5.FeeConfig\",\"name\":\"feeConfig\",\"type\":\"tuple\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b506040516200606038038062006060833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615e85620001db6000396000818161056601526137d10152615e856000f3fe60806040526004361061023c5760003560e01c80637bce14d11161012f578063b08c8795116100b1578063b08c87951461076d578063b2a7cac51461078d578063bec4c08c146107ad578063caf70c4a146107cd578063cb631797146107ed578063d98e620e1461080d578063da2f26101461082d578063dac83d291461085d578063dc311dd31461087d578063e72f6e30146108ae578063ee9d2d38146108ce578063f2fde38b146108fb57600080fd5b80637bce14d1146106025780638402595e1461062257806386fe91c7146106425780638da5cb5b1461066257806395b55cfc146106805780639b1c385e146106935780639d40a6fd146106b3578063a21a23e4146106eb578063a4c0ed3614610700578063aa433aff14610720578063aefb212f1461074057600080fd5b8063330987b3116101c3578063330987b314610444578063405b84fa1461046457806340d6bb821461048457806341af6c87146104af57806351cff8d9146104df5780635d06b4ab146104ff57806364d51a2a1461051f5780636598274414610534578063689c4517146105545780636b6feccc1461058857806372e9d565146105cd57806379ba5097146105ed57600080fd5b80620122911461024157806304104edb1461026e578063043bd6ae14610290578063088070f5146102b457806308821d58146103345780630ae095401461035457806315c48b841461037457806318e3dd271461039c5780631b6b6d23146103db578063294daa49146104085780632f622e6b14610424575b600080fd5b34801561024d57600080fd5b5061025661091b565b60405161026593929190615964565b60405180910390f35b34801561027a57600080fd5b5061028e610289366004615295565b610997565b005b34801561029c57600080fd5b506102a660105481565b604051908152602001610265565b3480156102c057600080fd5b50600c546102fc9061ffff81169063ffffffff62010000820481169160ff600160301b82041691600160381b8204811691600160581b90041685565b6040805161ffff909616865263ffffffff9485166020870152921515928501929092528216606084015216608082015260a001610265565b34801561034057600080fd5b5061028e61034f366004615373565b610b4d565b34801561036057600080fd5b5061028e61036f366004615621565b610cc4565b34801561038057600080fd5b5061038960c881565b60405161ffff9091168152602001610265565b3480156103a857600080fd5b50600a546103c390600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610265565b3480156103e757600080fd5b506002546103fb906001600160a01b031681565b6040516102659190615852565b34801561041457600080fd5b5060405160018152602001610265565b34801561043057600080fd5b5061028e61043f366004615295565b610d89565b34801561045057600080fd5b506103c361045f366004615451565b610efd565b34801561047057600080fd5b5061028e61047f366004615621565b6113bf565b34801561049057600080fd5b5061049a6101f481565b60405163ffffffff9091168152602001610265565b3480156104bb57600080fd5b506104cf6104ca3660046153d4565b6117aa565b6040519015158152602001610265565b3480156104eb57600080fd5b5061028e6104fa366004615295565b61194b565b34801561050b57600080fd5b5061028e61051a366004615295565b611afc565b34801561052b57600080fd5b50610389606481565b34801561054057600080fd5b5061028e61054f3660046152b2565b611bb3565b34801561056057600080fd5b506103fb7f000000000000000000000000000000000000000000000000000000000000000081565b34801561059457600080fd5b506011546105b09063ffffffff80821691600160201b90041682565b6040805163ffffffff938416815292909116602083015201610265565b3480156105d957600080fd5b506003546103fb906001600160a01b031681565b3480156105f957600080fd5b5061028e611c13565b34801561060e57600080fd5b5061028e61061d366004615373565b611cbd565b34801561062e57600080fd5b5061028e61063d366004615295565b611daa565b34801561064e57600080fd5b50600a546103c3906001600160601b031681565b34801561066e57600080fd5b506000546001600160a01b03166103fb565b61028e61068e3660046153d4565b611ebc565b34801561069f57600080fd5b506102a66106ae36600461552e565b612003565b3480156106bf57600080fd5b506007546106d3906001600160401b031681565b6040516001600160401b039091168152602001610265565b3480156106f757600080fd5b506102a6612395565b34801561070c57600080fd5b5061028e61071b3660046152eb565b6125e3565b34801561072c57600080fd5b5061028e61073b3660046153d4565b612783565b34801561074c57600080fd5b5061076061075b366004615646565b6127e3565b60405161026591906158c9565b34801561077957600080fd5b5061028e610788366004615583565b6128e4565b34801561079957600080fd5b5061028e6107a83660046153d4565b612a67565b3480156107b957600080fd5b5061028e6107c8366004615621565b612b8b565b3480156107d957600080fd5b506102a66107e836600461539b565b612d22565b3480156107f957600080fd5b5061028e610808366004615621565b612d52565b34801561081957600080fd5b506102a66108283660046153d4565b61303f565b34801561083957600080fd5b506104cf6108483660046153d4565b600d6020526000908152604090205460ff1681565b34801561086957600080fd5b5061028e610878366004615621565b613060565b34801561088957600080fd5b5061089d6108983660046153d4565b613170565b604051610265959493929190615ae6565b3480156108ba57600080fd5b5061028e6108c9366004615295565b61326b565b3480156108da57600080fd5b506102a66108e93660046153d4565b600f6020526000908152604090205481565b34801561090757600080fd5b5061028e610916366004615295565b61344c565b600c54600e805460408051602080840282018101909252828152600094859460609461ffff8316946201000090930463ffffffff1693919283919083018282801561098557602002820191906000526020600020905b815481526020019060010190808311610971575b50505050509050925092509250909192565b61099f61345d565b60125460005b81811015610b2557826001600160a01b0316601282815481106109ca576109ca615de1565b6000918252602090912001546001600160a01b03161415610b135760126109f2600184615cae565b81548110610a0257610a02615de1565b600091825260209091200154601280546001600160a01b039092169183908110610a2e57610a2e615de1565b600091825260209091200180546001600160a01b0319166001600160a01b0392909216919091179055826012610a65600185615cae565b81548110610a7557610a75615de1565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506012805480610ab457610ab4615dcb565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610b06908590615852565b60405180910390a1505050565b80610b1d81615d49565b9150506109a5565b5081604051635428d44960e01b8152600401610b419190615852565b60405180910390fd5b50565b610b5561345d565b604080518082018252600091610b84919084906002908390839080828437600092019190915250612d22915050565b6000818152600d602052604090205490915060ff16610bb957604051631dfd6e1360e21b815260048101829052602401610b41565b6000818152600d60205260408120805460ff191690555b600e54811015610c8b5781600e8281548110610bee57610bee615de1565b90600052602060002001541415610c7957600e805460009190610c1390600190615cae565b81548110610c2357610c23615de1565b9060005260206000200154905080600e8381548110610c4457610c44615de1565b600091825260209091200155600e805480610c6157610c61615dcb565b60019003818190600052602060002001600090559055505b80610c8381615d49565b915050610bd0565b506040518181527fbd242ec01625c15ecbc02cf700ac8b02c86f7346fa91a08e186810221ae509d0906020015b60405180910390a15050565b60008281526005602052604090205482906001600160a01b031680610cfc57604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b03821614610d275780604051636c51fda960e11b8152600401610b419190615852565b600c54600160301b900460ff1615610d525760405163769dd35360e11b815260040160405180910390fd5b610d5b846117aa565b15610d7957604051631685ecdd60e31b815260040160405180910390fd5b610d8384846134b2565b50505050565b600c54600160301b900460ff1615610db45760405163769dd35360e11b815260040160405180910390fd5b610dbc61345d565b600b54600160601b90046001600160601b0316610dec57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610e0f8380615cc5565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610e579190615cc5565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610ed1576040519150601f19603f3d011682016040523d82523d6000602084013e610ed6565b606091505b5050905080610ef85760405163950b247960e01b815260040160405180910390fd5b505050565b600c54600090600160301b900460ff1615610f2b5760405163769dd35360e11b815260040160405180910390fd5b60005a90506000610f3c858561366d565b90506000846060015163ffffffff166001600160401b03811115610f6257610f62615df7565b604051908082528060200260200182016040528015610f8b578160200160208202803683370190505b50905060005b856060015163ffffffff1681101561100b57826040015181604051602001610fc3929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c828281518110610fee57610fee615de1565b60209081029190910101528061100381615d49565b915050610f91565b50602080830180516000908152600f9092526040808320839055905190518291631fe543e360e01b91611043919086906024016159ee565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559088015160808901519192506000916110a89163ffffffff1690846138f2565b600c805460ff60301b19169055602089810151600090815260069091526040902054909150600160c01b90046001600160401b03166110e8816001615c37565b6020808b0151600090815260069091526040812080546001600160401b0393909316600160c01b026001600160c01b039093169290921790915560a08a0151805161113590600190615cae565b8151811061114557611145615de1565b602091010151600c5460f89190911c6001149150600090611176908a90600160581b900463ffffffff163a85613940565b9050811561126e576020808c01516000908152600690915260409020546001600160601b03808316600160601b9092041610156111c657604051631e9acf1760e31b815260040160405180910390fd5b60208b81015160009081526006909152604090208054829190600c906111fd908490600160601b90046001600160601b0316615cc5565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b600c8282829054906101000a90046001600160601b03166112459190615c59565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550611349565b6020808c01516000908152600690915260409020546001600160601b03808316911610156112af57604051631e9acf1760e31b815260040160405180910390fd5b6020808c0151600090815260069091526040812080548392906112dc9084906001600160601b0316615cc5565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b60008282829054906101000a90046001600160601b03166113249190615c59565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b8a6020015188602001517f49580fdfd9497e1ed5c1b1cec0495087ae8e3f1267470ec2fb015db32e3d6aa78a6040015184886040516113a6939291909283526001600160601b039190911660208301521515604082015260600190565b60405180910390a3985050505050505050505b92915050565b600c54600160301b900460ff16156113ea5760405163769dd35360e11b815260040160405180910390fd5b6113f38161398f565b6114125780604051635428d44960e01b8152600401610b419190615852565b60008060008061142186613170565b945094505093509350336001600160a01b0316826001600160a01b0316146114845760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610b41565b61148d866117aa565b156114d35760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610b41565b60006040518060c001604052806114e8600190565b60ff168152602001888152602001846001600160a01b03168152602001838152602001866001600160601b03168152602001856001600160601b0316815250905060008160405160200161153c91906158ef565b6040516020818303038152906040529050611556886139f9565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061158f9085906004016158dc565b6000604051808303818588803b1580156115a857600080fd5b505af11580156115bc573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506115e5905057506001600160601b03861615155b156116af5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061161c908a908a90600401615899565b602060405180830381600087803b15801561163657600080fd5b505af115801561164a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061166e91906153b7565b6116af5760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610b41565b600c805460ff60301b1916600160301b17905560005b8351811015611758578381815181106116e0576116e0615de1565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b81526004016117139190615852565b600060405180830381600087803b15801561172d57600080fd5b505af1158015611741573d6000803e3d6000fd5b50505050808061175090615d49565b9150506116c5565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906117989089908b90615866565b60405180910390a15050505050505050565b6000818152600560209081526040808320815160608101835281546001600160a01b039081168252600183015416818501526002820180548451818702810187018652818152879693958601939092919083018282801561183457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611816575b505050505081525050905060005b8160400151518110156119415760005b600e5481101561192e5760006118f7600e838154811061187457611874615de1565b90600052602060002001548560400151858151811061189557611895615de1565b60200260200101518860046000896040015189815181106118b8576118b8615de1565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081208d82529092529020546001600160401b0316613c47565b506000818152600f60205260409020549091501561191b5750600195945050505050565b508061192681615d49565b915050611852565b508061193981615d49565b915050611842565b5060009392505050565b600c54600160301b900460ff16156119765760405163769dd35360e11b815260040160405180910390fd5b61197e61345d565b6002546001600160a01b03166119a75760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b03166119d057604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006119ec8380615cc5565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b0316611a349190615cc5565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611a899085908590600401615899565b602060405180830381600087803b158015611aa357600080fd5b505af1158015611ab7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611adb91906153b7565b611af857604051631e9acf1760e31b815260040160405180910390fd5b5050565b611b0461345d565b611b0d8161398f565b15611b2d578060405163ac8a27ef60e01b8152600401610b419190615852565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af0162590611ba8908390615852565b60405180910390a150565b611bbb61345d565b6002546001600160a01b031615611be557604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b03163314611c665760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610b41565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611cc561345d565b604080518082018252600091611cf4919084906002908390839080828437600092019190915250612d22915050565b6000818152600d602052604090205490915060ff1615611d2a57604051634a0b8fa760e01b815260048101829052602401610b41565b6000818152600d6020526040808220805460ff19166001908117909155600e805491820181559092527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101829055517fc9583fd3afa3d7f16eb0b88d0268e7d05c09bafa4b21e092cbd1320e1bc8089d90610cb89083815260200190565b611db261345d565b600a544790600160601b90046001600160601b031681811115611df2576040516354ced18160e11b81526004810182905260248101839052604401610b41565b81811015610ef8576000611e068284615cae565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611e55576040519150601f19603f3d011682016040523d82523d6000602084013e611e5a565b606091505b5050905080611e7c5760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611ead929190615866565b60405180910390a15050505050565b600c54600160301b900460ff1615611ee75760405163769dd35360e11b815260040160405180910390fd5b6000818152600560205260409020546001600160a01b0316611f1c57604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611f4b8385615c59565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611f939190615c59565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611fe69190615c1f565b604080519283526020830191909152015b60405180910390a25050565b600c54600090600160301b900460ff16156120315760405163769dd35360e11b815260040160405180910390fd5b6020808301356000908152600590915260409020546001600160a01b031661206c57604051630fb532db60e11b815260040160405180910390fd5b3360009081526004602090815260408083208583013584529091529020546001600160401b0316806120b9578260200135336040516379bfd40160e01b8152600401610b419291906159c3565b600c5461ffff166120d06060850160408601615568565b61ffff1610806120f3575060c86120ed6060850160408601615568565b61ffff16115b15612139576121086060840160408501615568565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610b41565b600c5462010000900463ffffffff166121586080850160608601615668565b63ffffffff1611156121a8576121746080840160608501615668565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610b41565b6101f46121bb60a0850160808601615668565b63ffffffff161115612201576121d760a0840160808501615668565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610b41565b600061220e826001615c37565b9050600080612224863533602089013586613c47565b9092509050600061224061223b60a0890189615b3b565b613cc0565b9050600061224d82613d3d565b905083612258613dae565b60208a013561226d60808c0160608d01615668565b61227d60a08d0160808e01615668565b33866040516020016122959796959493929190615a46565b60405160208183030381529060405280519060200120600f600086815260200190815260200160002081905550336001600160a01b0316886020013589600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e87878d604001602081019061230c9190615568565b8e606001602081019061231f9190615668565b8f60800160208101906123329190615668565b8960405161234596959493929190615a07565b60405180910390a45050336000908152600460209081526040808320898301358452909152902080546001600160401b0319166001600160401b039490941693909317909255925050505b919050565b600c54600090600160301b900460ff16156123c35760405163769dd35360e11b815260040160405180910390fd5b6000336123d1600143615cae565b600754604051606093841b6001600160601b03199081166020830152924060348201523090931b909116605483015260c01b6001600160c01b031916606882015260700160408051601f198184030181529190528051602090910120600780549192506001600160401b0390911690600061244b83615d64565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550506000806001600160401b0381111561248a5761248a615df7565b6040519080825280602002602001820160405280156124b3578160200160208202803683370190505b506040805160608082018352600080835260208084018281528486018381528984526006835286842095518654925191516001600160601b039182166001600160c01b031990941693909317600160601b9190921602176001600160c01b0316600160c01b6001600160401b039092169190910217909355835191820184523382528183018181528285018681528883526005855294909120825181546001600160a01b03199081166001600160a01b0392831617835592516001830180549094169116179091559251805194955090936125949260028501920190614fd3565b506125a491506008905083613e3e565b50817f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d336040516125d59190615852565b60405180910390a250905090565b600c54600160301b900460ff161561260e5760405163769dd35360e11b815260040160405180910390fd5b6002546001600160a01b03163314612639576040516344b0e3c360e01b815260040160405180910390fd5b6020811461265a57604051638129bbcd60e01b815260040160405180910390fd5b6000612668828401846153d4565b6000818152600560205260409020549091506001600160a01b03166126a057604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b0316918691906126c78385615c59565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b031661270f9190615c59565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846127629190615c1f565b604080519283526020830191909152015b60405180910390a2505050505050565b61278b61345d565b6000818152600560205260409020546001600160a01b03166127c057604051630fb532db60e11b815260040160405180910390fd5b600081815260056020526040902054610b4a9082906001600160a01b03166134b2565b606060006127f16008613e4a565b905080841061281357604051631390f2a160e01b815260040160405180910390fd5b600061281f8486615c1f565b90508181118061282d575083155b6128375780612839565b815b905060006128478683615cae565b6001600160401b0381111561285e5761285e615df7565b604051908082528060200260200182016040528015612887578160200160208202803683370190505b50905060005b81518110156128da576128ab6128a38883615c1f565b600890613e54565b8282815181106128bd576128bd615de1565b6020908102919091010152806128d281615d49565b91505061288d565b5095945050505050565b6128ec61345d565b60c861ffff871611156129265760405163539c34bb60e11b815261ffff871660048201819052602482015260c86044820152606401610b41565b6000821361294a576040516321ea67b360e11b815260048101839052602401610b41565b6040805160a0808201835261ffff891680835263ffffffff89811660208086018290526000868801528a831660608088018290528b85166080988901819052600c805465ffffffffffff191688176201000087021768ffffffffffffffffff60301b1916600160381b850263ffffffff60581b191617600160581b83021790558a51601180548d8701519289166001600160401b031990911617600160201b92891692909202919091179081905560108d90558a519788528785019590955298860191909152840196909652938201879052838116928201929092529190921c90911660c08201527f777357bb93f63d088f18112d3dba38457aec633eb8f1341e1d418380ad328e789060e00160405180910390a1505050505050565b600c54600160301b900460ff1615612a925760405163769dd35360e11b815260040160405180910390fd5b6000818152600560205260409020546001600160a01b0316612ac757604051630fb532db60e11b815260040160405180910390fd5b6000818152600560205260409020600101546001600160a01b03163314612b1e576000818152600560205260409081902060010154905163d084e97560e01b8152610b41916001600160a01b031690600401615852565b6000818152600560205260409081902080546001600160a01b031980821633908117845560019093018054909116905591516001600160a01b039092169183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611ff791859161587f565b60008281526005602052604090205482906001600160a01b031680612bc357604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b03821614612bee5780604051636c51fda960e11b8152600401610b419190615852565b600c54600160301b900460ff1615612c195760405163769dd35360e11b815260040160405180910390fd5b60008481526005602052604090206002015460641415612c4c576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b03831660009081526004602090815260408083208784529091529020546001600160401b031615612c8357610d83565b6001600160a01b0383166000818152600460209081526040808320888452825280832080546001600160401b031916600190811790915560058352818420600201805491820181558452919092200180546001600160a01b0319169092179091555184907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e190612d14908690615852565b60405180910390a250505050565b600081604051602001612d3591906158bb565b604051602081830303815290604052805190602001209050919050565b60008281526005602052604090205482906001600160a01b031680612d8a57604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b03821614612db55780604051636c51fda960e11b8152600401610b419190615852565b600c54600160301b900460ff1615612de05760405163769dd35360e11b815260040160405180910390fd5b612de9846117aa565b15612e0757604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03831660009081526004602090815260408083208784529091529020546001600160401b0316612e555783836040516379bfd40160e01b8152600401610b419291906159c3565b600084815260056020908152604080832060020180548251818502810185019093528083529192909190830182828015612eb857602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612e9a575b50505050509050600060018251612ecf9190615cae565b905060005b8251811015612fdb57856001600160a01b0316838281518110612ef957612ef9615de1565b60200260200101516001600160a01b03161415612fc9576000838381518110612f2457612f24615de1565b6020026020010151905080600560008a81526020019081526020016000206002018381548110612f5657612f56615de1565b600091825260208083209190910180546001600160a01b0319166001600160a01b039490941693909317909255898152600590915260409020600201805480612fa157612fa1615dcb565b600082815260209020810160001990810180546001600160a01b031916905501905550612fdb565b80612fd381615d49565b915050612ed4565b506001600160a01b03851660009081526004602090815260408083208984529091529081902080546001600160401b03191690555186907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a790612773908890615852565b600e818154811061304f57600080fd5b600091825260209091200154905081565b60008281526005602052604090205482906001600160a01b03168061309857604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b038216146130c35780604051636c51fda960e11b8152600401610b419190615852565b600c54600160301b900460ff16156130ee5760405163769dd35360e11b815260040160405180910390fd5b6000848152600560205260409020600101546001600160a01b03848116911614610d83576000848152600560205260409081902060010180546001600160a01b0319166001600160a01b0386161790555184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612d14903390879061587f565b6000818152600560205260408120548190819081906060906001600160a01b03166131ae57604051630fb532db60e11b815260040160405180910390fd5b60008681526006602090815260408083205460058352928190208054600290910180548351818602810186019094528084526001600160601b0380871696600160601b810490911695600160c01b9091046001600160401b0316946001600160a01b039094169391839183018282801561325157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613233575b505050505090509450945094509450945091939590929450565b61327361345d565b6002546001600160a01b031661329c5760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a08231906132cd903090600401615852565b60206040518083038186803b1580156132e557600080fd5b505afa1580156132f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061331d91906153ed565b600a549091506001600160601b031681811115613357576040516354ced18160e11b81526004810182905260248101839052604401610b41565b81811015610ef857600061336b8284615cae565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061339e9087908590600401615866565b602060405180830381600087803b1580156133b857600080fd5b505af11580156133cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f091906153b7565b61340d57604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b436600848260405161343e929190615866565b60405180910390a150505050565b61345461345d565b610b4a81613e60565b6000546001600160a01b031633146134b05760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610b41565b565b6000806134be846139f9565b60025491935091506001600160a01b0316158015906134e557506001600160601b03821615155b156135945760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906135259086906001600160601b03871690600401615866565b602060405180830381600087803b15801561353f57600080fd5b505af1158015613553573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061357791906153b7565b61359457604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d80600081146135ea576040519150601f19603f3d011682016040523d82523d6000602084013e6135ef565b606091505b50509050806136115760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b038581166020830152841681830152905186917f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4919081900360600190a25050505050565b604080516060810182526000808252602082018190529181019190915260006136998460000151612d22565b6000818152600d602052604090205490915060ff166136ce57604051631dfd6e1360e21b815260048101829052602401610b41565b60008185608001516040516020016136f0929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061373657604051631b44092560e11b815260040160405180910390fd5b845160208087015160408089015160608a015160808b015160a08c01519351613765978a979096959101615a92565b60405160208183030381529060405280519060200120811461379a5760405163354a450b60e21b815260040160405180910390fd5b60006137a98660000151613f04565b905080613881578551604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561381b57600080fd5b505afa15801561382f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061385391906153ed565b90508061388157855160405163175dadad60e01b81526001600160401b039091166004820152602401610b41565b60008760800151826040516020016138a3929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006138ca8983613fe6565b6040805160608101825297885260208801969096529486019490945250929695505050505050565b60005a61138881101561390457600080fd5b61138881039050846040820482031161391c57600080fd5b50823b61392857600080fd5b60008083516020850160008789f190505b9392505050565b6000811561396d576011546139669086908690600160201b900463ffffffff1686614051565b9050613987565b601154613984908690869063ffffffff16866140f3565b90505b949350505050565b6000805b6012548110156139f057826001600160a01b0316601282815481106139ba576139ba615de1565b6000918252602090912001546001600160a01b031614156139de5750600192915050565b806139e881615d49565b915050613993565b50600092915050565b6000818152600560209081526040808320815160608101835281546001600160a01b03908116825260018301541681850152600282018054845181870281018701865281815287968796949594860193919290830182828015613a8557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613a67575b505050919092525050506000858152600660209081526040808320815160608101835290546001600160601b03808216808452600160601b8304909116948301859052600160c01b9091046001600160401b0316928201929092529096509094509192505b826040015151811015613b61576004600084604001518381518110613b1157613b11615de1565b6020908102919091018101516001600160a01b031682528181019290925260409081016000908120898252909252902080546001600160401b031916905580613b5981615d49565b915050613aea565b50600085815260056020526040812080546001600160a01b03199081168255600182018054909116905590613b996002830182615038565b5050600085815260066020526040812055613bb5600886614219565b50600a8054859190600090613bd49084906001600160601b0316615cc5565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555082600a600c8282829054906101000a90046001600160601b0316613c1c9190615cc5565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b60408051602081019091526000815281613ce957506040805160208101909152600081526113b9565b63125fa26760e31b613cfb8385615ced565b6001600160e01b03191614613d2357604051632923fee760e11b815260040160405180910390fd5b613d308260048186615bf5565b8101906139399190615406565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa82604051602401613d7691511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b600046613dba81614225565b15613e375760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613df957600080fd5b505afa158015613e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e3191906153ed565b91505090565b4391505090565b60006139398383614248565b60006113b9825490565b60006139398383614297565b6001600160a01b038116331415613eb35760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610b41565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613f1081614225565b15613fd757610100836001600160401b0316613f2a613dae565b613f349190615cae565b1180613f505750613f43613dae565b836001600160401b031610155b15613f5e5750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613f9f57600080fd5b505afa158015613fb3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061393991906153ed565b50506001600160401b03164090565b600061401a8360000151846020015185604001518660600151868860a001518960c001518a60e001518b61010001516142c1565b600383602001516040516020016140329291906159da565b60408051601f1981840301815291905280516020909101209392505050565b6000806140946000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506144dd92505050565b905060005a6140a38888615c1f565b6140ad9190615cae565b6140b79085615c8f565b905060006140d063ffffffff871664e8d4a51000615c8f565b9050826140dd8284615c1f565b6140e79190615c1f565b98975050505050505050565b6000806140fe6145a2565b905060008113614124576040516321ea67b360e11b815260048101829052602401610b41565b60006141666000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506144dd92505050565b9050600082825a6141778b8b615c1f565b6141819190615cae565b61418b9088615c8f565b6141959190615c1f565b6141a790670de0b6b3a7640000615c8f565b6141b19190615c7b565b905060006141ca63ffffffff881664e8d4a51000615c8f565b90506141e2816b033b2e3c9fd0803ce8000000615cae565b8211156142025760405163e80fa38160e01b815260040160405180910390fd5b61420c8183615c1f565b9998505050505050505050565b6000613939838361466d565b600061a4b1821480614239575062066eed82145b806113b957505062066eee1490565b600081815260018301602052604081205461428f575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556113b9565b5060006113b9565b60008260000182815481106142ae576142ae615de1565b9060005260206000200154905092915050565b6142ca89614760565b6143135760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610b41565b61431c88614760565b6143605760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610b41565b61436983614760565b6143b55760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610b41565b6143be82614760565b61440a5760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610b41565b614416878a8887614823565b61445e5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610b41565b600061446a8a87614946565b9050600061447d898b878b8689896149aa565b9050600061448e838d8d8a86614abd565b9050808a146144cf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610b41565b505050505050505050505050565b6000466144e981614225565b1561452857606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613f9f57600080fd5b61453181614afd565b156139f057600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615e31604891396040516020016145779291906157a8565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613f8791906158dc565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169283151592859283926001600160a01b03169163feaf968c9160048083019260a0929190829003018186803b15801561460057600080fd5b505afa158015614614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146389190615683565b50945090925084915050801561465c57506146538242615cae565b8463ffffffff16105b156139875750601054949350505050565b60008181526001830160205260408120548015614756576000614691600183615cae565b85549091506000906146a590600190615cae565b905081811461470a5760008660000182815481106146c5576146c5615de1565b90600052602060002001549050808760000184815481106146e8576146e8615de1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061471b5761471b615dcb565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506113b9565b60009150506113b9565b80516000906401000003d019116147ae5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610b41565b60208201516401000003d019116147fc5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610b41565b60208201516401000003d01990800961481c8360005b6020020151614b37565b1492915050565b60006001600160a01b0382166148695760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610b41565b60208401516000906001161561488057601c614883565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa15801561491e573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b61494e615056565b61497b6001848460405160200161496793929190615831565b604051602081830303815290604052614b5b565b90505b61498781614760565b6113b95780516040805160208101929092526149a39101614967565b905061497e565b6149b2615056565b825186516401000003d0199081900691061415614a115760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610b41565b614a1c878988614ba9565b614a615760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610b41565b614a6c848685614ba9565b614ab25760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610b41565b6140e7868484614cd1565b600060028686868587604051602001614adb969594939291906157d7565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a821480614b0f57506101a482145b80614b1c575062aa37dc82145b80614b28575061210582145b806113b957505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b614b63615056565b614b6c82614d94565b8152614b81614b7c826000614812565b614dcf565b602082018190526002900660011415612390576020810180516401000003d019039052919050565b600082614be65760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610b41565b83516020850151600090614bfc90600290615d8b565b15614c0857601c614c0b565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa158015614c7d573d6000803e3d6000fd5b505050602060405103519050600086604051602001614c9c9190615796565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b614cd9615056565b835160208086015185519186015160009384938493614cfa93909190614def565b919450925090506401000003d019858209600114614d565760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610b41565b60405180604001604052806401000003d01980614d7557614d75615db5565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d019811061239057604080516020808201939093528151808203840181529082019091528051910120614d9c565b60006113b9826002614de86401000003d0196001615c1f565b901c614ecf565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614e2f83838585614f66565b9098509050614e4088828e88614f8a565b9098509050614e5188828c87614f8a565b90985090506000614e648d878b85614f8a565b9098509050614e7588828686614f66565b9098509050614e8688828e89614f8a565b9098509050818114614ebb576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614ebf565b8196505b5050505050509450945094915050565b600080614eda615074565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614f0c615092565b60208160c0846005600019fa925082614f5c5760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610b41565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215615028579160200282015b8281111561502857825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614ff3565b506150349291506150b0565b5090565b5080546000825590600052602060002090810190610b4a91906150b0565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b8082111561503457600081556001016150b1565b803561239081615e0d565b600082601f8301126150e157600080fd5b6150e9615b88565b8083856040860111156150fb57600080fd5b60005b600281101561511d5781358452602093840193909101906001016150fe565b509095945050505050565b600082601f83011261513957600080fd5b81356001600160401b038082111561515357615153615df7565b604051601f8301601f19908116603f0116810190828211818310171561517b5761517b615df7565b8160405283815286602085880101111561519457600080fd5b836020870160208301376000602085830101528094505050505092915050565b600060c082840312156151c657600080fd5b6151ce615bb0565b905081356001600160401b0380821682146151e857600080fd5b8183526020840135602084015261520160408501615267565b604084015261521260608501615267565b6060840152615223608085016150c5565b608084015260a084013591508082111561523c57600080fd5b5061524984828501615128565b60a08301525092915050565b803561ffff8116811461239057600080fd5b803563ffffffff8116811461239057600080fd5b805169ffffffffffffffffffff8116811461239057600080fd5b6000602082840312156152a757600080fd5b813561393981615e0d565b600080604083850312156152c557600080fd5b82356152d081615e0d565b915060208301356152e081615e0d565b809150509250929050565b6000806000806060858703121561530157600080fd5b843561530c81615e0d565b93506020850135925060408501356001600160401b038082111561532f57600080fd5b818701915087601f83011261534357600080fd5b81358181111561535257600080fd5b88602082850101111561536457600080fd5b95989497505060200194505050565b60006040828403121561538557600080fd5b8260408301111561539557600080fd5b50919050565b6000604082840312156153ad57600080fd5b61393983836150d0565b6000602082840312156153c957600080fd5b815161393981615e22565b6000602082840312156153e657600080fd5b5035919050565b6000602082840312156153ff57600080fd5b5051919050565b60006020828403121561541857600080fd5b604051602081018181106001600160401b038211171561543a5761543a615df7565b604052823561544881615e22565b81529392505050565b6000808284036101c081121561546657600080fd5b6101a08082121561547657600080fd5b61547e615bd2565b915061548a86866150d0565b825261549986604087016150d0565b60208301526080850135604083015260a0850135606083015260c085013560808301526154c860e086016150c5565b60a08301526101006154dc878288016150d0565b60c08401526154ef8761014088016150d0565b60e0840152610180860135908301529092508301356001600160401b0381111561551857600080fd5b615524858286016151b4565b9150509250929050565b60006020828403121561554057600080fd5b81356001600160401b0381111561555657600080fd5b820160c0818503121561393957600080fd5b60006020828403121561557a57600080fd5b61393982615255565b60008060008060008086880360e081121561559d57600080fd5b6155a688615255565b96506155b460208901615267565b95506155c260408901615267565b94506155d060608901615267565b9350608088013592506040609f19820112156155eb57600080fd5b506155f4615b88565b61560060a08901615267565b815261560e60c08901615267565b6020820152809150509295509295509295565b6000806040838503121561563457600080fd5b8235915060208301356152e081615e0d565b6000806040838503121561565957600080fd5b50508035926020909101359150565b60006020828403121561567a57600080fd5b61393982615267565b600080600080600060a0868803121561569b57600080fd5b6156a48661527b565b94506020860151935060408601519250606086015191506156c76080870161527b565b90509295509295909350565b600081518084526020808501945080840160005b8381101561570c5781516001600160a01b0316875295820195908201906001016156e7565b509495945050505050565b8060005b6002811015610d8357815184526020938401939091019060010161571b565b600081518084526020808501945080840160005b8381101561570c5781518752958201959082019060010161574e565b60008151808452615782816020860160208601615d1d565b601f01601f19169290920160200192915050565b6157a08183615717565b604001919050565b600083516157ba818460208801615d1d565b8351908301906157ce818360208801615d1d565b01949350505050565b8681526157e76020820187615717565b6157f46060820186615717565b61580160a0820185615717565b61580e60e0820184615717565b60609190911b6001600160601b0319166101208201526101340195945050505050565b8381526158416020820184615717565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016113b98284615717565b602081526000613939602083018461573a565b602081526000613939602083018461576a565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c0608084015261593460e08401826156d3565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b60006060820161ffff86168352602063ffffffff86168185015260606040850152818551808452608086019150828701935060005b818110156159b557845183529383019391830191600101615999565b509098975050505050505050565b9182526001600160a01b0316602082015260400190565b828152606081016139396020830184615717565b828152604060208201526000613987604083018461573a565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a08301526140e760c083018461576a565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c0820181905260009061420c9083018461576a565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c0820181905260009061420c9083018461576a565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a060808201819052600090615b30908301846156d3565b979650505050505050565b6000808335601e19843603018112615b5257600080fd5b8301803591506001600160401b03821115615b6c57600080fd5b602001915036819003821315615b8157600080fd5b9250929050565b604080519081016001600160401b0381118282101715615baa57615baa615df7565b60405290565b60405160c081016001600160401b0381118282101715615baa57615baa615df7565b60405161012081016001600160401b0381118282101715615baa57615baa615df7565b60008085851115615c0557600080fd5b83861115615c1257600080fd5b5050820193919092039150565b60008219821115615c3257615c32615d9f565b500190565b60006001600160401b038083168185168083038211156157ce576157ce615d9f565b60006001600160601b038281168482168083038211156157ce576157ce615d9f565b600082615c8a57615c8a615db5565b500490565b6000816000190483118215151615615ca957615ca9615d9f565b500290565b600082821015615cc057615cc0615d9f565b500390565b60006001600160601b0383811690831681811015615ce557615ce5615d9f565b039392505050565b6001600160e01b03198135818116916004851015615d155780818660040360031b1b83161692505b505092915050565b60005b83811015615d38578181015183820152602001615d20565b83811115610d835750506000910152565b6000600019821415615d5d57615d5d615d9f565b5060010190565b60006001600160401b0380831681811415615d8157615d81615d9f565b6001019392505050565b600082615d9a57615d9a615db5565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610b4a57600080fd5b8015158114610b4a57600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxGas\",\"type\":\"uint256\"}],\"name\":\"GasPriceExceeded\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"have\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"want\",\"type\":\"uint256\"}],\"name\":\"InsufficientGasForConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"flatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"flatFeeNativePPM\",\"type\":\"uint32\"}],\"name\":\"LinkDiscountTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyDeregistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"deregisterMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"deregisterProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2_5.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_fallbackWeiPerUnitLink\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_provingKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exists\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"maxGas\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x60a06040523480156200001157600080fd5b5060405162005da138038062005da1833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615bc6620001db6000396000818161055001526131e70152615bc66000f3fe60806040526004361061021c5760003560e01c80638402595e11610124578063b2a7cac5116100a6578063b2a7cac514610732578063bec4c08c14610752578063caf70c4a14610772578063cb63179714610792578063d98e620e146107b2578063da2f2610146107d2578063dac83d2914610831578063dc311dd314610851578063e72f6e3014610882578063ee9d2d38146108a2578063f2fde38b146108cf57600080fd5b80638402595e146105c757806386fe91c7146105e75780638da5cb5b1461060757806395b55cfc146106255780639b1c385e146106385780639d40a6fd14610658578063a21a23e414610690578063a4c0ed36146106a5578063a63e0bfb146106c5578063aa433aff146106e5578063aefb212f1461070557600080fd5b8063405b84fa116101ad578063405b84fa1461044e57806340d6bb821461046e57806341af6c871461049957806351cff8d9146104c95780635d06b4ab146104e957806364d51a2a14610509578063659827441461051e578063689c45171461053e57806372e9d5651461057257806379ba5097146105925780637a5a2aef146105a757600080fd5b806304104edb14610221578063043bd6ae14610243578063088070f51461026c57806308821d581461033a5780630ae095401461035a57806315c48b841461037a57806318e3dd27146103a25780631b6b6d23146103e15780632f622e6b1461040e578063301f42e91461042e575b600080fd5b34801561022d57600080fd5b5061024161023c366004614f92565b6108ef565b005b34801561024f57600080fd5b5061025960105481565b6040519081526020015b60405180910390f35b34801561027857600080fd5b50600c546102dd9061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610263565b34801561034657600080fd5b50610241610355366004615070565b610a5c565b34801561036657600080fd5b5061024161037536600461535a565b610c06565b34801561038657600080fd5b5061038f60c881565b60405161ffff9091168152602001610263565b3480156103ae57600080fd5b50600a546103c990600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610263565b3480156103ed57600080fd5b50600254610401906001600160a01b031681565b604051610263919061558b565b34801561041a57600080fd5b50610241610429366004614f92565b610c4e565b34801561043a57600080fd5b506103c9610449366004615176565b610d9a565b34801561045a57600080fd5b5061024161046936600461535a565b610fc0565b34801561047a57600080fd5b506104846101f481565b60405163ffffffff9091168152602001610263565b3480156104a557600080fd5b506104b96104b43660046150f9565b611372565b6040519015158152602001610263565b3480156104d557600080fd5b506102416104e4366004614f92565b611482565b3480156104f557600080fd5b50610241610504366004614f92565b611610565b34801561051557600080fd5b5061038f606481565b34801561052a57600080fd5b50610241610539366004614faf565b6116c7565b34801561054a57600080fd5b506104017f000000000000000000000000000000000000000000000000000000000000000081565b34801561057e57600080fd5b50600354610401906001600160a01b031681565b34801561059e57600080fd5b50610241611727565b3480156105b357600080fd5b506102416105c236600461508c565b6117d1565b3480156105d357600080fd5b506102416105e2366004614f92565b611901565b3480156105f357600080fd5b50600a546103c9906001600160601b031681565b34801561061357600080fd5b506000546001600160a01b0316610401565b6102416106333660046150f9565b611a13565b34801561064457600080fd5b50610259610653366004615264565b611b37565b34801561066457600080fd5b50600754610678906001600160401b031681565b6040516001600160401b039091168152602001610263565b34801561069c57600080fd5b50610259611e78565b3480156106b157600080fd5b506102416106c0366004614fe8565b61204b565b3480156106d157600080fd5b506102416106e03660046152b9565b6121c7565b3480156106f157600080fd5b506102416107003660046150f9565b612444565b34801561071157600080fd5b5061072561072036600461537f565b61248c565b6040516102639190615602565b34801561073e57600080fd5b5061024161074d3660046150f9565b61258e565b34801561075e57600080fd5b5061024161076d36600461535a565b612683565b34801561077e57600080fd5b5061025961078d3660046150c0565b61278f565b34801561079e57600080fd5b506102416107ad36600461535a565b6127bf565b3480156107be57600080fd5b506102596107cd3660046150f9565b612a2e565b3480156107de57600080fd5b506108126107ed3660046150f9565b600d6020526000908152604090205460ff81169061010090046001600160401b031682565b6040805192151583526001600160401b03909116602083015201610263565b34801561083d57600080fd5b5061024161084c36600461535a565b612a4f565b34801561085d57600080fd5b5061087161086c3660046150f9565b612ae6565b6040516102639594939291906157d7565b34801561088e57600080fd5b5061024161089d366004614f92565b612bd4565b3480156108ae57600080fd5b506102596108bd3660046150f9565b600f6020526000908152604090205481565b3480156108db57600080fd5b506102416108ea366004614f92565b612da7565b6108f7612db8565b60115460005b81811015610a3457826001600160a01b03166011828154811061092257610922615b22565b6000918252602090912001546001600160a01b03161415610a2457601161094a6001846159d2565b8154811061095a5761095a615b22565b600091825260209091200154601180546001600160a01b03909216918390811061098657610986615b22565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060118054806109c5576109c5615b0c565b600082815260209020810160001990810180546001600160a01b03191690550190556040517ff80a1a97fd42251f3c33cda98635e7399253033a6774fe37cd3f650b5282af3790610a1790859061558b565b60405180910390a1505050565b610a2d81615a8a565b90506108fd565b5081604051635428d44960e01b8152600401610a50919061558b565b60405180910390fd5b50565b610a64612db8565b604080518082018252600091610a9391908490600290839083908082843760009201919091525061278f915050565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b03169183019190915291925090610af157604051631dfd6e1360e21b815260048101839052602401610a50565b6000828152600d6020526040812080546001600160481b0319169055600e54905b81811015610bc25783600e8281548110610b2e57610b2e615b22565b90600052602060002001541415610bb257600e610b4c6001846159d2565b81548110610b5c57610b5c615b22565b9060005260206000200154600e8281548110610b7a57610b7a615b22565b600091825260209091200155600e805480610b9757610b97615b0c565b60019003818190600052602060002001600090559055610bc2565b610bbb81615a8a565b9050610b12565b507f9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5838360200151604051610bf8929190615615565b60405180910390a150505050565b81610c1081612e0d565b610c18612e6e565b610c2183611372565b15610c3f57604051631685ecdd60e31b815260040160405180910390fd5b610c498383612e99565b505050565b610c56612e6e565b610c5e612db8565b600b54600160601b90046001600160601b0316610c8e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c610cb18380615a0e565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610cf99190615a0e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610d73576040519150601f19603f3d011682016040523d82523d6000602084013e610d78565b606091505b5050905080610c495760405163950b247960e01b815260040160405180910390fd5b6000610da4612e6e565b60005a90506000610db5868661304d565b90506000610dcb85836000015160200151613309565b60408301516060888101519293509163ffffffff16806001600160401b03811115610df857610df8615b38565b604051908082528060200260200182016040528015610e21578160200160208202803683370190505b50925060005b81811015610e895760408051602081018590529081018290526060016040516020818303038152906040528051906020012060001c848281518110610e6e57610e6e615b22565b6020908102919091010152610e8281615a8a565b9050610e27565b50506020808501516000818152600f9092526040822082905590610eae828b86613357565b60208b81015160008181526006909252604090912080549293509091601890610ee690600160c01b90046001600160401b0316615aa5565b91906101000a8154816001600160401b0302191690836001600160401b0316021790555060008b60a0015160018d60a0015151610f2391906159d2565b81518110610f3357610f33615b22565b60209101015160f81c6001149050610f4d8988838e6133f2565b9950610f5a8a8284613422565b50604080518581526001600160601b038b166020820152831515818301528b151560608201529051829185917f6c6b5394380e16e41988d8383648010de6f5c2e4814803be5de1c6b1c852db559181900360800190a350505050505050505b9392505050565b610fc8612e6e565b610fd181613575565b610ff05780604051635428d44960e01b8152600401610a50919061558b565b600080600080610fff86612ae6565b945094505093509350336001600160a01b0316826001600160a01b0316146110625760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610a50565b61106b86611372565b156110b15760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610a50565b6040805160c0810182526001815260208082018990526001600160a01b03851682840152606082018490526001600160601b038088166080840152861660a0830152915190916000916111069184910161563f565b6040516020818303038152906040529050611120886135e1565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061115990859060040161562c565b6000604051808303818588803b15801561117257600080fd5b505af1158015611186573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506111af905057506001600160601b03861615155b156112795760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906111e6908a908a906004016155d2565b602060405180830381600087803b15801561120057600080fd5b505af1158015611214573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123891906150dc565b6112795760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610a50565b600c805460ff60301b1916600160301b17905560005b8351811015611320578381815181106112aa576112aa615b22565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b81526004016112dd919061558b565b600060405180830381600087803b1580156112f757600080fd5b505af115801561130b573d6000803e3d6000fd5b505050508061131990615a8a565b905061128f565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906113609089908b9061559f565b60405180910390a15050505050505050565b6000818152600560205260408120600201805480611394575060009392505050565b600e5460005b828110156114765760008482815481106113b6576113b6615b22565b60009182526020822001546001600160a01b031691505b8381101561146357600061142b600e83815481106113ed576113ed615b22565b60009182526020808320909101546001600160a01b03871683526004825260408084208e855290925291205485908c906001600160401b0316613789565b506000818152600f6020526040902054909150156114525750600198975050505050505050565b5061145c81615a8a565b90506113cd565b50508061146f90615a8a565b905061139a565b50600095945050505050565b61148a612e6e565b611492612db8565b6002546001600160a01b03166114bb5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b03166114e457604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115008380615a0e565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115489190615a0e565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061159d90859085906004016155d2565b602060405180830381600087803b1580156115b757600080fd5b505af11580156115cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ef91906150dc565b61160c57604051631e9acf1760e31b815260040160405180910390fd5b5050565b611618612db8565b61162181613575565b15611641578060405163ac8a27ef60e01b8152600401610a50919061558b565b601180546001810182556000919091527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af01625906116bc90839061558b565b60405180910390a150565b6116cf612db8565b6002546001600160a01b0316156116f957604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b0316331461177a5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610a50565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6117d9612db8565b60408051808201825260009161180891908590600290839083908082843760009201919091525061278f915050565b6000818152600d602052604090205490915060ff161561183e57604051634a0b8fa760e01b815260048101829052602401610a50565b60408051808201825260018082526001600160401b0385811660208085019182526000878152600d9091528581209451855492516001600160481b031990931690151568ffffffffffffffff00191617610100929093169190910291909117909255600e805491820181559091527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd01829055517f9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd390610a179083908590615615565b611909612db8565b600a544790600160601b90046001600160601b031681811115611949576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c4957600061195d82846159d2565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d80600081146119ac576040519150601f19603f3d011682016040523d82523d6000602084013e6119b1565b606091505b50509050806119d35760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a0492919061559f565b60405180910390a15050505050565b611a1b612e6e565b6000818152600560205260409020546001600160a01b0316611a5057604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611a7f838561597d565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611ac7919061597d565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611b1a919061591e565b604080519283526020830191909152015b60405180910390a25050565b6000611b41612e6e565b602080830135600081815260059092526040909120546001600160a01b0316611b7d57604051630fb532db60e11b815260040160405180910390fd5b33600090815260046020908152604080832084845291829052909120546001600160401b031680611bc55782336040516379bfd40160e01b8152600401610a509291906156b4565b600c5461ffff16611bdc606087016040880161529e565b61ffff161080611bff575060c8611bf9606087016040880161529e565b61ffff16115b15611c4557611c14606086016040870161529e565b600c5460405163539c34bb60e11b815261ffff92831660048201529116602482015260c86044820152606401610a50565b600c5462010000900463ffffffff16611c6460808701606088016153a1565b63ffffffff161115611cb457611c8060808601606087016153a1565b600c54604051637aebf00f60e11b815263ffffffff9283166004820152620100009091049091166024820152604401610a50565b6101f4611cc760a08701608088016153a1565b63ffffffff161115611d0d57611ce360a08601608087016153a1565b6040516311ce1afb60e21b815263ffffffff90911660048201526101f46024820152604401610a50565b611d1681615aa5565b90506000611d278635338685613789565b90955090506000611d4b611d46611d4160a08a018a61582c565b613802565b61387f565b905085611d566138f0565b86611d6760808b0160608c016153a1565b611d7760a08c0160808d016153a1565b3386604051602001611d8f9796959493929190615737565b60405160208183030381529060405280519060200120600f600088815260200190815260200160002081905550336001600160a01b03168588600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e89868c6040016020810190611e02919061529e565b8d6060016020810190611e1591906153a1565b8e6080016020810190611e2891906153a1565b89604051611e3b969594939291906156f8565b60405180910390a450506000928352602091909152604090912080546001600160401b0319166001600160401b039092169190911790555b919050565b6000611e82612e6e565b6007546001600160401b031633611e9a6001436159d2565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611eff816001615936565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b039283161783559351600183018054909516911617909255925180519294939192611ffd9260028501920190614cac565b5061200d91506008905084613980565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161203e919061558b565b60405180910390a2505090565b612053612e6e565b6002546001600160a01b0316331461207e576040516344b0e3c360e01b815260040160405180910390fd5b6020811461209f57604051638129bbcd60e01b815260040160405180910390fd5b60006120ad828401846150f9565b6000818152600560205260409020549091506001600160a01b03166120e557604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b03169186919061210c838561597d565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b0316612154919061597d565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846121a7919061591e565b6040805192835260208301919091520160405180910390a2505050505050565b6121cf612db8565b60c861ffff8a1611156122095760405163539c34bb60e11b815261ffff8a1660048201819052602482015260c86044820152606401610a50565b6000851361222d576040516321ea67b360e11b815260048101869052602401610a50565b60008463ffffffff1611801561224f57508363ffffffff168363ffffffff1610155b1561227d576040516313c06e5960e11b815263ffffffff808516600483015285166024820152604401610a50565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b9099029890981667ffffffffffffffff60781b19600160581b90960263ffffffff60581b19600160381b9098029790971668ffffffffffffffffff60301b196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b690612431908b908b908b908b908b908b908b908b908b9061ffff99909916895263ffffffff97881660208a0152958716604089015293861660608801526080870192909252841660a086015290921660c084015260ff91821660e0840152166101008201526101200190565b60405180910390a1505050505050505050565b61244c612db8565b6000818152600560205260409020546001600160a01b03168061248257604051630fb532db60e11b815260040160405180910390fd5b61160c8282612e99565b6060600061249a600861398c565b90508084106124bc57604051631390f2a160e01b815260040160405180910390fd5b60006124c8848661591e565b9050818111806124d6575083155b6124e057806124e2565b815b905060006124f086836159d2565b9050806001600160401b0381111561250a5761250a615b38565b604051908082528060200260200182016040528015612533578160200160208202803683370190505b50935060005b818110156125835761255661254e888361591e565b600890613996565b85828151811061256857612568615b22565b602090810291909101015261257c81615a8a565b9050612539565b505050505b92915050565b612596612e6e565b6000818152600560205260409020546001600160a01b0316806125cc57604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b03163314612623576000828152600560205260409081902060010154905163d084e97560e01b8152610a50916001600160a01b03169060040161558b565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611b2b9185916155b8565b8161268d81612e0d565b612695612e6e565b60008381526005602052604090206002018054606414156126c9576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612704575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e19061278090879061558b565b60405180910390a25050505050565b6000816040516020016127a291906155f4565b604051602081830303815290604052805190602001209050919050565b816127c981612e0d565b6127d1612e6e565b6127da83611372565b156127f857604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b03166128465782826040516379bfd40160e01b8152600401610a509291906156b4565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156128a957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161288b575b505050505090506000600182516128c091906159d2565b905060005b82518110156129ca57846001600160a01b03168382815181106128ea576128ea615b22565b60200260200101516001600160a01b031614156129ba57600083838151811061291557612915615b22565b602002602001015190508060056000898152602001908152602001600020600201838154811061294757612947615b22565b600091825260208083209190910180546001600160a01b0319166001600160a01b03949094169390931790925588815260059091526040902060020180548061299257612992615b0c565b600082815260209020810160001990810180546001600160a01b0319169055019055506129ca565b6129c381615a8a565b90506128c5565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a79061278090879061558b565b600e8181548110612a3e57600080fd5b600091825260209091200154905081565b81612a5981612e0d565b612a61612e6e565b600083815260056020526040902060018101546001600160a01b03848116911614612ae0576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612ad790339087906155b8565b60405180910390a25b50505050565b600081815260056020526040812054819081906001600160a01b0316606081612b2257604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612bba57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612b9c575b505050505090509450945094509450945091939590929450565b612bdc612db8565b6002546001600160a01b0316612c055760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612c3690309060040161558b565b60206040518083038186803b158015612c4e57600080fd5b505afa158015612c62573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c869190615112565b600a549091506001600160601b031681811115612cc0576040516354ced18160e11b81526004810182905260248101839052604401610a50565b81811015610c49576000612cd482846159d2565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612d07908790859060040161559f565b602060405180830381600087803b158015612d2157600080fd5b505af1158015612d35573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d5991906150dc565b612d7657604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051610bf892919061559f565b612daf612db8565b610a59816139a2565b6000546001600160a01b03163314612e0b5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610a50565b565b6000818152600560205260409020546001600160a01b031680612e4357604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b0382161461160c5780604051636c51fda960e11b8152600401610a50919061558b565b600c54600160301b900460ff1615612e0b5760405163769dd35360e11b815260040160405180910390fd5b600080612ea5846135e1565b60025491935091506001600160a01b031615801590612ecc57506001600160601b03821615155b15612f7b5760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90612f0c9086906001600160601b0387169060040161559f565b602060405180830381600087803b158015612f2657600080fd5b505af1158015612f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f5e91906150dc565b612f7b57604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114612fd1576040519150601f19603f3d011682016040523d82523d6000602084013e612fd6565b606091505b5050905080612ff85760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c490606001612780565b6040805160a08101825260006060820181815260808301829052825260208201819052918101919091526000613086846000015161278f565b6000818152600d602090815260409182902082518084019093525460ff811615158084526101009091046001600160401b031691830191909152919250906130e457604051631dfd6e1360e21b815260048101839052602401610a50565b6000828660800151604051602001613106929190918252602082015260400190565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061314c57604051631b44092560e11b815260040160405180910390fd5b85516020808801516040808a015160608b015160808c015160a08d0151935161317b978a979096959101615783565b6040516020818303038152906040528051906020012081146131b05760405163354a450b60e21b815260040160405180910390fd5b60006131bf8760000151613a46565b905080613297578651604051631d2827a760e31b81526001600160401b0390911660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e9413d389060240160206040518083038186803b15801561323157600080fd5b505afa158015613245573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132699190615112565b90508061329757865160405163175dadad60e01b81526001600160401b039091166004820152602401610a50565b60008860800151826040516020016132b9929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006132e08a83613b28565b604080516060810182529788526020880196909652948601949094525092979650505050505050565b6000816001600160401b03163a111561334f57821561333257506001600160401b038116612588565b3a8260405163435e532d60e11b8152600401610a50929190615615565b503a92915050565b6000806000631fe543e360e01b86856040516024016133779291906156df565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559086015160808701519192506133db9163ffffffff9091169083613b93565b600c805460ff60301b191690559695505050505050565b6000821561340c57613405858584613bdf565b905061341a565b613417858584613cf0565b90505b949350505050565b600081815260066020526040902082156134e15780546001600160601b03600160601b909104811690851681101561346d57604051631e9acf1760e31b815260040160405180910390fd5b6134778582615a0e565b8254600160601b600160c01b031916600160601b6001600160601b039283168102919091178455600b805488939192600c926134b792869290041661597d565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555050612ae0565b80546001600160601b0390811690851681101561351157604051631e9acf1760e31b815260040160405180910390fd5b61351b8582615a0e565b82546001600160601b0319166001600160601b03918216178355600b8054879260009161354a9185911661597d565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050505050565b601154600090815b818110156135d757836001600160a01b0316601182815481106135a2576135a2615b22565b6000918252602090912001546001600160a01b031614156135c7575060019392505050565b6135d081615a8a565b905061357d565b5060009392505050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b81811015613683576004600084838154811061363657613636615b22565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b031916905561367c81615a8a565b9050613618565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906136bb6002830182614d11565b50506000858152600660205260408120556136d7600886613ed9565b506001600160601b0384161561372a57600a80548591906000906137059084906001600160601b0316615a0e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156137825782600a600c8282829054906101000a90046001600160601b031661375d9190615a0e565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b6040805160208082018790526001600160a01b03959095168183015260608101939093526001600160401b03919091166080808401919091528151808403909101815260a08301825280519084012060c083019490945260e0808301859052815180840390910181526101009092019052805191012091565b6040805160208101909152600081528161382b5750604080516020810190915260008152612588565b63125fa26760e31b61383d8385615a2e565b6001600160e01b0319161461386557604051632923fee760e11b815260040160405180910390fd5b61387282600481866158f4565b810190610fb9919061512b565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016138b891511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b6000466138fc81613ee5565b156139795760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561393b57600080fd5b505afa15801561394f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139739190615112565b91505090565b4391505090565b6000610fb98383613f08565b6000612588825490565b6000610fb98383613f57565b6001600160a01b0381163314156139f55760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610a50565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613a5281613ee5565b15613b1957610100836001600160401b0316613a6c6138f0565b613a7691906159d2565b1180613a925750613a856138f0565b836001600160401b031610155b15613aa05750600092915050565b6040516315a03d4160e11b81526001600160401b0384166004820152606490632b407a82906024015b60206040518083038186803b158015613ae157600080fd5b505afa158015613af5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb99190615112565b50506001600160401b03164090565b6000613b5c8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613f81565b60038360200151604051602001613b749291906156cb565b60408051601f1981840301815291905280516020909101209392505050565b60005a611388811015613ba557600080fd5b611388810390508460408204820311613bbd57600080fd5b50823b613bc957600080fd5b60008083516020850160008789f1949350505050565b600080613c226000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419d92505050565b905060005a600c54613c42908890600160581b900463ffffffff1661591e565b613c4c91906159d2565b613c5690866159b3565b600c54909150600090613c7b90600160781b900463ffffffff1664e8d4a510006159b3565b90508415613cc757600c548190606490600160b81b900460ff16613c9f858761591e565b613ca991906159b3565b613cb3919061599f565b613cbd919061591e565b9350505050610fb9565b600c548190606490613ce390600160b81b900460ff1682615958565b60ff16613c9f858761591e565b600080613cfb61426b565b905060008113613d21576040516321ea67b360e11b815260048101829052602401610a50565b6000613d636000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061419d92505050565b9050600082825a600c54613d85908b90600160581b900463ffffffff1661591e565b613d8f91906159d2565b613d9990896159b3565b613da3919061591e565b613db590670de0b6b3a76400006159b3565b613dbf919061599f565b600c54909150600090613de89063ffffffff600160981b8204811691600160781b9004166159e9565b613dfd9063ffffffff1664e8d4a510006159b3565b9050600084613e1483670de0b6b3a76400006159b3565b613e1e919061599f565b905060008715613e5f57600c548290606490613e4490600160c01b900460ff16876159b3565b613e4e919061599f565b613e58919061591e565b9050613e9f565b600c548290606490613e7b90600160c01b900460ff1682615958565b613e889060ff16876159b3565b613e92919061599f565b613e9c919061591e565b90505b6b033b2e3c9fd0803ce8000000811115613ecc5760405163e80fa38160e01b815260040160405180910390fd5b9998505050505050505050565b6000610fb9838361433a565b600061a4b1821480613ef9575062066eed82145b8061258857505062066eee1490565b6000818152600183016020526040812054613f4f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155612588565b506000612588565b6000826000018281548110613f6e57613f6e615b22565b9060005260206000200154905092915050565b613f8a8961442d565b613fd35760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610a50565b613fdc8861442d565b6140205760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610a50565b6140298361442d565b6140755760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610a50565b61407e8261442d565b6140ca5760405162461bcd60e51b815260206004820152601c60248201527f73486173685769746e657373206973206e6f74206f6e206375727665000000006044820152606401610a50565b6140d6878a88876144f0565b61411e5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610a50565b600061412a8a87614613565b9050600061413d898b878b868989614677565b9050600061414e838d8d8a86614796565b9050808a1461418f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610a50565b505050505050505050505050565b6000466141a981613ee5565b156141e857606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613ae157600080fd5b6141f1816147d6565b1561426257600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615b72604891396040516020016142379291906154e1565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613ac9919061562c565b50600092915050565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169284926001600160a01b039091169163feaf968c9160048082019260a092909190829003018186803b1580156142c657600080fd5b505afa1580156142da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142fe91906153bc565b50919550909250505063ffffffff82161580159061432a575061432181426159d2565b8263ffffffff16105b156143355760105492505b505090565b6000818152600183016020526040812054801561442357600061435e6001836159d2565b8554909150600090614372906001906159d2565b90508181146143d757600086600001828154811061439257614392615b22565b90600052602060002001549050808760000184815481106143b5576143b5615b22565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806143e8576143e8615b0c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612588565b6000915050612588565b80516000906401000003d0191161447b5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d019116144c95760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610a50565b60208201516401000003d0199080096144e98360005b6020020151614810565b1492915050565b60006001600160a01b0382166145365760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610a50565b60208401516000906001161561454d57601c614550565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe19918203925060009190890987516040805160008082526020820180845287905260ff88169282019290925260608101929092526080820183905291925060019060a0016020604051602081039080840390855afa1580156145eb573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b61461b614d2f565b614648600184846040516020016146349392919061556a565b604051602081830303815290604052614834565b90505b6146548161442d565b6125885780516040805160208101929092526146709101614634565b905061464b565b61467f614d2f565b825186516401000003d01990819006910614156146de5760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610a50565b6146e9878988614882565b61472e5760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610a50565b614739848685614882565b61477f5760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610a50565b61478a8684846149aa565b98975050505050505050565b6000600286868685876040516020016147b496959493929190615510565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a8214806147e857506101a482145b806147f5575062aa37dc82145b80614801575061210582145b8061258857505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b61483c614d2f565b61484582614a6d565b815261485a6148558260006144df565b614aa8565b602082018190526002900660011415611e73576020810180516401000003d019039052919050565b6000826148bf5760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610a50565b835160208501516000906148d590600290615acc565b156148e157601c6148e4565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020820180845281905260ff86169282019290925260608101869052608081018390529192509060019060a0016020604051602081039080840390855afa158015614956573d6000803e3d6000fd5b50505060206040510351905060008660405160200161497591906154cf565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b6149b2614d2f565b8351602080860151855191860151600093849384936149d393909190614ac8565b919450925090506401000003d019858209600114614a2f5760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610a50565b60405180604001604052806401000003d01980614a4e57614a4e615af6565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611e7357604080516020808201939093528151808203840181529082019091528051910120614a75565b6000612588826002614ac16401000003d019600161591e565b901c614ba8565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614b0883838585614c3f565b9098509050614b1988828e88614c63565b9098509050614b2a88828c87614c63565b90985090506000614b3d8d878b85614c63565b9098509050614b4e88828686614c3f565b9098509050614b5f88828e89614c63565b9098509050818114614b94576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614b98565b8196505b5050505050509450945094915050565b600080614bb3614d4d565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614be5614d6b565b60208160c0846005600019fa925082614c355760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610a50565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614d01579160200282015b82811115614d0157825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614ccc565b50614d0d929150614d89565b5090565b5080546000825590600052602060002090810190610a599190614d89565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614d0d5760008155600101614d8a565b8035611e7381615b4e565b806040810183101561258857600080fd5b600082601f830112614dcb57600080fd5b604051604081018181106001600160401b0382111715614ded57614ded615b38565b8060405250808385604086011115614e0457600080fd5b60005b6002811015614e26578135835260209283019290910190600101614e07565b509195945050505050565b8035611e7381615b63565b600060c08284031215614e4e57600080fd5b614e56615879565b9050614e6182614f50565b815260208083013581830152614e7960408401614f3c565b6040830152614e8a60608401614f3c565b60608301526080830135614e9d81615b4e565b608083015260a08301356001600160401b0380821115614ebc57600080fd5b818501915085601f830112614ed057600080fd5b813581811115614ee257614ee2615b38565b614ef4601f8201601f191685016158c4565b91508082528684828501011115614f0a57600080fd5b80848401858401376000848284010152508060a085015250505092915050565b803561ffff81168114611e7357600080fd5b803563ffffffff81168114611e7357600080fd5b80356001600160401b0381168114611e7357600080fd5b803560ff81168114611e7357600080fd5b805169ffffffffffffffffffff81168114611e7357600080fd5b600060208284031215614fa457600080fd5b8135610fb981615b4e565b60008060408385031215614fc257600080fd5b8235614fcd81615b4e565b91506020830135614fdd81615b4e565b809150509250929050565b60008060008060608587031215614ffe57600080fd5b843561500981615b4e565b93506020850135925060408501356001600160401b038082111561502c57600080fd5b818701915087601f83011261504057600080fd5b81358181111561504f57600080fd5b88602082850101111561506157600080fd5b95989497505060200194505050565b60006040828403121561508257600080fd5b610fb98383614da9565b6000806060838503121561509f57600080fd5b6150a98484614da9565b91506150b760408401614f50565b90509250929050565b6000604082840312156150d257600080fd5b610fb98383614dba565b6000602082840312156150ee57600080fd5b8151610fb981615b63565b60006020828403121561510b57600080fd5b5035919050565b60006020828403121561512457600080fd5b5051919050565b60006020828403121561513d57600080fd5b604051602081018181106001600160401b038211171561515f5761515f615b38565b604052823561516d81615b63565b81529392505050565b60008060008385036101e081121561518d57600080fd5b6101a08082121561519d57600080fd5b6151a56158a1565b91506151b18787614dba565b82526151c08760408801614dba565b60208301526080860135604083015260a0860135606083015260c086013560808301526151ef60e08701614d9e565b60a083015261010061520388828901614dba565b60c0840152615216886101408901614dba565b60e0840152610180870135908301529093508401356001600160401b0381111561523f57600080fd5b61524b86828701614e3c565b92505061525b6101c08501614e31565b90509250925092565b60006020828403121561527657600080fd5b81356001600160401b0381111561528c57600080fd5b820160c08185031215610fb957600080fd5b6000602082840312156152b057600080fd5b610fb982614f2a565b60008060008060008060008060006101208a8c0312156152d857600080fd5b6152e18a614f2a565b98506152ef60208b01614f3c565b97506152fd60408b01614f3c565b965061530b60608b01614f3c565b955060808a0135945061532060a08b01614f3c565b935061532e60c08b01614f3c565b925061533c60e08b01614f67565b915061534b6101008b01614f67565b90509295985092959850929598565b6000806040838503121561536d57600080fd5b823591506020830135614fdd81615b4e565b6000806040838503121561539257600080fd5b50508035926020909101359150565b6000602082840312156153b357600080fd5b610fb982614f3c565b600080600080600060a086880312156153d457600080fd5b6153dd86614f78565b945060208601519350604086015192506060860151915061540060808701614f78565b90509295509295909350565b600081518084526020808501945080840160005b838110156154455781516001600160a01b031687529582019590820190600101615420565b509495945050505050565b8060005b6002811015612ae0578151845260209384019390910190600101615454565b600081518084526020808501945080840160005b8381101561544557815187529582019590820190600101615487565b600081518084526154bb816020860160208601615a5e565b601f01601f19169290920160200192915050565b6154d98183615450565b604001919050565b600083516154f3818460208801615a5e565b835190830190615507818360208801615a5e565b01949350505050565b8681526155206020820187615450565b61552d6060820186615450565b61553a60a0820185615450565b61554760e0820184615450565b60609190911b6001600160601b0319166101208201526101340195945050505050565b83815261557a6020820184615450565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016125888284615450565b602081526000610fb96020830184615473565b9182526001600160401b0316602082015260400190565b602081526000610fb960208301846154a3565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c0608084015261568460e084018261540c565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b9182526001600160a01b0316602082015260400190565b82815260608101610fb96020830184615450565b82815260406020820152600061341a6040830184615473565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a083015261478a60c08301846154a3565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613ecc908301846154a3565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613ecc908301846154a3565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a0608082018190526000906158219083018461540c565b979650505050505050565b6000808335601e1984360301811261584357600080fd5b8301803591506001600160401b0382111561585d57600080fd5b60200191503681900382131561587257600080fd5b9250929050565b60405160c081016001600160401b038111828210171561589b5761589b615b38565b60405290565b60405161012081016001600160401b038111828210171561589b5761589b615b38565b604051601f8201601f191681016001600160401b03811182821017156158ec576158ec615b38565b604052919050565b6000808585111561590457600080fd5b8386111561591157600080fd5b5050820193919092039150565b6000821982111561593157615931615ae0565b500190565b60006001600160401b0380831681851680830382111561550757615507615ae0565b600060ff821660ff84168060ff0382111561597557615975615ae0565b019392505050565b60006001600160601b0382811684821680830382111561550757615507615ae0565b6000826159ae576159ae615af6565b500490565b60008160001904831182151516156159cd576159cd615ae0565b500290565b6000828210156159e4576159e4615ae0565b500390565b600063ffffffff83811690831681811015615a0657615a06615ae0565b039392505050565b60006001600160601b0383811690831681811015615a0657615a06615ae0565b6001600160e01b03198135818116916004851015615a565780818660040360031b1b83161692505b505092915050565b60005b83811015615a79578181015183820152602001615a61565b83811115612ae05750506000910152565b6000600019821415615a9e57615a9e615ae0565b5060010190565b60006001600160401b0380831681811415615ac257615ac2615ae0565b6001019392505050565b600082615adb57615adb615af6565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114610a5957600080fd5b8015158114610a5957600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a",
}
var VRFCoordinatorV25ABI = VRFCoordinatorV25MetaData.ABI
@@ -360,30 +355,6 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) GetActiveSubscriptionI
return _VRFCoordinatorV25.Contract.GetActiveSubscriptionIds(&_VRFCoordinatorV25.CallOpts, startIndex, maxCount)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) GetRequestConfig(opts *bind.CallOpts) (uint16, uint32, [][32]byte, error) {
- var out []interface{}
- err := _VRFCoordinatorV25.contract.Call(opts, &out, "getRequestConfig")
-
- if err != nil {
- return *new(uint16), *new(uint32), *new([][32]byte), err
- }
-
- out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16)
- out1 := *abi.ConvertType(out[1], new(uint32)).(*uint32)
- out2 := *abi.ConvertType(out[2], new([][32]byte)).(*[][32]byte)
-
- return out0, out1, out2, err
-
-}
-
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) GetRequestConfig() (uint16, uint32, [][32]byte, error) {
- return _VRFCoordinatorV25.Contract.GetRequestConfig(&_VRFCoordinatorV25.CallOpts)
-}
-
-func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) GetRequestConfig() (uint16, uint32, [][32]byte, error) {
- return _VRFCoordinatorV25.Contract.GetRequestConfig(&_VRFCoordinatorV25.CallOpts)
-}
-
func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) GetSubscription(opts *bind.CallOpts, subId *big.Int) (GetSubscription,
error) {
@@ -439,28 +410,6 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) HashOfKey(publicKey [2
return _VRFCoordinatorV25.Contract.HashOfKey(&_VRFCoordinatorV25.CallOpts, publicKey)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) MigrationVersion(opts *bind.CallOpts) (uint8, error) {
- var out []interface{}
- err := _VRFCoordinatorV25.contract.Call(opts, &out, "migrationVersion")
-
- if err != nil {
- return *new(uint8), err
- }
-
- out0 := *abi.ConvertType(out[0], new(uint8)).(*uint8)
-
- return out0, err
-
-}
-
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) MigrationVersion() (uint8, error) {
- return _VRFCoordinatorV25.Contract.MigrationVersion(&_VRFCoordinatorV25.CallOpts)
-}
-
-func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) MigrationVersion() (uint8, error) {
- return _VRFCoordinatorV25.Contract.MigrationVersion(&_VRFCoordinatorV25.CallOpts)
-}
-
func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) Owner(opts *bind.CallOpts) (common.Address, error) {
var out []interface{}
err := _VRFCoordinatorV25.contract.Call(opts, &out, "owner")
@@ -521,6 +470,10 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) SConfig(opts *bind.CallOpts)
outstruct.ReentrancyLock = *abi.ConvertType(out[2], new(bool)).(*bool)
outstruct.StalenessSeconds = *abi.ConvertType(out[3], new(uint32)).(*uint32)
outstruct.GasAfterPaymentCalculation = *abi.ConvertType(out[4], new(uint32)).(*uint32)
+ outstruct.FulfillmentFlatFeeNativePPM = *abi.ConvertType(out[5], new(uint32)).(*uint32)
+ outstruct.FulfillmentFlatFeeLinkDiscountPPM = *abi.ConvertType(out[6], new(uint32)).(*uint32)
+ outstruct.NativePremiumPercentage = *abi.ConvertType(out[7], new(uint8)).(*uint8)
+ outstruct.LinkPremiumPercentage = *abi.ConvertType(out[8], new(uint8)).(*uint8)
return *outstruct, err
@@ -582,36 +535,6 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) SFallbackWeiPerUnitLin
return _VRFCoordinatorV25.Contract.SFallbackWeiPerUnitLink(&_VRFCoordinatorV25.CallOpts)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) SFeeConfig(opts *bind.CallOpts) (SFeeConfig,
-
- error) {
- var out []interface{}
- err := _VRFCoordinatorV25.contract.Call(opts, &out, "s_feeConfig")
-
- outstruct := new(SFeeConfig)
- if err != nil {
- return *outstruct, err
- }
-
- outstruct.FulfillmentFlatFeeLinkPPM = *abi.ConvertType(out[0], new(uint32)).(*uint32)
- outstruct.FulfillmentFlatFeeNativePPM = *abi.ConvertType(out[1], new(uint32)).(*uint32)
-
- return *outstruct, err
-
-}
-
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) SFeeConfig() (SFeeConfig,
-
- error) {
- return _VRFCoordinatorV25.Contract.SFeeConfig(&_VRFCoordinatorV25.CallOpts)
-}
-
-func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) SFeeConfig() (SFeeConfig,
-
- error) {
- return _VRFCoordinatorV25.Contract.SFeeConfig(&_VRFCoordinatorV25.CallOpts)
-}
-
func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) SProvingKeyHashes(opts *bind.CallOpts, arg0 *big.Int) ([32]byte, error) {
var out []interface{}
err := _VRFCoordinatorV25.contract.Call(opts, &out, "s_provingKeyHashes", arg0)
@@ -634,25 +557,33 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) SProvingKeyHashes(arg0
return _VRFCoordinatorV25.Contract.SProvingKeyHashes(&_VRFCoordinatorV25.CallOpts, arg0)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) SProvingKeys(opts *bind.CallOpts, arg0 [32]byte) (bool, error) {
+func (_VRFCoordinatorV25 *VRFCoordinatorV25Caller) SProvingKeys(opts *bind.CallOpts, arg0 [32]byte) (SProvingKeys,
+
+ error) {
var out []interface{}
err := _VRFCoordinatorV25.contract.Call(opts, &out, "s_provingKeys", arg0)
+ outstruct := new(SProvingKeys)
if err != nil {
- return *new(bool), err
+ return *outstruct, err
}
- out0 := *abi.ConvertType(out[0], new(bool)).(*bool)
+ outstruct.Exists = *abi.ConvertType(out[0], new(bool)).(*bool)
+ outstruct.MaxGas = *abi.ConvertType(out[1], new(uint64)).(*uint64)
- return out0, err
+ return *outstruct, err
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) SProvingKeys(arg0 [32]byte) (bool, error) {
+func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) SProvingKeys(arg0 [32]byte) (SProvingKeys,
+
+ error) {
return _VRFCoordinatorV25.Contract.SProvingKeys(&_VRFCoordinatorV25.CallOpts, arg0)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) SProvingKeys(arg0 [32]byte) (bool, error) {
+func (_VRFCoordinatorV25 *VRFCoordinatorV25CallerSession) SProvingKeys(arg0 [32]byte) (SProvingKeys,
+
+ error) {
return _VRFCoordinatorV25.Contract.SProvingKeys(&_VRFCoordinatorV25.CallOpts, arg0)
}
@@ -806,16 +737,16 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) DeregisterProvingK
return _VRFCoordinatorV25.Contract.DeregisterProvingKey(&_VRFCoordinatorV25.TransactOpts, publicProvingKey)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) FulfillRandomWords(opts *bind.TransactOpts, proof VRFProof, rc VRFCoordinatorV25RequestCommitment) (*types.Transaction, error) {
- return _VRFCoordinatorV25.contract.Transact(opts, "fulfillRandomWords", proof, rc)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) FulfillRandomWords(opts *bind.TransactOpts, proof VRFProof, rc VRFCoordinatorV25RequestCommitment, onlyPremium bool) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.contract.Transact(opts, "fulfillRandomWords", proof, rc, onlyPremium)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) FulfillRandomWords(proof VRFProof, rc VRFCoordinatorV25RequestCommitment) (*types.Transaction, error) {
- return _VRFCoordinatorV25.Contract.FulfillRandomWords(&_VRFCoordinatorV25.TransactOpts, proof, rc)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) FulfillRandomWords(proof VRFProof, rc VRFCoordinatorV25RequestCommitment, onlyPremium bool) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.Contract.FulfillRandomWords(&_VRFCoordinatorV25.TransactOpts, proof, rc, onlyPremium)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) FulfillRandomWords(proof VRFProof, rc VRFCoordinatorV25RequestCommitment) (*types.Transaction, error) {
- return _VRFCoordinatorV25.Contract.FulfillRandomWords(&_VRFCoordinatorV25.TransactOpts, proof, rc)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) FulfillRandomWords(proof VRFProof, rc VRFCoordinatorV25RequestCommitment, onlyPremium bool) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.Contract.FulfillRandomWords(&_VRFCoordinatorV25.TransactOpts, proof, rc, onlyPremium)
}
func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) FundSubscriptionWithNative(opts *bind.TransactOpts, subId *big.Int) (*types.Transaction, error) {
@@ -902,16 +833,16 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) RegisterMigratable
return _VRFCoordinatorV25.Contract.RegisterMigratableCoordinator(&_VRFCoordinatorV25.TransactOpts, target)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) RegisterProvingKey(opts *bind.TransactOpts, publicProvingKey [2]*big.Int) (*types.Transaction, error) {
- return _VRFCoordinatorV25.contract.Transact(opts, "registerProvingKey", publicProvingKey)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) RegisterProvingKey(opts *bind.TransactOpts, publicProvingKey [2]*big.Int, maxGas uint64) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.contract.Transact(opts, "registerProvingKey", publicProvingKey, maxGas)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) RegisterProvingKey(publicProvingKey [2]*big.Int) (*types.Transaction, error) {
- return _VRFCoordinatorV25.Contract.RegisterProvingKey(&_VRFCoordinatorV25.TransactOpts, publicProvingKey)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) RegisterProvingKey(publicProvingKey [2]*big.Int, maxGas uint64) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.Contract.RegisterProvingKey(&_VRFCoordinatorV25.TransactOpts, publicProvingKey, maxGas)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) RegisterProvingKey(publicProvingKey [2]*big.Int) (*types.Transaction, error) {
- return _VRFCoordinatorV25.Contract.RegisterProvingKey(&_VRFCoordinatorV25.TransactOpts, publicProvingKey)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) RegisterProvingKey(publicProvingKey [2]*big.Int, maxGas uint64) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.Contract.RegisterProvingKey(&_VRFCoordinatorV25.TransactOpts, publicProvingKey, maxGas)
}
func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) RemoveConsumer(opts *bind.TransactOpts, subId *big.Int, consumer common.Address) (*types.Transaction, error) {
@@ -950,16 +881,16 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) RequestSubscriptio
return _VRFCoordinatorV25.Contract.RequestSubscriptionOwnerTransfer(&_VRFCoordinatorV25.TransactOpts, subId, newOwner)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) SetConfig(opts *bind.TransactOpts, minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig VRFCoordinatorV25FeeConfig) (*types.Transaction, error) {
- return _VRFCoordinatorV25.contract.Transact(opts, "setConfig", minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, feeConfig)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) SetConfig(opts *bind.TransactOpts, minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, fulfillmentFlatFeeNativePPM uint32, fulfillmentFlatFeeLinkDiscountPPM uint32, nativePremiumPercentage uint8, linkPremiumPercentage uint8) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.contract.Transact(opts, "setConfig", minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, fulfillmentFlatFeeNativePPM, fulfillmentFlatFeeLinkDiscountPPM, nativePremiumPercentage, linkPremiumPercentage)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig VRFCoordinatorV25FeeConfig) (*types.Transaction, error) {
- return _VRFCoordinatorV25.Contract.SetConfig(&_VRFCoordinatorV25.TransactOpts, minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, feeConfig)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25Session) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, fulfillmentFlatFeeNativePPM uint32, fulfillmentFlatFeeLinkDiscountPPM uint32, nativePremiumPercentage uint8, linkPremiumPercentage uint8) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.Contract.SetConfig(&_VRFCoordinatorV25.TransactOpts, minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, fulfillmentFlatFeeNativePPM, fulfillmentFlatFeeLinkDiscountPPM, nativePremiumPercentage, linkPremiumPercentage)
}
-func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig VRFCoordinatorV25FeeConfig) (*types.Transaction, error) {
- return _VRFCoordinatorV25.Contract.SetConfig(&_VRFCoordinatorV25.TransactOpts, minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, feeConfig)
+func (_VRFCoordinatorV25 *VRFCoordinatorV25TransactorSession) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, fulfillmentFlatFeeNativePPM uint32, fulfillmentFlatFeeLinkDiscountPPM uint32, nativePremiumPercentage uint8, linkPremiumPercentage uint8) (*types.Transaction, error) {
+ return _VRFCoordinatorV25.Contract.SetConfig(&_VRFCoordinatorV25.TransactOpts, minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, fulfillmentFlatFeeNativePPM, fulfillmentFlatFeeLinkDiscountPPM, nativePremiumPercentage, linkPremiumPercentage)
}
func (_VRFCoordinatorV25 *VRFCoordinatorV25Transactor) SetLINKAndLINKNativeFeed(opts *bind.TransactOpts, link common.Address, linkNativeFeed common.Address) (*types.Transaction, error) {
@@ -1071,13 +1002,16 @@ func (it *VRFCoordinatorV25ConfigSetIterator) Close() error {
}
type VRFCoordinatorV25ConfigSet struct {
- MinimumRequestConfirmations uint16
- MaxGasLimit uint32
- StalenessSeconds uint32
- GasAfterPaymentCalculation uint32
- FallbackWeiPerUnitLink *big.Int
- FeeConfig VRFCoordinatorV25FeeConfig
- Raw types.Log
+ MinimumRequestConfirmations uint16
+ MaxGasLimit uint32
+ StalenessSeconds uint32
+ GasAfterPaymentCalculation uint32
+ FallbackWeiPerUnitLink *big.Int
+ FulfillmentFlatFeeNativePPM uint32
+ FulfillmentFlatFeeLinkDiscountPPM uint32
+ NativePremiumPercentage uint8
+ LinkPremiumPercentage uint8
+ Raw types.Log
}
func (_VRFCoordinatorV25 *VRFCoordinatorV25Filterer) FilterConfigSet(opts *bind.FilterOpts) (*VRFCoordinatorV25ConfigSetIterator, error) {
@@ -2054,6 +1988,7 @@ func (it *VRFCoordinatorV25ProvingKeyDeregisteredIterator) Close() error {
type VRFCoordinatorV25ProvingKeyDeregistered struct {
KeyHash [32]byte
+ MaxGas uint64
Raw types.Log
}
@@ -2171,6 +2106,7 @@ func (it *VRFCoordinatorV25ProvingKeyRegisteredIterator) Close() error {
type VRFCoordinatorV25ProvingKeyRegistered struct {
KeyHash [32]byte
+ MaxGas uint64
Raw types.Log
}
@@ -2287,12 +2223,13 @@ func (it *VRFCoordinatorV25RandomWordsFulfilledIterator) Close() error {
}
type VRFCoordinatorV25RandomWordsFulfilled struct {
- RequestId *big.Int
- OutputSeed *big.Int
- SubId *big.Int
- Payment *big.Int
- Success bool
- Raw types.Log
+ RequestId *big.Int
+ OutputSeed *big.Int
+ SubId *big.Int
+ Payment *big.Int
+ Success bool
+ OnlyPremium bool
+ Raw types.Log
}
func (_VRFCoordinatorV25 *VRFCoordinatorV25Filterer) FilterRandomWordsFulfilled(opts *bind.FilterOpts, requestId []*big.Int, subId []*big.Int) (*VRFCoordinatorV25RandomWordsFulfilledIterator, error) {
@@ -3560,15 +3497,19 @@ type GetSubscription struct {
Consumers []common.Address
}
type SConfig struct {
- MinimumRequestConfirmations uint16
- MaxGasLimit uint32
- ReentrancyLock bool
- StalenessSeconds uint32
- GasAfterPaymentCalculation uint32
+ MinimumRequestConfirmations uint16
+ MaxGasLimit uint32
+ ReentrancyLock bool
+ StalenessSeconds uint32
+ GasAfterPaymentCalculation uint32
+ FulfillmentFlatFeeNativePPM uint32
+ FulfillmentFlatFeeLinkDiscountPPM uint32
+ NativePremiumPercentage uint8
+ LinkPremiumPercentage uint8
}
-type SFeeConfig struct {
- FulfillmentFlatFeeLinkPPM uint32
- FulfillmentFlatFeeNativePPM uint32
+type SProvingKeys struct {
+ Exists bool
+ MaxGas uint64
}
func (_VRFCoordinatorV25 *VRFCoordinatorV25) ParseLog(log types.Log) (generated.AbigenLog, error) {
@@ -3620,7 +3561,7 @@ func (_VRFCoordinatorV25 *VRFCoordinatorV25) ParseLog(log types.Log) (generated.
}
func (VRFCoordinatorV25ConfigSet) Topic() common.Hash {
- return common.HexToHash("0x777357bb93f63d088f18112d3dba38457aec633eb8f1341e1d418380ad328e78")
+ return common.HexToHash("0x2c6b6b12413678366b05b145c5f00745bdd00e739131ab5de82484a50c9d78b6")
}
func (VRFCoordinatorV25CoordinatorDeregistered) Topic() common.Hash {
@@ -3652,15 +3593,15 @@ func (VRFCoordinatorV25OwnershipTransferred) Topic() common.Hash {
}
func (VRFCoordinatorV25ProvingKeyDeregistered) Topic() common.Hash {
- return common.HexToHash("0xbd242ec01625c15ecbc02cf700ac8b02c86f7346fa91a08e186810221ae509d0")
+ return common.HexToHash("0x9b6868e0eb737bcd72205360baa6bfd0ba4e4819a33ade2db384e8a8025639a5")
}
func (VRFCoordinatorV25ProvingKeyRegistered) Topic() common.Hash {
- return common.HexToHash("0xc9583fd3afa3d7f16eb0b88d0268e7d05c09bafa4b21e092cbd1320e1bc8089d")
+ return common.HexToHash("0x9b911b2c240bfbef3b6a8f7ed6ee321d1258bb2a3fe6becab52ac1cd3210afd3")
}
func (VRFCoordinatorV25RandomWordsFulfilled) Topic() common.Hash {
- return common.HexToHash("0x49580fdfd9497e1ed5c1b1cec0495087ae8e3f1267470ec2fb015db32e3d6aa7")
+ return common.HexToHash("0x6c6b5394380e16e41988d8383648010de6f5c2e4814803be5de1c6b1c852db55")
}
func (VRFCoordinatorV25RandomWordsRequested) Topic() common.Hash {
@@ -3718,16 +3659,12 @@ type VRFCoordinatorV25Interface interface {
GetActiveSubscriptionIds(opts *bind.CallOpts, startIndex *big.Int, maxCount *big.Int) ([]*big.Int, error)
- GetRequestConfig(opts *bind.CallOpts) (uint16, uint32, [][32]byte, error)
-
GetSubscription(opts *bind.CallOpts, subId *big.Int) (GetSubscription,
error)
HashOfKey(opts *bind.CallOpts, publicKey [2]*big.Int) ([32]byte, error)
- MigrationVersion(opts *bind.CallOpts) (uint8, error)
-
Owner(opts *bind.CallOpts) (common.Address, error)
PendingRequestExists(opts *bind.CallOpts, subId *big.Int) (bool, error)
@@ -3740,13 +3677,11 @@ type VRFCoordinatorV25Interface interface {
SFallbackWeiPerUnitLink(opts *bind.CallOpts) (*big.Int, error)
- SFeeConfig(opts *bind.CallOpts) (SFeeConfig,
-
- error)
-
SProvingKeyHashes(opts *bind.CallOpts, arg0 *big.Int) ([32]byte, error)
- SProvingKeys(opts *bind.CallOpts, arg0 [32]byte) (bool, error)
+ SProvingKeys(opts *bind.CallOpts, arg0 [32]byte) (SProvingKeys,
+
+ error)
SRequestCommitments(opts *bind.CallOpts, arg0 *big.Int) ([32]byte, error)
@@ -3768,7 +3703,7 @@ type VRFCoordinatorV25Interface interface {
DeregisterProvingKey(opts *bind.TransactOpts, publicProvingKey [2]*big.Int) (*types.Transaction, error)
- FulfillRandomWords(opts *bind.TransactOpts, proof VRFProof, rc VRFCoordinatorV25RequestCommitment) (*types.Transaction, error)
+ FulfillRandomWords(opts *bind.TransactOpts, proof VRFProof, rc VRFCoordinatorV25RequestCommitment, onlyPremium bool) (*types.Transaction, error)
FundSubscriptionWithNative(opts *bind.TransactOpts, subId *big.Int) (*types.Transaction, error)
@@ -3784,7 +3719,7 @@ type VRFCoordinatorV25Interface interface {
RegisterMigratableCoordinator(opts *bind.TransactOpts, target common.Address) (*types.Transaction, error)
- RegisterProvingKey(opts *bind.TransactOpts, publicProvingKey [2]*big.Int) (*types.Transaction, error)
+ RegisterProvingKey(opts *bind.TransactOpts, publicProvingKey [2]*big.Int, maxGas uint64) (*types.Transaction, error)
RemoveConsumer(opts *bind.TransactOpts, subId *big.Int, consumer common.Address) (*types.Transaction, error)
@@ -3792,7 +3727,7 @@ type VRFCoordinatorV25Interface interface {
RequestSubscriptionOwnerTransfer(opts *bind.TransactOpts, subId *big.Int, newOwner common.Address) (*types.Transaction, error)
- SetConfig(opts *bind.TransactOpts, minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig VRFCoordinatorV25FeeConfig) (*types.Transaction, error)
+ SetConfig(opts *bind.TransactOpts, minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, fulfillmentFlatFeeNativePPM uint32, fulfillmentFlatFeeLinkDiscountPPM uint32, nativePremiumPercentage uint8, linkPremiumPercentage uint8) (*types.Transaction, error)
SetLINKAndLINKNativeFeed(opts *bind.TransactOpts, link common.Address, linkNativeFeed common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/generated/vrf_coordinator_v2plus_interface/vrf_coordinator_v2plus_interface.go b/core/gethwrappers/generated/vrf_coordinator_v2plus_interface/vrf_coordinator_v2plus_interface.go
index 9ed2e34687e..81b46bd4867 100644
--- a/core/gethwrappers/generated/vrf_coordinator_v2plus_interface/vrf_coordinator_v2plus_interface.go
+++ b/core/gethwrappers/generated/vrf_coordinator_v2plus_interface/vrf_coordinator_v2plus_interface.go
@@ -61,7 +61,7 @@ type VRFV2PlusClientRandomWordsRequest struct {
}
var IVRFCoordinatorV2PlusInternalMetaData = &bind.MetaData{
- ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structIVRFCoordinatorV2PlusInternal.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structIVRFCoordinatorV2PlusInternal.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestID\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structIVRFCoordinatorV2PlusInternal.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structIVRFCoordinatorV2PlusInternal.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"onlyPremium\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"requestID\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
}
var IVRFCoordinatorV2PlusInternalABI = IVRFCoordinatorV2PlusInternalMetaData.ABI
@@ -351,16 +351,16 @@ func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalTransactorSes
return _IVRFCoordinatorV2PlusInternal.Contract.CreateSubscription(&_IVRFCoordinatorV2PlusInternal.TransactOpts)
}
-func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalTransactor) FulfillRandomWords(opts *bind.TransactOpts, proof IVRFCoordinatorV2PlusInternalProof, rc IVRFCoordinatorV2PlusInternalRequestCommitment) (*types.Transaction, error) {
- return _IVRFCoordinatorV2PlusInternal.contract.Transact(opts, "fulfillRandomWords", proof, rc)
+func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalTransactor) FulfillRandomWords(opts *bind.TransactOpts, proof IVRFCoordinatorV2PlusInternalProof, rc IVRFCoordinatorV2PlusInternalRequestCommitment, onlyPremium bool) (*types.Transaction, error) {
+ return _IVRFCoordinatorV2PlusInternal.contract.Transact(opts, "fulfillRandomWords", proof, rc, onlyPremium)
}
-func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalSession) FulfillRandomWords(proof IVRFCoordinatorV2PlusInternalProof, rc IVRFCoordinatorV2PlusInternalRequestCommitment) (*types.Transaction, error) {
- return _IVRFCoordinatorV2PlusInternal.Contract.FulfillRandomWords(&_IVRFCoordinatorV2PlusInternal.TransactOpts, proof, rc)
+func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalSession) FulfillRandomWords(proof IVRFCoordinatorV2PlusInternalProof, rc IVRFCoordinatorV2PlusInternalRequestCommitment, onlyPremium bool) (*types.Transaction, error) {
+ return _IVRFCoordinatorV2PlusInternal.Contract.FulfillRandomWords(&_IVRFCoordinatorV2PlusInternal.TransactOpts, proof, rc, onlyPremium)
}
-func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalTransactorSession) FulfillRandomWords(proof IVRFCoordinatorV2PlusInternalProof, rc IVRFCoordinatorV2PlusInternalRequestCommitment) (*types.Transaction, error) {
- return _IVRFCoordinatorV2PlusInternal.Contract.FulfillRandomWords(&_IVRFCoordinatorV2PlusInternal.TransactOpts, proof, rc)
+func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalTransactorSession) FulfillRandomWords(proof IVRFCoordinatorV2PlusInternalProof, rc IVRFCoordinatorV2PlusInternalRequestCommitment, onlyPremium bool) (*types.Transaction, error) {
+ return _IVRFCoordinatorV2PlusInternal.Contract.FulfillRandomWords(&_IVRFCoordinatorV2PlusInternal.TransactOpts, proof, rc, onlyPremium)
}
func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalTransactor) FundSubscriptionWithNative(opts *bind.TransactOpts, subId *big.Int) (*types.Transaction, error) {
@@ -472,12 +472,13 @@ func (it *IVRFCoordinatorV2PlusInternalRandomWordsFulfilledIterator) Close() err
}
type IVRFCoordinatorV2PlusInternalRandomWordsFulfilled struct {
- RequestId *big.Int
- OutputSeed *big.Int
- SubId *big.Int
- Payment *big.Int
- Success bool
- Raw types.Log
+ RequestId *big.Int
+ OutputSeed *big.Int
+ SubId *big.Int
+ Payment *big.Int
+ Success bool
+ OnlyPremium bool
+ Raw types.Log
}
func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternalFilterer) FilterRandomWordsFulfilled(opts *bind.FilterOpts, requestId []*big.Int, subId []*big.Int) (*IVRFCoordinatorV2PlusInternalRandomWordsFulfilledIterator, error) {
@@ -728,7 +729,7 @@ func (_IVRFCoordinatorV2PlusInternal *IVRFCoordinatorV2PlusInternal) ParseLog(lo
}
func (IVRFCoordinatorV2PlusInternalRandomWordsFulfilled) Topic() common.Hash {
- return common.HexToHash("0x49580fdfd9497e1ed5c1b1cec0495087ae8e3f1267470ec2fb015db32e3d6aa7")
+ return common.HexToHash("0x6c6b5394380e16e41988d8383648010de6f5c2e4814803be5de1c6b1c852db55")
}
func (IVRFCoordinatorV2PlusInternalRandomWordsRequested) Topic() common.Hash {
@@ -760,7 +761,7 @@ type IVRFCoordinatorV2PlusInternalInterface interface {
CreateSubscription(opts *bind.TransactOpts) (*types.Transaction, error)
- FulfillRandomWords(opts *bind.TransactOpts, proof IVRFCoordinatorV2PlusInternalProof, rc IVRFCoordinatorV2PlusInternalRequestCommitment) (*types.Transaction, error)
+ FulfillRandomWords(opts *bind.TransactOpts, proof IVRFCoordinatorV2PlusInternalProof, rc IVRFCoordinatorV2PlusInternalRequestCommitment, onlyPremium bool) (*types.Transaction, error)
FundSubscriptionWithNative(opts *bind.TransactOpts, subId *big.Int) (*types.Transaction, error)
diff --git a/core/gethwrappers/generated/vrf_v2plus_upgraded_version/vrf_v2plus_upgraded_version.go b/core/gethwrappers/generated/vrf_v2plus_upgraded_version/vrf_v2plus_upgraded_version.go
index ae3b764b3ce..f81693ce06b 100644
--- a/core/gethwrappers/generated/vrf_v2plus_upgraded_version/vrf_v2plus_upgraded_version.go
+++ b/core/gethwrappers/generated/vrf_v2plus_upgraded_version/vrf_v2plus_upgraded_version.go
@@ -30,11 +30,6 @@ var (
_ = abi.ConvertType
)
-type VRFCoordinatorV2PlusUpgradedVersionFeeConfig struct {
- FulfillmentFlatFeeLinkPPM uint32
- FulfillmentFlatFeeNativePPM uint32
-}
-
type VRFCoordinatorV2PlusUpgradedVersionRequestCommitment struct {
BlockNum uint64
SubId *big.Int
@@ -66,8 +61,8 @@ type VRFV2PlusClientRandomWordsRequest struct {
}
var VRFCoordinatorV2PlusUpgradedVersionMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transferredValue\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"expectedValue\",\"type\":\"uint96\"}],\"name\":\"InvalidNativeBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"requestVersion\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"expectedVersion\",\"type\":\"uint8\"}],\"name\":\"InvalidVersion\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubscriptionIDCollisionFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structVRFCoordinatorV2PlusUpgradedVersion.FeeConfig\",\"name\":\"feeConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2PlusUpgradedVersion.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRequestConfig\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrationVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedData\",\"type\":\"bytes\"}],\"name\":\"onMigration\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"}],\"internalType\":\"structVRFCoordinatorV2PlusUpgradedVersion.FeeConfig\",\"name\":\"feeConfig\",\"type\":\"tuple\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b506040516200610538038062006105833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615f2a620001db600039600081816104a601526136510152615f2a6000f3fe6080604052600436106101e05760003560e01c8062012291146101e5578063088070f5146102125780630ae095401461029257806315c48b84146102b457806318e3dd27146102dc5780631b6b6d231461031b578063294daa49146103485780632f622e6b14610364578063330987b314610384578063405b84fa146103a457806340d6bb82146103c457806341af6c87146103ef57806351cff8d91461041f5780635d06b4ab1461043f57806364d51a2a1461045f5780636598274414610474578063689c45171461049457806372e9d565146104c857806379ba5097146104e85780637bce14d1146104fd5780638402595e1461051d57806386fe91c71461053d5780638da5cb5b1461055d57806395b55cfc1461057b5780639b1c385e1461058e5780639d40a6fd146105bc578063a21a23e4146105e9578063a4c0ed36146105fe578063aa433aff1461061e578063aefb212f1461063e578063b08c87951461066b578063b2a7cac51461068b578063bec4c08c146106ab578063caf70c4a146106cb578063cb631797146106eb578063ce3f47191461070b578063d98e620e1461071e578063dac83d291461073e578063dc311dd31461075e578063e72f6e301461078f578063ee9d2d38146107af578063f2fde38b146107dc575b600080fd5b3480156101f157600080fd5b506101fa6107fc565b604051610209939291906159b5565b60405180910390f35b34801561021e57600080fd5b50600c5461025a9061ffff81169063ffffffff62010000820481169160ff600160301b82041691600160381b8204811691600160581b90041685565b6040805161ffff909616865263ffffffff9485166020870152921515928501929092528216606084015216608082015260a001610209565b34801561029e57600080fd5b506102b26102ad366004615628565b610878565b005b3480156102c057600080fd5b506102c960c881565b60405161ffff9091168152602001610209565b3480156102e857600080fd5b50600a5461030390600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610209565b34801561032757600080fd5b5060025461033b906001600160a01b031681565b6040516102099190615859565b34801561035457600080fd5b5060405160028152602001610209565b34801561037057600080fd5b506102b261037f3660046151c6565b610946565b34801561039057600080fd5b5061030361039f36600461537d565b610aba565b3480156103b057600080fd5b506102b26103bf366004615628565b610f73565b3480156103d057600080fd5b506103da6101f481565b60405163ffffffff9091168152602001610209565b3480156103fb57600080fd5b5061040f61040a36600461560f565b61135e565b6040519015158152602001610209565b34801561042b57600080fd5b506102b261043a3660046151c6565b6114ff565b34801561044b57600080fd5b506102b261045a3660046151c6565b6116b0565b34801561046b57600080fd5b506102c9606481565b34801561048057600080fd5b506102b261048f3660046151e3565b611767565b3480156104a057600080fd5b5061033b7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d457600080fd5b5060035461033b906001600160a01b031681565b3480156104f457600080fd5b506102b26117c7565b34801561050957600080fd5b506102b2610518366004615277565b611871565b34801561052957600080fd5b506102b26105383660046151c6565b61196a565b34801561054957600080fd5b50600a54610303906001600160601b031681565b34801561056957600080fd5b506000546001600160a01b031661033b565b6102b261058936600461560f565b611a76565b34801561059a57600080fd5b506105ae6105a936600461545a565b611bba565b604051908152602001610209565b3480156105c857600080fd5b506007546105dc906001600160401b031681565b6040516102099190615b4e565b3480156105f557600080fd5b506105ae611f2a565b34801561060a57600080fd5b506102b261061936600461521c565b612178565b34801561062a57600080fd5b506102b261063936600461560f565b612315565b34801561064a57600080fd5b5061065e61065936600461564d565b612378565b60405161020991906158d0565b34801561067757600080fd5b506102b2610686366004615571565b612479565b34801561069757600080fd5b506102b26106a636600461560f565b6125ed565b3480156106b757600080fd5b506102b26106c6366004615628565b612711565b3480156106d757600080fd5b506105ae6106e636600461529f565b6128a8565b3480156106f757600080fd5b506102b2610706366004615628565b6128d8565b6102b26107193660046152f1565b612bc5565b34801561072a57600080fd5b506105ae61073936600461560f565b612ed6565b34801561074a57600080fd5b506102b2610759366004615628565b612ef7565b34801561076a57600080fd5b5061077e61077936600461560f565b613007565b604051610209959493929190615b62565b34801561079b57600080fd5b506102b26107aa3660046151c6565b613102565b3480156107bb57600080fd5b506105ae6107ca36600461560f565b600f6020526000908152604090205481565b3480156107e857600080fd5b506102b26107f73660046151c6565b6132dd565b600c54600e805460408051602080840282018101909252828152600094859460609461ffff8316946201000090930463ffffffff1693919283919083018282801561086657602002820191906000526020600020905b815481526020019060010190808311610852575b50505050509050925092509250909192565b60008281526005602052604090205482906001600160a01b0316806108b057604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b038216146108e45780604051636c51fda960e11b81526004016108db9190615859565b60405180910390fd5b600c54600160301b900460ff161561090f5760405163769dd35360e11b815260040160405180910390fd5b6109188461135e565b1561093657604051631685ecdd60e31b815260040160405180910390fd5b61094084846132ee565b50505050565b600c54600160301b900460ff16156109715760405163769dd35360e11b815260040160405180910390fd5b6109796134a9565b600b54600160601b90046001600160601b03166109a957604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c6109cc8380615d6a565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b0316610a149190615d6a565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610a8e576040519150601f19603f3d011682016040523d82523d6000602084013e610a93565b606091505b5050905080610ab55760405163950b247960e01b815260040160405180910390fd5b505050565b600c54600090600160301b900460ff1615610ae85760405163769dd35360e11b815260040160405180910390fd5b60005a90506000610af985856134fe565b90506000846060015163ffffffff166001600160401b03811115610b1f57610b1f615e9c565b604051908082528060200260200182016040528015610b48578160200160208202803683370190505b50905060005b856060015163ffffffff16811015610bbf57826040015181604051602001610b779291906158e3565b6040516020818303038152906040528051906020012060001c828281518110610ba257610ba2615e86565b602090810291909101015280610bb781615dee565b915050610b4e565b50602080830180516000908152600f9092526040808320839055905190518291631fe543e360e01b91610bf791908690602401615a3f565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b179055908801516080890151919250600091610c5c9163ffffffff169084613769565b600c805460ff60301b19169055602089810151600090815260069091526040902054909150600160c01b90046001600160401b0316610c9c816001615cdc565b6020808b0151600090815260069091526040812080546001600160401b0393909316600160c01b026001600160c01b039093169290921790915560a08a01518051610ce990600190615d53565b81518110610cf957610cf9615e86565b602091010151600c5460f89190911c6001149150600090610d2a908a90600160581b900463ffffffff163a856137b7565b90508115610e22576020808c01516000908152600690915260409020546001600160601b03808316600160601b909204161015610d7a57604051631e9acf1760e31b815260040160405180910390fd5b60208b81015160009081526006909152604090208054829190600c90610db1908490600160601b90046001600160601b0316615d6a565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b600c8282829054906101000a90046001600160601b0316610df99190615cfe565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550610efd565b6020808c01516000908152600690915260409020546001600160601b0380831691161015610e6357604051631e9acf1760e31b815260040160405180910390fd5b6020808c015160009081526006909152604081208054839290610e909084906001600160601b0316615d6a565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b60008282829054906101000a90046001600160601b0316610ed89190615cfe565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b8a6020015188602001517f49580fdfd9497e1ed5c1b1cec0495087ae8e3f1267470ec2fb015db32e3d6aa78a604001518488604051610f5a939291909283526001600160601b039190911660208301521515604082015260600190565b60405180910390a3985050505050505050505b92915050565b600c54600160301b900460ff1615610f9e5760405163769dd35360e11b815260040160405180910390fd5b610fa781613806565b610fc65780604051635428d44960e01b81526004016108db9190615859565b600080600080610fd586613007565b945094505093509350336001600160a01b0316826001600160a01b0316146110385760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b60448201526064016108db565b6110418661135e565b156110875760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b60448201526064016108db565b60006040518060c0016040528061109c600290565b60ff168152602001888152602001846001600160a01b03168152602001838152602001866001600160601b03168152602001856001600160601b031681525090506000816040516020016110f09190615922565b604051602081830303815290604052905061110a88613870565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b0388169061114390859060040161590f565b6000604051808303818588803b15801561115c57600080fd5b505af1158015611170573d6000803e3d6000fd5b50506002546001600160a01b031615801593509150611199905057506001600160601b03861615155b156112635760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906111d0908a908a906004016158a0565b602060405180830381600087803b1580156111ea57600080fd5b505af11580156111fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122291906152bb565b6112635760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b60448201526064016108db565b600c805460ff60301b1916600160301b17905560005b835181101561130c5783818151811061129457611294615e86565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b81526004016112c79190615859565b600060405180830381600087803b1580156112e157600080fd5b505af11580156112f5573d6000803e3d6000fd5b50505050808061130490615dee565b915050611279565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be41879061134c9089908b9061586d565b60405180910390a15050505050505050565b6000818152600560209081526040808320815160608101835281546001600160a01b03908116825260018301541681850152600282018054845181870281018701865281815287969395860193909291908301828280156113e857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116113ca575b505050505081525050905060005b8160400151518110156114f55760005b600e548110156114e25760006114ab600e838154811061142857611428615e86565b90600052602060002001548560400151858151811061144957611449615e86565b602002602001015188600460008960400151898151811061146c5761146c615e86565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081208d82529092529020546001600160401b0316613abe565b506000818152600f6020526040902054909150156114cf5750600195945050505050565b50806114da81615dee565b915050611406565b50806114ed81615dee565b9150506113f6565b5060009392505050565b600c54600160301b900460ff161561152a5760405163769dd35360e11b815260040160405180910390fd5b6115326134a9565b6002546001600160a01b031661155b5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b031661158457604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006115a08380615d6a565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115e89190615d6a565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061163d90859085906004016158a0565b602060405180830381600087803b15801561165757600080fd5b505af115801561166b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168f91906152bb565b6116ac57604051631e9acf1760e31b815260040160405180910390fd5b5050565b6116b86134a9565b6116c181613806565b156116e1578060405163ac8a27ef60e01b81526004016108db9190615859565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af016259061175c908390615859565b60405180910390a150565b61176f6134a9565b6002546001600160a01b03161561179957604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b0316331461181a5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b60448201526064016108db565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6118796134a9565b6040805180820182526000916118a89190849060029083908390808284376000920191909152506128a8915050565b6000818152600d602052604090205490915060ff16156118de57604051634a0b8fa760e01b8152600481018290526024016108db565b6000818152600d6020526040808220805460ff19166001908117909155600e805491820181559092527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101829055517fc9583fd3afa3d7f16eb0b88d0268e7d05c09bafa4b21e092cbd1320e1bc8089d9061195e9083815260200190565b60405180910390a15050565b6119726134a9565b600a544790600160601b90046001600160601b0316818111156119ac5780826040516354ced18160e11b81526004016108db9291906158e3565b81811015610ab55760006119c08284615d53565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d8060008114611a0f576040519150601f19603f3d011682016040523d82523d6000602084013e611a14565b606091505b5050905080611a365760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c8583604051611a6792919061586d565b60405180910390a15050505050565b600c54600160301b900460ff1615611aa15760405163769dd35360e11b815260040160405180910390fd5b6000818152600560205260409020546001600160a01b0316611ad657604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611b058385615cfe565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611b4d9190615cfe565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611ba09190615cc4565b604051611bae9291906158e3565b60405180910390a25050565b600c54600090600160301b900460ff1615611be85760405163769dd35360e11b815260040160405180910390fd5b6020808301356000908152600590915260409020546001600160a01b0316611c2357604051630fb532db60e11b815260040160405180910390fd5b3360009081526004602090815260408083208583013584529091529020546001600160401b031680611c70578260200135336040516379bfd40160e01b81526004016108db929190615a14565b600c5461ffff16611c876060850160408601615556565b61ffff161080611caa575060c8611ca46060850160408601615556565b61ffff16115b15611ce457611cbf6060840160408501615556565b600c5460405163539c34bb60e11b81526108db929161ffff169060c890600401615997565b600c5462010000900463ffffffff16611d03608085016060860161566f565b63ffffffff161115611d4957611d1f608084016060850161566f565b600c54604051637aebf00f60e11b81526108db929162010000900463ffffffff1690600401615b37565b6101f4611d5c60a085016080860161566f565b63ffffffff161115611d9657611d7860a084016080850161566f565b6101f46040516311ce1afb60e21b81526004016108db929190615b37565b6000611da3826001615cdc565b9050600080611db9863533602089013586613abe565b90925090506000611dd5611dd060a0890189615bb7565b613b47565b90506000611de282613bc4565b905083611ded613c35565b60208a0135611e0260808c0160608d0161566f565b611e1260a08d0160808e0161566f565b3386604051602001611e2a9796959493929190615a97565b60405160208183030381529060405280519060200120600f600086815260200190815260200160002081905550336001600160a01b0316886020013589600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e87878d6040016020810190611ea19190615556565b8e6060016020810190611eb4919061566f565b8f6080016020810190611ec7919061566f565b89604051611eda96959493929190615a58565b60405180910390a45050336000908152600460209081526040808320898301358452909152902080546001600160401b0319166001600160401b039490941693909317909255925050505b919050565b600c54600090600160301b900460ff1615611f585760405163769dd35360e11b815260040160405180910390fd5b600033611f66600143615d53565b600754604051606093841b6001600160601b03199081166020830152924060348201523090931b909116605483015260c01b6001600160c01b031916606882015260700160408051601f198184030181529190528051602090910120600780549192506001600160401b03909116906000611fe083615e09565b91906101000a8154816001600160401b0302191690836001600160401b03160217905550506000806001600160401b0381111561201f5761201f615e9c565b604051908082528060200260200182016040528015612048578160200160208202803683370190505b506040805160608082018352600080835260208084018281528486018381528984526006835286842095518654925191516001600160601b039182166001600160c01b031990941693909317600160601b9190921602176001600160c01b0316600160c01b6001600160401b039092169190910217909355835191820184523382528183018181528285018681528883526005855294909120825181546001600160a01b03199081166001600160a01b0392831617835592516001830180549094169116179091559251805194955090936121299260028501920190614e37565b5061213991506008905083613cc5565b50817f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d3360405161216a9190615859565b60405180910390a250905090565b600c54600160301b900460ff16156121a35760405163769dd35360e11b815260040160405180910390fd5b6002546001600160a01b031633146121ce576040516344b0e3c360e01b815260040160405180910390fd5b602081146121ef57604051638129bbcd60e01b815260040160405180910390fd5b60006121fd8284018461560f565b6000818152600560205260409020549091506001600160a01b031661223557604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b03169186919061225c8385615cfe565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b03166122a49190615cfe565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a8287846122f79190615cc4565b6040516123059291906158e3565b60405180910390a2505050505050565b61231d6134a9565b6000818152600560205260409020546001600160a01b031661235257604051630fb532db60e11b815260040160405180910390fd5b6000818152600560205260409020546123759082906001600160a01b03166132ee565b50565b606060006123866008613cd1565b90508084106123a857604051631390f2a160e01b815260040160405180910390fd5b60006123b48486615cc4565b9050818111806123c2575083155b6123cc57806123ce565b815b905060006123dc8683615d53565b6001600160401b038111156123f3576123f3615e9c565b60405190808252806020026020018201604052801561241c578160200160208202803683370190505b50905060005b815181101561246f576124406124388883615cc4565b600890613cdb565b82828151811061245257612452615e86565b60209081029190910101528061246781615dee565b915050612422565b5095945050505050565b6124816134a9565b60c861ffff871611156124ae57858660c860405163539c34bb60e11b81526004016108db93929190615997565b600082136124d2576040516321ea67b360e11b8152600481018390526024016108db565b6040805160a0808201835261ffff891680835263ffffffff89811660208086018290526000868801528a831660608088018290528b85166080988901819052600c805465ffffffffffff1916881762010000870217600160301b600160781b031916600160381b850263ffffffff60581b191617600160581b83021790558a51601180548d8701519289166001600160401b031990911617600160201b92891692909202919091179081905560108d90558a519788528785019590955298860191909152840196909652938201879052838116928201929092529190921c90911660c08201527f777357bb93f63d088f18112d3dba38457aec633eb8f1341e1d418380ad328e789060e00160405180910390a1505050505050565b600c54600160301b900460ff16156126185760405163769dd35360e11b815260040160405180910390fd5b6000818152600560205260409020546001600160a01b031661264d57604051630fb532db60e11b815260040160405180910390fd5b6000818152600560205260409020600101546001600160a01b031633146126a4576000818152600560205260409081902060010154905163d084e97560e01b81526108db916001600160a01b031690600401615859565b6000818152600560205260409081902080546001600160a01b031980821633908117845560019093018054909116905591516001600160a01b039092169183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611bae918591615886565b60008281526005602052604090205482906001600160a01b03168061274957604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b038216146127745780604051636c51fda960e11b81526004016108db9190615859565b600c54600160301b900460ff161561279f5760405163769dd35360e11b815260040160405180910390fd5b600084815260056020526040902060020154606414156127d2576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b03831660009081526004602090815260408083208784529091529020546001600160401b03161561280957610940565b6001600160a01b0383166000818152600460209081526040808320888452825280832080546001600160401b031916600190811790915560058352818420600201805491820181558452919092200180546001600160a01b0319169092179091555184907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e19061289a908690615859565b60405180910390a250505050565b6000816040516020016128bb91906158c2565b604051602081830303815290604052805190602001209050919050565b60008281526005602052604090205482906001600160a01b03168061291057604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b0382161461293b5780604051636c51fda960e11b81526004016108db9190615859565b600c54600160301b900460ff16156129665760405163769dd35360e11b815260040160405180910390fd5b61296f8461135e565b1561298d57604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03831660009081526004602090815260408083208784529091529020546001600160401b03166129db5783836040516379bfd40160e01b81526004016108db929190615a14565b600084815260056020908152604080832060020180548251818502810185019093528083529192909190830182828015612a3e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612a20575b50505050509050600060018251612a559190615d53565b905060005b8251811015612b6157856001600160a01b0316838281518110612a7f57612a7f615e86565b60200260200101516001600160a01b03161415612b4f576000838381518110612aaa57612aaa615e86565b6020026020010151905080600560008a81526020019081526020016000206002018381548110612adc57612adc615e86565b600091825260208083209190910180546001600160a01b0319166001600160a01b039490941693909317909255898152600590915260409020600201805480612b2757612b27615e70565b600082815260209020810160001990810180546001600160a01b031916905501905550612b61565b80612b5981615dee565b915050612a5a565b506001600160a01b03851660009081526004602090815260408083208984529091529081902080546001600160401b03191690555186907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a790612305908890615859565b6000612bd382840184615494565b9050806000015160ff16600114612c0c57805160405163237d181f60e21b815260ff9091166004820152600160248201526044016108db565b8060a001516001600160601b03163414612c505760a08101516040516306acf13560e41b81523460048201526001600160601b0390911660248201526044016108db565b6020808201516000908152600590915260409020546001600160a01b031615612c8c576040516326afa43560e11b815260040160405180910390fd5b60005b816060015151811015612d2c5760016004600084606001518481518110612cb857612cb8615e86565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008460200151815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b031602179055508080612d2490615dee565b915050612c8f565b50604080516060808201835260808401516001600160601b03908116835260a0850151811660208085019182526000858701818152828901805183526006845288832097518854955192516001600160401b0316600160c01b026001600160c01b03938816600160601b026001600160c01b0319909716919097161794909417169390931790945584518084018652868601516001600160a01b03908116825281860184815294880151828801908152925184526005865295909220825181549087166001600160a01b0319918216178255935160018201805491909716941693909317909455925180519192612e2b92600285019290910190614e37565b5050506080810151600a8054600090612e4e9084906001600160601b0316615cfe565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508060a00151600a600c8282829054906101000a90046001600160601b0316612e9a9190615cfe565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555061094081602001516008613cc590919063ffffffff16565b600e8181548110612ee657600080fd5b600091825260209091200154905081565b60008281526005602052604090205482906001600160a01b031680612f2f57604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b03821614612f5a5780604051636c51fda960e11b81526004016108db9190615859565b600c54600160301b900460ff1615612f855760405163769dd35360e11b815260040160405180910390fd5b6000848152600560205260409020600101546001600160a01b03848116911614610940576000848152600560205260409081902060010180546001600160a01b0319166001600160a01b0386161790555184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a19061289a9033908790615886565b6000818152600560205260408120548190819081906060906001600160a01b031661304557604051630fb532db60e11b815260040160405180910390fd5b60008681526006602090815260408083205460058352928190208054600290910180548351818602810186019094528084526001600160601b0380871696600160601b810490911695600160c01b9091046001600160401b0316946001600160a01b03909416939183918301828280156130e857602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116130ca575b505050505090509450945094509450945091939590929450565b61310a6134a9565b6002546001600160a01b03166131335760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613164903090600401615859565b60206040518083038186803b15801561317c57600080fd5b505afa158015613190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131b491906152d8565b600a549091506001600160601b0316818111156131e85780826040516354ced18160e11b81526004016108db9291906158e3565b81811015610ab55760006131fc8284615d53565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061322f908790859060040161586d565b602060405180830381600087803b15801561324957600080fd5b505af115801561325d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061328191906152bb565b61329e57604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b43660084826040516132cf92919061586d565b60405180910390a150505050565b6132e56134a9565b61237581613ce7565b6000806132fa84613870565b60025491935091506001600160a01b03161580159061332157506001600160601b03821615155b156133d05760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906133619086906001600160601b0387169060040161586d565b602060405180830381600087803b15801561337b57600080fd5b505af115801561338f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133b391906152bb565b6133d057604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114613426576040519150601f19603f3d011682016040523d82523d6000602084013e61342b565b606091505b505090508061344d5760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b038581166020830152841681830152905186917f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4919081900360600190a25050505050565b6000546001600160a01b031633146134fc5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b60448201526064016108db565b565b6040805160608101825260008082526020820181905291810191909152600061352a84600001516128a8565b6000818152600d602052604090205490915060ff1661355f57604051631dfd6e1360e21b8152600481018290526024016108db565b60008185608001516040516020016135789291906158e3565b60408051601f1981840301815291815281516020928301206000818152600f909352912054909150806135be57604051631b44092560e11b815260040160405180910390fd5b845160208087015160408089015160608a015160808b015160a08c015193516135ed978a979096959101615ae3565b6040516020818303038152906040528051906020012081146136225760405163354a450b60e21b815260040160405180910390fd5b60006136318660000151613d8b565b9050806136f8578551604051631d2827a760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e9413d38916136859190600401615b4e565b60206040518083038186803b15801561369d57600080fd5b505afa1580156136b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136d591906152d8565b9050806136f857855160405163175dadad60e01b81526108db9190600401615b4e565b600087608001518260405160200161371a929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006137418983613e68565b6040805160608101825297885260208801969096529486019490945250929695505050505050565b60005a61138881101561377b57600080fd5b61138881039050846040820482031161379357600080fd5b50823b61379f57600080fd5b60008083516020850160008789f190505b9392505050565b600081156137e4576011546137dd9086908690600160201b900463ffffffff1686613ed3565b90506137fe565b6011546137fb908690869063ffffffff1686613f75565b90505b949350505050565b6000805b60125481101561386757826001600160a01b03166012828154811061383157613831615e86565b6000918252602090912001546001600160a01b031614156138555750600192915050565b8061385f81615dee565b91505061380a565b50600092915050565b6000818152600560209081526040808320815160608101835281546001600160a01b039081168252600183015416818501526002820180548451818702810187018652818152879687969495948601939192908301828280156138fc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116138de575b505050919092525050506000858152600660209081526040808320815160608101835290546001600160601b03808216808452600160601b8304909116948301859052600160c01b9091046001600160401b0316928201929092529096509094509192505b8260400151518110156139d857600460008460400151838151811061398857613988615e86565b6020908102919091018101516001600160a01b031682528181019290925260409081016000908120898252909252902080546001600160401b0319169055806139d081615dee565b915050613961565b50600085815260056020526040812080546001600160a01b03199081168255600182018054909116905590613a106002830182614e9c565b5050600085815260066020526040812055613a2c60088661409a565b50600a8054859190600090613a4b9084906001600160601b0316615d6a565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555082600a600c8282829054906101000a90046001600160601b0316613a939190615d6a565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505050915091565b60408051602081018690526001600160a01b03851691810191909152606081018390526001600160401b03821660808201526000908190819060a00160408051601f198184030181529082905280516020918201209250613b239189918491016158e3565b60408051808303601f19018152919052805160209091012097909650945050505050565b60408051602081019091526000815281613b705750604080516020810190915260008152610f6d565b63125fa26760e31b613b828385615d92565b6001600160e01b03191614613baa57604051632923fee760e11b815260040160405180910390fd5b613bb78260048186615c9a565b8101906137b09190615332565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa82604051602401613bfd91511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b600046613c41816140a6565b15613cbe5760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b158015613c8057600080fd5b505afa158015613c94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cb891906152d8565b91505090565b4391505090565b60006137b083836140c9565b6000610f6d825490565b60006137b08383614118565b6001600160a01b038116331415613d3a5760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b60448201526064016108db565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613d97816140a6565b15613e5957610100836001600160401b0316613db1613c35565b613dbb9190615d53565b1180613dd75750613dca613c35565b836001600160401b031610155b15613de55750600092915050565b6040516315a03d4160e11b8152606490632b407a8290613e09908690600401615b4e565b60206040518083038186803b158015613e2157600080fd5b505afa158015613e35573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b091906152d8565b50506001600160401b03164090565b6000613e9c8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151614142565b60038360200151604051602001613eb4929190615a2b565b60408051601f1981840301815291905280516020909101209392505050565b600080613f166000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061435d92505050565b905060005a613f258888615cc4565b613f2f9190615d53565b613f399085615d34565b90506000613f5263ffffffff871664e8d4a51000615d34565b905082613f5f8284615cc4565b613f699190615cc4565b98975050505050505050565b600080613f80614422565b905060008113613fa6576040516321ea67b360e11b8152600481018290526024016108db565b6000613fe86000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061435d92505050565b9050600082825a613ff98b8b615cc4565b6140039190615d53565b61400d9088615d34565b6140179190615cc4565b61402990670de0b6b3a7640000615d34565b6140339190615d20565b9050600061404c63ffffffff881664e8d4a51000615d34565b905061406381676765c793fa10079d601b1b615d53565b8211156140835760405163e80fa38160e01b815260040160405180910390fd5b61408d8183615cc4565b9998505050505050505050565b60006137b083836144ed565b600061a4b18214806140ba575062066eed82145b80610f6d57505062066eee1490565b600081815260018301602052604081205461411057508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610f6d565b506000610f6d565b600082600001828154811061412f5761412f615e86565b9060005260206000200154905092915050565b61414b896145e0565b6141945760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b60448201526064016108db565b61419d886145e0565b6141e15760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b60448201526064016108db565b6141ea836145e0565b6142365760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e20637572766500000060448201526064016108db565b61423f826145e0565b61428a5760405162461bcd60e51b815260206004820152601c60248201527b73486173685769746e657373206973206e6f74206f6e20637572766560201b60448201526064016108db565b614296878a88876146a3565b6142de5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b60448201526064016108db565b60006142ea8a876147b7565b905060006142fd898b878b86898961481b565b9050600061430e838d8d8a8661492e565b9050808a1461434f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b60448201526064016108db565b505050505050505050505050565b600046614369816140a6565b156143a857606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613e2157600080fd5b6143b18161496e565b1561386757600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615ed6604891396040516020016143f79291906157af565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613e09919061590f565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169283151592859283926001600160a01b03169163feaf968c9160048083019260a0929190829003018186803b15801561448057600080fd5b505afa158015614494573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144b8919061568a565b5094509092508491505080156144dc57506144d38242615d53565b8463ffffffff16105b156137fe5750601054949350505050565b600081815260018301602052604081205480156145d6576000614511600183615d53565b855490915060009061452590600190615d53565b905081811461458a57600086600001828154811061454557614545615e86565b906000526020600020015490508087600001848154811061456857614568615e86565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061459b5761459b615e70565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610f6d565b6000915050610f6d565b80516000906401000003d0191161462e5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b60448201526064016108db565b60208201516401000003d0191161467c5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b60448201526064016108db565b60208201516401000003d01990800961469c8360005b60200201516149a8565b1492915050565b60006001600160a01b0382166146e95760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b60448201526064016108db565b60208401516000906001161561470057601c614703565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe199182039250600091908909875160408051600080825260209091019182905292935060019161476d918691889187906158f1565b6020604051602081039080840390855afa15801561478f573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b6147bf614eba565b6147ec600184846040516020016147d893929190615838565b6040516020818303038152906040526149cc565b90505b6147f8816145e0565b610f6d57805160408051602081019290925261481491016147d8565b90506147ef565b614823614eba565b825186516401000003d01990819006910614156148825760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e6374000060448201526064016108db565b61488d878988614a1a565b6148d25760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b60448201526064016108db565b6148dd848685614a1a565b6149235760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b60448201526064016108db565b613f69868484614b35565b60006002868686858760405160200161494c969594939291906157de565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061498057506101a482145b8061498d575062aa37dc82145b80614999575061210582145b80610f6d57505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b6149d4614eba565b6149dd82614bf8565b81526149f26149ed826000614692565b614c33565b602082018190526002900660011415611f25576020810180516401000003d019039052919050565b600082614a575760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b60448201526064016108db565b83516020850151600090614a6d90600290615e30565b15614a7957601c614a7c565b601b5b9050600070014551231950b75fc4402da1732fc9bebe19838709604080516000808252602090910191829052919250600190614abf9083908690889087906158f1565b6020604051602081039080840390855afa158015614ae1573d6000803e3d6000fd5b505050602060405103519050600086604051602001614b00919061579d565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b614b3d614eba565b835160208086015185519186015160009384938493614b5e93909190614c53565b919450925090506401000003d019858209600114614bba5760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b60448201526064016108db565b60405180604001604052806401000003d01980614bd957614bd9615e5a565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611f2557604080516020808201939093528151808203840181529082019091528051910120614c00565b6000610f6d826002614c4c6401000003d0196001615cc4565b901c614d33565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a0890506000614c9383838585614dca565b9098509050614ca488828e88614dee565b9098509050614cb588828c87614dee565b90985090506000614cc88d878b85614dee565b9098509050614cd988828686614dca565b9098509050614cea88828e89614dee565b9098509050818114614d1f576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614d23565b8196505b5050505050509450945094915050565b600080614d3e614ed8565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614d70614ef6565b60208160c0846005600019fa925082614dc05760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b60448201526064016108db565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614e8c579160200282015b82811115614e8c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614e57565b50614e98929150614f14565b5090565b50805460008255906000526020600020908101906123759190614f14565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614e985760008155600101614f15565b8035611f2581615eb2565b600082601f830112614f4557600080fd5b813560206001600160401b03821115614f6057614f60615e9c565b8160051b614f6f828201615c6a565b838152828101908684018388018501891015614f8a57600080fd5b600093505b85841015614fb6578035614fa281615eb2565b835260019390930192918401918401614f8f565b50979650505050505050565b600082601f830112614fd357600080fd5b614fdb615bfd565b808385604086011115614fed57600080fd5b60005b600281101561500f578135845260209384019390910190600101614ff0565b509095945050505050565b60008083601f84011261502c57600080fd5b5081356001600160401b0381111561504357600080fd5b60208301915083602082850101111561505b57600080fd5b9250929050565b600082601f83011261507357600080fd5b81356001600160401b0381111561508c5761508c615e9c565b61509f601f8201601f1916602001615c6a565b8181528460208386010111156150b457600080fd5b816020850160208301376000918101602001919091529392505050565b600060c082840312156150e357600080fd5b6150eb615c25565b905081356001600160401b03808216821461510557600080fd5b8183526020840135602084015261511e60408501615184565b604084015261512f60608501615184565b606084015261514060808501614f29565b608084015260a084013591508082111561515957600080fd5b5061516684828501615062565b60a08301525092915050565b803561ffff81168114611f2557600080fd5b803563ffffffff81168114611f2557600080fd5b80516001600160501b0381168114611f2557600080fd5b80356001600160601b0381168114611f2557600080fd5b6000602082840312156151d857600080fd5b81356137b081615eb2565b600080604083850312156151f657600080fd5b823561520181615eb2565b9150602083013561521181615eb2565b809150509250929050565b6000806000806060858703121561523257600080fd5b843561523d81615eb2565b93506020850135925060408501356001600160401b0381111561525f57600080fd5b61526b8782880161501a565b95989497509550505050565b60006040828403121561528957600080fd5b8260408301111561529957600080fd5b50919050565b6000604082840312156152b157600080fd5b6137b08383614fc2565b6000602082840312156152cd57600080fd5b81516137b081615ec7565b6000602082840312156152ea57600080fd5b5051919050565b6000806020838503121561530457600080fd5b82356001600160401b0381111561531a57600080fd5b6153268582860161501a565b90969095509350505050565b60006020828403121561534457600080fd5b604051602081016001600160401b038111828210171561536657615366615e9c565b604052823561537481615ec7565b81529392505050565b6000808284036101c081121561539257600080fd5b6101a0808212156153a257600080fd5b6153aa615c47565b91506153b68686614fc2565b82526153c58660408701614fc2565b60208301526080850135604083015260a0850135606083015260c085013560808301526153f460e08601614f29565b60a083015261010061540887828801614fc2565b60c084015261541b876101408801614fc2565b60e0840152610180860135908301529092508301356001600160401b0381111561544457600080fd5b615450858286016150d1565b9150509250929050565b60006020828403121561546c57600080fd5b81356001600160401b0381111561548257600080fd5b820160c081850312156137b057600080fd5b6000602082840312156154a657600080fd5b81356001600160401b03808211156154bd57600080fd5b9083019060c082860312156154d157600080fd5b6154d9615c25565b823560ff811681146154ea57600080fd5b81526020838101359082015261550260408401614f29565b604082015260608301358281111561551957600080fd5b61552587828601614f34565b606083015250615537608084016151af565b608082015261554860a084016151af565b60a082015295945050505050565b60006020828403121561556857600080fd5b6137b082615172565b60008060008060008086880360e081121561558b57600080fd5b61559488615172565b96506155a260208901615184565b95506155b060408901615184565b94506155be60608901615184565b9350608088013592506040609f19820112156155d957600080fd5b506155e2615bfd565b6155ee60a08901615184565b81526155fc60c08901615184565b6020820152809150509295509295509295565b60006020828403121561562157600080fd5b5035919050565b6000806040838503121561563b57600080fd5b82359150602083013561521181615eb2565b6000806040838503121561566057600080fd5b50508035926020909101359150565b60006020828403121561568157600080fd5b6137b082615184565b600080600080600060a086880312156156a257600080fd5b6156ab86615198565b94506020860151935060408601519250606086015191506156ce60808701615198565b90509295509295909350565b600081518084526020808501945080840160005b838110156157135781516001600160a01b0316875295820195908201906001016156ee565b509495945050505050565b8060005b6002811015610940578151845260209384019390910190600101615722565b600081518084526020808501945080840160005b8381101561571357815187529582019590820190600101615755565b60008151808452615789816020860160208601615dc2565b601f01601f19169290920160200192915050565b6157a7818361571e565b604001919050565b600083516157c1818460208801615dc2565b8351908301906157d5818360208801615dc2565b01949350505050565b8681526157ee602082018761571e565b6157fb606082018661571e565b61580860a082018561571e565b61581560e082018461571e565b60609190911b6001600160601b0319166101208201526101340195945050505050565b838152615848602082018461571e565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b60408101610f6d828461571e565b6020815260006137b06020830184615741565b918252602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b6020815260006137b06020830184615771565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c0608084015261596760e08401826156da565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b61ffff93841681529183166020830152909116604082015260600190565b60006060820161ffff86168352602063ffffffff86168185015260606040850152818551808452608086019150828701935060005b81811015615a06578451835293830193918301916001016159ea565b509098975050505050505050565b9182526001600160a01b0316602082015260400190565b828152606081016137b0602083018461571e565b8281526040602082015260006137fe6040830184615741565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a0830152613f6960c0830184615771565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c0820181905260009061408d90830184615771565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c0820181905260009061408d90830184615771565b63ffffffff92831681529116602082015260400190565b6001600160401b0391909116815260200190565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a060808201819052600090615bac908301846156da565b979650505050505050565b6000808335601e19843603018112615bce57600080fd5b8301803591506001600160401b03821115615be857600080fd5b60200191503681900382131561505b57600080fd5b604080519081016001600160401b0381118282101715615c1f57615c1f615e9c565b60405290565b60405160c081016001600160401b0381118282101715615c1f57615c1f615e9c565b60405161012081016001600160401b0381118282101715615c1f57615c1f615e9c565b604051601f8201601f191681016001600160401b0381118282101715615c9257615c92615e9c565b604052919050565b60008085851115615caa57600080fd5b83861115615cb757600080fd5b5050820193919092039150565b60008219821115615cd757615cd7615e44565b500190565b60006001600160401b038281168482168083038211156157d5576157d5615e44565b60006001600160601b038281168482168083038211156157d5576157d5615e44565b600082615d2f57615d2f615e5a565b500490565b6000816000190483118215151615615d4e57615d4e615e44565b500290565b600082821015615d6557615d65615e44565b500390565b60006001600160601b0383811690831681811015615d8a57615d8a615e44565b039392505050565b6001600160e01b03198135818116916004851015615dba5780818660040360031b1b83161692505b505092915050565b60005b83811015615ddd578181015183820152602001615dc5565b838111156109405750506000910152565b6000600019821415615e0257615e02615e44565b5060010190565b60006001600160401b0382811680821415615e2657615e26615e44565b6001019392505050565b600082615e3f57615e3f615e5a565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461237557600080fd5b801515811461237557600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"blockhashStore\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"internalBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalBalance\",\"type\":\"uint256\"}],\"name\":\"BalanceInvariantViolated\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNum\",\"type\":\"uint256\"}],\"name\":\"BlockhashNotInStore\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToSendNative\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedToTransferLink\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"GasLimitTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IncorrectCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"IndexOutOfRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidCalldata\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"InvalidConsumer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"int256\",\"name\":\"linkWei\",\"type\":\"int256\"}],\"name\":\"InvalidLinkWeiPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"transferredValue\",\"type\":\"uint256\"},{\"internalType\":\"uint96\",\"name\":\"expectedValue\",\"type\":\"uint96\"}],\"name\":\"InvalidNativeBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"have\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"min\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"max\",\"type\":\"uint16\"}],\"name\":\"InvalidRequestConfirmations\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSubscription\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"requestVersion\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"expectedVersion\",\"type\":\"uint8\"}],\"name\":\"InvalidVersion\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"proposedOwner\",\"type\":\"address\"}],\"name\":\"MustBeRequestedOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"MustBeSubOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoCorrespondingRequest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"NoSuchProvingKey\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"have\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"want\",\"type\":\"uint32\"}],\"name\":\"NumWordsTooBig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableFromLink\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PaymentTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PendingRequestExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Reentrant\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SubscriptionIDCollisionFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyConsumers\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"coordinatorAddress\",\"type\":\"address\"}],\"name\":\"CoordinatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FundsRecovered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"MigrationCompleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NativeFundsRecovered\",\"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\":\"keyHash\",\"type\":\"bytes32\"}],\"name\":\"ProvingKeyRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"outputSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint96\",\"name\":\"payment\",\"type\":\"uint96\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"name\":\"RandomWordsFulfilled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"requestId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"preSeed\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RandomWordsRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountLink\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountNative\",\"type\":\"uint256\"}],\"name\":\"SubscriptionCanceled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"SubscriptionConsumerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"SubscriptionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFunded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldNativeBalance\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newNativeBalance\",\"type\":\"uint256\"}],\"name\":\"SubscriptionFundedWithNative\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"SubscriptionOwnerTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"BLOCKHASH_STORE\",\"outputs\":[{\"internalType\":\"contractBlockhashStoreInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK\",\"outputs\":[{\"internalType\":\"contractLinkTokenInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"LINK_NATIVE_FEED\",\"outputs\":[{\"internalType\":\"contractAggregatorV3Interface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_CONSUMERS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_NUM_WORDS\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_REQUEST_CONFIRMATIONS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"acceptSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"addConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"cancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"createSubscription\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256[2]\",\"name\":\"pk\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"gamma\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"c\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"s\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"seed\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"uWitness\",\"type\":\"address\"},{\"internalType\":\"uint256[2]\",\"name\":\"cGammaWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256[2]\",\"name\":\"sHashWitness\",\"type\":\"uint256[2]\"},{\"internalType\":\"uint256\",\"name\":\"zInv\",\"type\":\"uint256\"}],\"internalType\":\"structVRF.Proof\",\"name\":\"proof\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"blockNum\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFCoordinatorV2PlusUpgradedVersion.RequestCommitment\",\"name\":\"rc\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"name\":\"fulfillRandomWords\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"fundSubscriptionWithNative\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxCount\",\"type\":\"uint256\"}],\"name\":\"getActiveSubscriptionIds\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRequestConfig\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"getSubscription\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"balance\",\"type\":\"uint96\"},{\"internalType\":\"uint96\",\"name\":\"nativeBalance\",\"type\":\"uint96\"},{\"internalType\":\"uint64\",\"name\":\"reqCount\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"consumers\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicKey\",\"type\":\"uint256[2]\"}],\"name\":\"hashOfKey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newCoordinator\",\"type\":\"address\"}],\"name\":\"migrate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrationVersion\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedData\",\"type\":\"bytes\"}],\"name\":\"onMigration\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onTokenTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"ownerCancelSubscription\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"}],\"name\":\"pendingRequestExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"recoverNativeFunds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"registerMigratableCoordinator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[2]\",\"name\":\"publicProvingKey\",\"type\":\"uint256[2]\"}],\"name\":\"registerProvingKey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"consumer\",\"type\":\"address\"}],\"name\":\"removeConsumer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"keyHash\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"uint16\",\"name\":\"requestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"callbackGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"numWords\",\"type\":\"uint32\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structVRFV2PlusClient.RandomWordsRequest\",\"name\":\"req\",\"type\":\"tuple\"}],\"name\":\"requestRandomWords\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"subId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"requestSubscriptionOwnerTransfer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_config\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"reentrancyLock\",\"type\":\"bool\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_currentSubNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_provingKeyHashes\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_requestCommitments\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_totalNativeBalance\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"minimumRequestConfirmations\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"stalenessSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"gasAfterPaymentCalculation\",\"type\":\"uint32\"},{\"internalType\":\"int256\",\"name\":\"fallbackWeiPerUnitLink\",\"type\":\"int256\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeNativePPM\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"fulfillmentFlatFeeLinkDiscountPPM\",\"type\":\"uint32\"},{\"internalType\":\"uint8\",\"name\":\"nativePremiumPercentage\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"linkPremiumPercentage\",\"type\":\"uint8\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"link\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"linkNativeFeed\",\"type\":\"address\"}],\"name\":\"setLINKAndLINKNativeFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"withdrawNative\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x60a06040523480156200001157600080fd5b5060405162005dec38038062005dec833981016040819052620000349162000183565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d7565b50505060601b6001600160601b031916608052620001b5565b6001600160a01b038116331415620001325760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019657600080fd5b81516001600160a01b0381168114620001ae57600080fd5b9392505050565b60805160601c615c11620001db600039600081816104f401526133f80152615c116000f3fe6080604052600436106101e05760003560e01c8062012291146101e5578063088070f5146102125780630ae09540146102e057806315c48b841461030257806318e3dd271461032a5780631b6b6d2314610369578063294daa49146103965780632f622e6b146103b2578063301f42e9146103d2578063405b84fa146103f257806340d6bb821461041257806341af6c871461043d57806351cff8d91461046d5780635d06b4ab1461048d57806364d51a2a146104ad57806365982744146104c2578063689c4517146104e257806372e9d5651461051657806379ba5097146105365780637bce14d11461054b5780638402595e1461056b57806386fe91c71461058b5780638da5cb5b146105ab57806395b55cfc146105c95780639b1c385e146105dc5780639d40a6fd1461060a578063a21a23e414610637578063a4c0ed361461064c578063a63e0bfb1461066c578063aa433aff1461068c578063aefb212f146106ac578063b2a7cac5146106d9578063bec4c08c146106f9578063caf70c4a14610719578063cb63179714610739578063ce3f471914610759578063d98e620e1461076c578063dac83d291461078c578063dc311dd3146107ac578063e72f6e30146107dd578063ee9d2d38146107fd578063f2fde38b1461082a575b600080fd5b3480156101f157600080fd5b506101fa61084a565b604051610209939291906156e5565b60405180910390f35b34801561021e57600080fd5b50600c546102839061ffff81169063ffffffff62010000820481169160ff600160301b8204811692600160381b8304811692600160581b8104821692600160781b8204831692600160981b83041691600160b81b8104821691600160c01b9091041689565b6040805161ffff909a168a5263ffffffff98891660208b01529615159689019690965293861660608801529185166080870152841660a08601529290921660c084015260ff91821660e08401521661010082015261012001610209565b3480156102ec57600080fd5b506103006102fb366004615358565b6108c6565b005b34801561030e57600080fd5b5061031760c881565b60405161ffff9091168152602001610209565b34801561033657600080fd5b50600a5461035190600160601b90046001600160601b031681565b6040516001600160601b039091168152602001610209565b34801561037557600080fd5b50600254610389906001600160a01b031681565b6040516102099190615589565b3480156103a257600080fd5b5060405160028152602001610209565b3480156103be57600080fd5b506103006103cd366004614e72565b61090e565b3480156103de57600080fd5b506103516103ed366004615029565b610a5a565b3480156103fe57600080fd5b5061030061040d366004615358565b610ef0565b34801561041e57600080fd5b506104286101f481565b60405163ffffffff9091168152602001610209565b34801561044957600080fd5b5061045d61045836600461533f565b6112c1565b6040519015158152602001610209565b34801561047957600080fd5b50610300610488366004614e72565b611462565b34801561049957600080fd5b506103006104a8366004614e72565b6115f0565b3480156104b957600080fd5b50610317606481565b3480156104ce57600080fd5b506103006104dd366004614e8f565b6116a7565b3480156104ee57600080fd5b506103897f000000000000000000000000000000000000000000000000000000000000000081565b34801561052257600080fd5b50600354610389906001600160a01b031681565b34801561054257600080fd5b50610300611707565b34801561055757600080fd5b50610300610566366004614f23565b6117b1565b34801561057757600080fd5b50610300610586366004614e72565b6118aa565b34801561059757600080fd5b50600a54610351906001600160601b031681565b3480156105b757600080fd5b506000546001600160a01b0316610389565b6103006105d736600461533f565b6119b6565b3480156105e857600080fd5b506105fc6105f7366004615117565b611ad7565b604051908152602001610209565b34801561061657600080fd5b5060075461062a906001600160401b031681565b604051610209919061587e565b34801561064357600080fd5b506105fc611e23565b34801561065857600080fd5b50610300610667366004614ec8565b611ff6565b34801561067857600080fd5b5061030061068736600461529e565b612170565b34801561069857600080fd5b506103006106a736600461533f565b612379565b3480156106b857600080fd5b506106cc6106c736600461537d565b6123c1565b6040516102099190615600565b3480156106e557600080fd5b506103006106f436600461533f565b6124c3565b34801561070557600080fd5b50610300610714366004615358565b6125b8565b34801561072557600080fd5b506105fc610734366004614f4b565b6126c4565b34801561074557600080fd5b50610300610754366004615358565b6126f4565b610300610767366004614f9d565b612965565b34801561077857600080fd5b506105fc61078736600461533f565b612c7c565b34801561079857600080fd5b506103006107a7366004615358565b612c9d565b3480156107b857600080fd5b506107cc6107c736600461533f565b612d33565b604051610209959493929190615892565b3480156107e957600080fd5b506103006107f8366004614e72565b612e21565b34801561080957600080fd5b506105fc61081836600461533f565b600f6020526000908152604090205481565b34801561083657600080fd5b50610300610845366004614e72565b612ffc565b600c54600e805460408051602080840282018101909252828152600094859460609461ffff8316946201000090930463ffffffff169391928391908301828280156108b457602002820191906000526020600020905b8154815260200190600101908083116108a0575b50505050509050925092509250909192565b816108d081613010565b6108d8613071565b6108e1836112c1565b156108ff57604051631685ecdd60e31b815260040160405180910390fd5b610909838361309e565b505050565b610916613071565b61091e613252565b600b54600160601b90046001600160601b031661094e57604051631e9acf1760e31b815260040160405180910390fd5b600b8054600160601b90046001600160601b0316908190600c6109718380615a78565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a600c8282829054906101000a90046001600160601b03166109b99190615a78565b92506101000a8154816001600160601b0302191690836001600160601b031602179055506000826001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d8060008114610a33576040519150601f19603f3d011682016040523d82523d6000602084013e610a38565b606091505b50509050806109095760405163950b247960e01b815260040160405180910390fd5b6000610a64613071565b60005a90506000610a7586866132a5565b90506000856060015163ffffffff166001600160401b03811115610a9b57610a9b615b83565b604051908082528060200260200182016040528015610ac4578160200160208202803683370190505b50905060005b866060015163ffffffff16811015610b3b57826040015181604051602001610af3929190615613565b6040516020818303038152906040528051906020012060001c828281518110610b1e57610b1e615b6d565b602090810291909101015280610b3381615afc565b915050610aca565b50602080830180516000908152600f9092526040808320839055905190518291631fe543e360e01b91610b739190869060240161576f565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252600c805460ff60301b1916600160301b1790559089015160808a0151919250600091610bd89163ffffffff169084613510565b600c805460ff60301b1916905560208a810151600090815260069091526040902054909150600160c01b90046001600160401b0316610c188160016159ea565b6020808c0151600090815260069091526040812080546001600160401b0393909316600160c01b026001600160c01b039093169290921790915560a08b01518051610c6590600190615a61565b81518110610c7557610c75615b6d565b602091010151600c5460f89190911c6001149150600090610ca6908a90600160581b900463ffffffff163a8561355c565b90508115610d9e576020808d01516000908152600690915260409020546001600160601b03808316600160601b909204161015610cf657604051631e9acf1760e31b815260040160405180910390fd5b60208c81015160009081526006909152604090208054829190600c90610d2d908490600160601b90046001600160601b0316615a78565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b600c8282829054906101000a90046001600160601b0316610d759190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550610e79565b6020808d01516000908152600690915260409020546001600160601b0380831691161015610ddf57604051631e9acf1760e31b815260040160405180910390fd5b6020808d015160009081526006909152604081208054839290610e0c9084906001600160601b0316615a78565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600b60008282829054906101000a90046001600160601b0316610e549190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b8b6020015188602001517f49580fdfd9497e1ed5c1b1cec0495087ae8e3f1267470ec2fb015db32e3d6aa78a604001518488604051610ed6939291909283526001600160601b039190911660208301521515604082015260600190565b60405180910390a3985050505050505050505b9392505050565b610ef8613071565b610f01816135ab565b610f295780604051635428d44960e01b8152600401610f209190615589565b60405180910390fd5b600080600080610f3886612d33565b945094505093509350336001600160a01b0316826001600160a01b031614610f9b5760405162461bcd60e51b81526020600482015260166024820152752737ba1039bab139b1b934b83a34b7b71037bbb732b960511b6044820152606401610f20565b610fa4866112c1565b15610fea5760405162461bcd60e51b815260206004820152601660248201527550656e64696e6720726571756573742065786973747360501b6044820152606401610f20565b60006040518060c00160405280610fff600290565b60ff168152602001888152602001846001600160a01b03168152602001838152602001866001600160601b03168152602001856001600160601b031681525090506000816040516020016110539190615652565b604051602081830303815290604052905061106d88613615565b505060405163ce3f471960e01b81526001600160a01b0388169063ce3f4719906001600160601b038816906110a690859060040161563f565b6000604051808303818588803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b50506002546001600160a01b0316158015935091506110fc905057506001600160601b03861615155b156111c65760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611133908a908a906004016155d0565b602060405180830381600087803b15801561114d57600080fd5b505af1158015611161573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111859190614f67565b6111c65760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b6044820152606401610f20565b600c805460ff60301b1916600160301b17905560005b835181101561126f578381815181106111f7576111f7615b6d565b60200260200101516001600160a01b0316638ea98117896040518263ffffffff1660e01b815260040161122a9190615589565b600060405180830381600087803b15801561124457600080fd5b505af1158015611258573d6000803e3d6000fd5b50505050808061126790615afc565b9150506111dc565b50600c805460ff60301b191690556040517fd63ca8cb945956747ee69bfdc3ea754c24a4caf7418db70e46052f7850be4187906112af9089908b9061559d565b60405180910390a15050505050505050565b6000818152600560209081526040808320815160608101835281546001600160a01b039081168252600183015416818501526002820180548451818702810187018652818152879693958601939092919083018282801561134b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161132d575b505050505081525050905060005b8160400151518110156114585760005b600e5481101561144557600061140e600e838154811061138b5761138b615b6d565b9060005260206000200154856040015185815181106113ac576113ac615b6d565b60200260200101518860046000896040015189815181106113cf576113cf615b6d565b6020908102919091018101516001600160a01b0316825281810192909252604090810160009081208d82529092529020546001600160401b03166137bd565b506000818152600f6020526040902054909150156114325750600195945050505050565b508061143d81615afc565b915050611369565b508061145081615afc565b915050611359565b5060009392505050565b61146a613071565b611472613252565b6002546001600160a01b031661149b5760405163c1f0c0a160e01b815260040160405180910390fd5b600b546001600160601b03166114c457604051631e9acf1760e31b815260040160405180910390fd5b600b80546001600160601b031690819060006114e08380615a78565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555080600a60008282829054906101000a90046001600160601b03166115289190615a78565b82546001600160601b039182166101009390930a92830291909202199091161790555060025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061157d90859085906004016155d0565b602060405180830381600087803b15801561159757600080fd5b505af11580156115ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115cf9190614f67565b6115ec57604051631e9acf1760e31b815260040160405180910390fd5b5050565b6115f8613252565b611601816135ab565b15611621578060405163ac8a27ef60e01b8152600401610f209190615589565b601280546001810182556000919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440180546001600160a01b0319166001600160a01b0383161790556040517fb7cabbfc11e66731fc77de0444614282023bcbd41d16781c753a431d0af016259061169c908390615589565b60405180910390a150565b6116af613252565b6002546001600160a01b0316156116d957604051631688c53760e11b815260040160405180910390fd5b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6001546001600160a01b0316331461175a5760405162461bcd60e51b815260206004820152601660248201527526bab9ba10313290383937b837b9b2b21037bbb732b960511b6044820152606401610f20565b60008054336001600160a01b0319808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6117b9613252565b6040805180820182526000916117e89190849060029083908390808284376000920191909152506126c4915050565b6000818152600d602052604090205490915060ff161561181e57604051634a0b8fa760e01b815260048101829052602401610f20565b6000818152600d6020526040808220805460ff19166001908117909155600e805491820181559092527fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101829055517fc9583fd3afa3d7f16eb0b88d0268e7d05c09bafa4b21e092cbd1320e1bc8089d9061189e9083815260200190565b60405180910390a15050565b6118b2613252565b600a544790600160601b90046001600160601b0316818111156118ec5780826040516354ced18160e11b8152600401610f20929190615613565b818110156109095760006119008284615a61565b90506000846001600160a01b03168260405160006040518083038185875af1925050503d806000811461194f576040519150601f19603f3d011682016040523d82523d6000602084013e611954565b606091505b50509050806119765760405163950b247960e01b815260040160405180910390fd5b7f4aed7c8eed0496c8c19ea2681fcca25741c1602342e38b045d9f1e8e905d2e9c85836040516119a792919061559d565b60405180910390a15050505050565b6119be613071565b6000818152600560205260409020546001600160a01b03166119f357604051630fb532db60e11b815260040160405180910390fd5b60008181526006602052604090208054600160601b90046001600160601b0316903490600c611a228385615a0c565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555034600a600c8282829054906101000a90046001600160601b0316611a6a9190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f7603b205d03651ee812f803fccde89f1012e545a9c99f0abfea9cedd0fd8e902823484611abd91906159d2565b604051611acb929190615613565b60405180910390a25050565b6000611ae1613071565b6020808301356000908152600590915260409020546001600160a01b0316611b1c57604051630fb532db60e11b815260040160405180910390fd5b3360009081526004602090815260408083208583013584529091529020546001600160401b031680611b69578260200135336040516379bfd40160e01b8152600401610f20929190615744565b600c5461ffff16611b806060850160408601615283565b61ffff161080611ba3575060c8611b9d6060850160408601615283565b61ffff16115b15611bdd57611bb86060840160408501615283565b600c5460405163539c34bb60e11b8152610f20929161ffff169060c8906004016156c7565b600c5462010000900463ffffffff16611bfc608085016060860161539f565b63ffffffff161115611c4257611c18608084016060850161539f565b600c54604051637aebf00f60e11b8152610f20929162010000900463ffffffff1690600401615867565b6101f4611c5560a085016080860161539f565b63ffffffff161115611c8f57611c7160a084016080850161539f565b6101f46040516311ce1afb60e21b8152600401610f20929190615867565b6000611c9c8260016159ea565b9050600080611cb28635336020890135866137bd565b90925090506000611cce611cc960a08901896158e7565b613846565b90506000611cdb826138c3565b905083611ce6613934565b60208a0135611cfb60808c0160608d0161539f565b611d0b60a08d0160808e0161539f565b3386604051602001611d2397969594939291906157c7565b60405160208183030381529060405280519060200120600f600086815260200190815260200160002081905550336001600160a01b0316886020013589600001357feb0e3652e0f44f417695e6e90f2f42c99b65cd7169074c5a654b16b9748c3a4e87878d6040016020810190611d9a9190615283565b8e6060016020810190611dad919061539f565b8f6080016020810190611dc0919061539f565b89604051611dd396959493929190615788565b60405180910390a45050336000908152600460209081526040808320898301358452909152902080546001600160401b0319166001600160401b039490941693909317909255925050505b919050565b6000611e2d613071565b6007546001600160401b031633611e45600143615a61565b6040516001600160601b0319606093841b81166020830152914060348201523090921b1660548201526001600160c01b031960c083901b16606882015260700160408051601f1981840301815291905280516020909101209150611eaa8160016159ea565b600780546001600160401b0319166001600160401b03928316179055604080516000808252608082018352602080830182815283850183815260608086018581528a86526006855287862093518454935191516001600160601b039182166001600160c01b031990951694909417600160601b9190921602176001600160c01b0316600160c01b9290981691909102969096179055835194850184523385528481018281528585018481528884526005835294909220855181546001600160a01b03199081166001600160a01b039283161783559351600183018054909516911617909255925180519294939192611fa89260028501920190614b36565b50611fb8915060089050846139c4565b50827f1d3015d7ba850fa198dc7b1a3f5d42779313a681035f77c8c03764c61005518d33604051611fe99190615589565b60405180910390a2505090565b611ffe613071565b6002546001600160a01b03163314612029576040516344b0e3c360e01b815260040160405180910390fd5b6020811461204a57604051638129bbcd60e01b815260040160405180910390fd5b60006120588284018461533f565b6000818152600560205260409020549091506001600160a01b031661209057604051630fb532db60e11b815260040160405180910390fd5b600081815260066020526040812080546001600160601b0316918691906120b78385615a0c565b92506101000a8154816001600160601b0302191690836001600160601b0316021790555084600a60008282829054906101000a90046001600160601b03166120ff9190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550817f1ced9348ff549fceab2ac57cd3a9de38edaaab274b725ee82c23e8fc8c4eec7a82878461215291906159d2565b604051612160929190615613565b60405180910390a2505050505050565b612178613252565b60c861ffff8a1611156121a557888960c860405163539c34bb60e11b8152600401610f20939291906156c7565b600085136121c9576040516321ea67b360e11b815260048101869052602401610f20565b604080516101208101825261ffff8b1680825263ffffffff808c16602084018190526000848601528b8216606085018190528b8316608086018190528a841660a08701819052938a1660c0870181905260ff808b1660e08901819052908a16610100909801889052600c8054600160c01b90990260ff60c01b19600160b81b9093029290921661ffff60b81b19600160981b90940263ffffffff60981b19600160781b90990298909816600160781b600160b81b0319600160581b90960263ffffffff60581b19600160381b90980297909716600160301b600160781b03196201000090990265ffffffffffff19909c16909a179a909a1796909616979097179390931791909116959095179290921793909316929092179190911790556010869055517f95cb2ddab6d2297c29a4861691de69b3969c464aa4a9c44258b101ff02ff375a90612366908b908b908b908b908b908990899061ffff97909716875263ffffffff95861660208801529385166040870152919093166060850152608084019290925260ff91821660a08401521660c082015260e00190565b60405180910390a1505050505050505050565b612381613252565b6000818152600560205260409020546001600160a01b0316806123b757604051630fb532db60e11b815260040160405180910390fd5b6115ec828261309e565b606060006123cf60086139d0565b90508084106123f157604051631390f2a160e01b815260040160405180910390fd5b60006123fd84866159d2565b90508181118061240b575083155b6124155780612417565b815b905060006124258683615a61565b9050806001600160401b0381111561243f5761243f615b83565b604051908082528060200260200182016040528015612468578160200160208202803683370190505b50935060005b818110156124b85761248b61248388836159d2565b6008906139da565b85828151811061249d5761249d615b6d565b60209081029190910101526124b181615afc565b905061246e565b505050505b92915050565b6124cb613071565b6000818152600560205260409020546001600160a01b03168061250157604051630fb532db60e11b815260040160405180910390fd5b6000828152600560205260409020600101546001600160a01b03163314612558576000828152600560205260409081902060010154905163d084e97560e01b8152610f20916001600160a01b031690600401615589565b600082815260056020526040908190208054336001600160a01b031991821681178355600190920180549091169055905183917fd4114ab6e9af9f597c52041f32d62dc57c5c4e4c0d4427006069635e216c938691611acb9185916155b6565b816125c281613010565b6125ca613071565b60008381526005602052604090206002018054606414156125fe576040516305a48e0f60e01b815260040160405180910390fd5b6001600160a01b038316600090815260046020908152604080832087845291829052909120546001600160401b031615612639575050505050565b600085815260208281526040808320805460016001600160401b0319909116811790915585549081018655858452919092200180546001600160a01b0319166001600160a01b0387161790555185907f1e980d04aa7648e205713e5e8ea3808672ac163d10936d36f91b2c88ac1575e1906126b5908790615589565b60405180910390a25050505050565b6000816040516020016126d791906155f2565b604051602081830303815290604052805190602001209050919050565b816126fe81613010565b612706613071565b61270f836112c1565b1561272d57604051631685ecdd60e31b815260040160405180910390fd5b6001600160a01b03821660009081526004602090815260408083208684529091529020546001600160401b031661277b5782826040516379bfd40160e01b8152600401610f20929190615744565b6000838152600560209081526040808320600201805482518185028101850190935280835291929091908301828280156127de57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116127c0575b505050505090506000600182516127f59190615a61565b905060005b825181101561290157846001600160a01b031683828151811061281f5761281f615b6d565b60200260200101516001600160a01b031614156128ef57600083838151811061284a5761284a615b6d565b602002602001015190508060056000898152602001908152602001600020600201838154811061287c5761287c615b6d565b600091825260208083209190910180546001600160a01b0319166001600160a01b0394909416939093179092558881526005909152604090206002018054806128c7576128c7615b57565b600082815260209020810160001990810180546001600160a01b031916905501905550612901565b806128f981615afc565b9150506127fa565b506001600160a01b03841660009081526004602090815260408083208884529091529081902080546001600160401b03191690555185907f32158c6058347c1601b2d12bc696ac6901d8a9a9aa3ba10c27ab0a983e8425a7906126b5908790615589565b600061297382840184615151565b9050806000015160ff166001146129ac57805160405163237d181f60e21b815260ff909116600482015260016024820152604401610f20565b8060a001516001600160601b031634146129f05760a08101516040516306acf13560e41b81523460048201526001600160601b039091166024820152604401610f20565b6020808201516000908152600590915260409020546001600160a01b031615612a2c576040516326afa43560e11b815260040160405180910390fd5b60005b816060015151811015612acc5760016004600084606001518481518110612a5857612a58615b6d565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060008460200151815260200190815260200160002060006101000a8154816001600160401b0302191690836001600160401b031602179055508080612ac490615afc565b915050612a2f565b50604080516060808201835260808401516001600160601b03908116835260a0850151811660208085019182526000858701818152828901805183526006845288832097518854955192516001600160401b0316600160c01b026001600160c01b03938816600160601b026001600160c01b0319909716919097161794909417169390931790945584518084018652868601516001600160a01b03908116825281860184815294880151828801908152925184526005865295909220825181549087166001600160a01b0319918216178255935160018201805491909716941693909317909455925180519192612bcb92600285019290910190614b36565b5050506080810151600a8054600090612bee9084906001600160601b0316615a0c565b92506101000a8154816001600160601b0302191690836001600160601b031602179055508060a00151600a600c8282829054906101000a90046001600160601b0316612c3a9190615a0c565b92506101000a8154816001600160601b0302191690836001600160601b03160217905550612c76816020015160086139c490919063ffffffff16565b50505050565b600e8181548110612c8c57600080fd5b600091825260209091200154905081565b81612ca781613010565b612caf613071565b600083815260056020526040902060018101546001600160a01b03848116911614612c76576001810180546001600160a01b0319166001600160a01b03851617905560405184907f21a4dad170a6bf476c31bbcf4a16628295b0e450672eec25d7c93308e05344a190612d2590339087906155b6565b60405180910390a250505050565b600081815260056020526040812054819081906001600160a01b0316606081612d6f57604051630fb532db60e11b815260040160405180910390fd5b600086815260066020908152604080832054600583529281902060020180548251818502810185019093528083526001600160601b0380861695600160601b810490911694600160c01b9091046001600160401b0316938893929091839190830182828015612e0757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612de9575b505050505090509450945094509450945091939590929450565b612e29613252565b6002546001600160a01b0316612e525760405163c1f0c0a160e01b815260040160405180910390fd5b6002546040516370a0823160e01b81526000916001600160a01b0316906370a0823190612e83903090600401615589565b60206040518083038186803b158015612e9b57600080fd5b505afa158015612eaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ed39190614f84565b600a549091506001600160601b031681811115612f075780826040516354ced18160e11b8152600401610f20929190615613565b81811015610909576000612f1b8284615a61565b60025460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb90612f4e908790859060040161559d565b602060405180830381600087803b158015612f6857600080fd5b505af1158015612f7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fa09190614f67565b612fbd57604051631f01ff1360e21b815260040160405180910390fd5b7f59bfc682b673f8cbf945f1e454df9334834abf7dfe7f92237ca29ecb9b4366008482604051612fee92919061559d565b60405180910390a150505050565b613004613252565b61300d816139e6565b50565b6000818152600560205260409020546001600160a01b03168061304657604051630fb532db60e11b815260040160405180910390fd5b336001600160a01b038216146115ec5780604051636c51fda960e11b8152600401610f209190615589565b600c54600160301b900460ff161561309c5760405163769dd35360e11b815260040160405180910390fd5b565b6000806130aa84613615565b60025491935091506001600160a01b0316158015906130d157506001600160601b03821615155b156131805760025460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906131119086906001600160601b0387169060040161559d565b602060405180830381600087803b15801561312b57600080fd5b505af115801561313f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131639190614f67565b61318057604051631e9acf1760e31b815260040160405180910390fd5b6000836001600160a01b0316826001600160601b031660405160006040518083038185875af1925050503d80600081146131d6576040519150601f19603f3d011682016040523d82523d6000602084013e6131db565b606091505b50509050806131fd5760405163950b247960e01b815260040160405180910390fd5b604080516001600160a01b03861681526001600160601b03808616602083015284169181019190915285907f8c74ce8b8cf87f5eb001275c8be27eb34ea2b62bfab6814fcc62192bb63e81c4906060016126b5565b6000546001600160a01b0316331461309c5760405162461bcd60e51b815260206004820152601660248201527527b7363c9031b0b63630b1363290313c9037bbb732b960511b6044820152606401610f20565b604080516060810182526000808252602082018190529181019190915260006132d184600001516126c4565b6000818152600d602052604090205490915060ff1661330657604051631dfd6e1360e21b815260048101829052602401610f20565b600081856080015160405160200161331f929190615613565b60408051601f1981840301815291815281516020928301206000818152600f9093529120549091508061336557604051631b44092560e11b815260040160405180910390fd5b845160208087015160408089015160608a015160808b015160a08c01519351613394978a979096959101615813565b6040516020818303038152906040528051906020012081146133c95760405163354a450b60e21b815260040160405180910390fd5b60006133d88660000151613a8a565b90508061349f578551604051631d2827a760e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163e9413d389161342c919060040161587e565b60206040518083038186803b15801561344457600080fd5b505afa158015613458573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061347c9190614f84565b90508061349f57855160405163175dadad60e01b8152610f20919060040161587e565b60008760800151826040516020016134c1929190918252602082015260400190565b6040516020818303038152906040528051906020012060001c905060006134e88983613b67565b6040805160608101825297885260208801969096529486019490945250929695505050505050565b60005a61138881101561352257600080fd5b61138881039050846040820482031161353a57600080fd5b50823b61354657600080fd5b60008083516020850160008789f1949350505050565b60008115613589576011546135829086908690600160201b900463ffffffff1686613bd2565b90506135a3565b6011546135a0908690869063ffffffff1686613c74565b90505b949350505050565b6000805b60125481101561360c57826001600160a01b0316601282815481106135d6576135d6615b6d565b6000918252602090912001546001600160a01b031614156135fa5750600192915050565b8061360481615afc565b9150506135af565b50600092915050565b60008181526005602090815260408083206006909252822054600290910180546001600160601b0380841694600160601b90940416925b818110156136b7576004600084838154811061366a5761366a615b6d565b60009182526020808320909101546001600160a01b031683528281019390935260409182018120898252909252902080546001600160401b03191690556136b081615afc565b905061364c565b50600085815260056020526040812080546001600160a01b031990811682556001820180549091169055906136ef6002830182614b9b565b505060008581526006602052604081205561370b600886613d99565b506001600160601b0384161561375e57600a80548591906000906137399084906001600160601b0316615a78565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b6001600160601b038316156137b65782600a600c8282829054906101000a90046001600160601b03166137919190615a78565b92506101000a8154816001600160601b0302191690836001600160601b031602179055505b5050915091565b60408051602081018690526001600160a01b03851691810191909152606081018390526001600160401b03821660808201526000908190819060a00160408051601f198184030181529082905280516020918201209250613822918991849101615613565b60408051808303601f19018152919052805160209091012097909650945050505050565b6040805160208101909152600081528161386f57506040805160208101909152600081526124bd565b63125fa26760e31b6138818385615aa0565b6001600160e01b031916146138a957604051632923fee760e11b815260040160405180910390fd5b6138b682600481866159a8565b810190610ee99190614fde565b60607f92fd13387c7fe7befbc38d303d6468778fb9731bc4583f17d92989c6fcfdeaaa826040516024016138fc91511515815260200190565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915292915050565b60004661394081613da5565b156139bd5760646001600160a01b031663a3b1b31d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561397f57600080fd5b505afa158015613993573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139b79190614f84565b91505090565b4391505090565b6000610ee98383613dc8565b60006124bd825490565b6000610ee98383613e17565b6001600160a01b038116331415613a395760405162461bcd60e51b815260206004820152601760248201527621b0b73737ba103a3930b739b332b9103a379039b2b63360491b6044820152606401610f20565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600046613a9681613da5565b15613b5857610100836001600160401b0316613ab0613934565b613aba9190615a61565b1180613ad65750613ac9613934565b836001600160401b031610155b15613ae45750600092915050565b6040516315a03d4160e11b8152606490632b407a8290613b0890869060040161587e565b60206040518083038186803b158015613b2057600080fd5b505afa158015613b34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ee99190614f84565b50506001600160401b03164090565b6000613b9b8360000151846020015185604001518660600151868860a001518960c001518a60e001518b6101000151613e41565b60038360200151604051602001613bb392919061575b565b60408051601f1981840301815291905280516020909101209392505050565b600080613c156000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061405c92505050565b905060005a613c2488886159d2565b613c2e9190615a61565b613c389085615a42565b90506000613c5163ffffffff871664e8d4a51000615a42565b905082613c5e82846159d2565b613c6891906159d2565b98975050505050505050565b600080613c7f614121565b905060008113613ca5576040516321ea67b360e11b815260048101829052602401610f20565b6000613ce76000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061405c92505050565b9050600082825a613cf88b8b6159d2565b613d029190615a61565b613d0c9088615a42565b613d1691906159d2565b613d2890670de0b6b3a7640000615a42565b613d329190615a2e565b90506000613d4b63ffffffff881664e8d4a51000615a42565b9050613d6281676765c793fa10079d601b1b615a61565b821115613d825760405163e80fa38160e01b815260040160405180910390fd5b613d8c81836159d2565b9998505050505050505050565b6000610ee983836141ec565b600061a4b1821480613db9575062066eed82145b806124bd57505062066eee1490565b6000818152600183016020526040812054613e0f575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556124bd565b5060006124bd565b6000826000018281548110613e2e57613e2e615b6d565b9060005260206000200154905092915050565b613e4a896142df565b613e935760405162461bcd60e51b815260206004820152601a6024820152797075626c6963206b6579206973206e6f74206f6e20637572766560301b6044820152606401610f20565b613e9c886142df565b613ee05760405162461bcd60e51b815260206004820152601560248201527467616d6d61206973206e6f74206f6e20637572766560581b6044820152606401610f20565b613ee9836142df565b613f355760405162461bcd60e51b815260206004820152601d60248201527f6347616d6d615769746e657373206973206e6f74206f6e2063757276650000006044820152606401610f20565b613f3e826142df565b613f895760405162461bcd60e51b815260206004820152601c60248201527b73486173685769746e657373206973206e6f74206f6e20637572766560201b6044820152606401610f20565b613f95878a88876143a2565b613fdd5760405162461bcd60e51b81526020600482015260196024820152786164647228632a706b2b732a6729213d5f755769746e65737360381b6044820152606401610f20565b6000613fe98a876144b6565b90506000613ffc898b878b86898961451a565b9050600061400d838d8d8a8661462d565b9050808a1461404e5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b210383937b7b360991b6044820152606401610f20565b505050505050505050505050565b60004661406881613da5565b156140a757606c6001600160a01b031663c6f7de0e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b2057600080fd5b6140b08161466d565b1561360c57600f602160991b016001600160a01b03166349948e0e84604051806080016040528060488152602001615bbd604891396040516020016140f69291906154df565b6040516020818303038152906040526040518263ffffffff1660e01b8152600401613b08919061563f565b600c5460035460408051633fabe5a360e21b81529051600093600160381b900463ffffffff169283151592859283926001600160a01b03169163feaf968c9160048083019260a0929190829003018186803b15801561417f57600080fd5b505afa158015614193573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141b791906153ba565b5094509092508491505080156141db57506141d28242615a61565b8463ffffffff16105b156135a35750601054949350505050565b600081815260018301602052604081205480156142d5576000614210600183615a61565b855490915060009061422490600190615a61565b905081811461428957600086600001828154811061424457614244615b6d565b906000526020600020015490508087600001848154811061426757614267615b6d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061429a5761429a615b57565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506124bd565b60009150506124bd565b80516000906401000003d0191161432d5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420782d6f7264696e61746560701b6044820152606401610f20565b60208201516401000003d0191161437b5760405162461bcd60e51b8152602060048201526012602482015271696e76616c696420792d6f7264696e61746560701b6044820152606401610f20565b60208201516401000003d01990800961439b8360005b60200201516146a7565b1492915050565b60006001600160a01b0382166143e85760405162461bcd60e51b815260206004820152600b60248201526a626164207769746e65737360a81b6044820152606401610f20565b6020840151600090600116156143ff57601c614402565b601b5b9050600070014551231950b75fc4402da1732fc9bebe1985876000602002015109865170014551231950b75fc4402da1732fc9bebe199182039250600091908909875160408051600080825260209091019182905292935060019161446c91869188918790615621565b6020604051602081039080840390855afa15801561448e573d6000803e3d6000fd5b5050604051601f1901516001600160a01b039081169088161495505050505050949350505050565b6144be614bb9565b6144eb600184846040516020016144d793929190615568565b6040516020818303038152906040526146cb565b90505b6144f7816142df565b6124bd57805160408051602081019290925261451391016144d7565b90506144ee565b614522614bb9565b825186516401000003d01990819006910614156145815760405162461bcd60e51b815260206004820152601e60248201527f706f696e747320696e2073756d206d7573742062652064697374696e637400006044820152606401610f20565b61458c878988614719565b6145d15760405162461bcd60e51b8152602060048201526016602482015275119a5c9cdd081b5d5b0818da1958dac819985a5b195960521b6044820152606401610f20565b6145dc848685614719565b6146225760405162461bcd60e51b815260206004820152601760248201527614d958dbdb99081b5d5b0818da1958dac819985a5b1959604a1b6044820152606401610f20565b613c68868484614834565b60006002868686858760405160200161464b9695949392919061550e565b60408051601f1981840301815291905280516020909101209695505050505050565b6000600a82148061467f57506101a482145b8061468c575062aa37dc82145b80614698575061210582145b806124bd57505062014a331490565b6000806401000003d01980848509840990506401000003d019600782089392505050565b6146d3614bb9565b6146dc826148f7565b81526146f16146ec826000614391565b614932565b602082018190526002900660011415611e1e576020810180516401000003d019039052919050565b6000826147565760405162461bcd60e51b815260206004820152600b60248201526a3d32b9379039b1b0b630b960a91b6044820152606401610f20565b8351602085015160009061476c90600290615b17565b1561477857601c61477b565b601b5b9050600070014551231950b75fc4402da1732fc9bebe198387096040805160008082526020909101918290529192506001906147be908390869088908790615621565b6020604051602081039080840390855afa1580156147e0573d6000803e3d6000fd5b5050506020604051035190506000866040516020016147ff91906154cd565b60408051601f1981840301815291905280516020909101206001600160a01b0392831692169190911498975050505050505050565b61483c614bb9565b83516020808601518551918601516000938493849361485d93909190614952565b919450925090506401000003d0198582096001146148b95760405162461bcd60e51b815260206004820152601960248201527834b73b2d1036bab9ba1031329034b73b32b939b29037b3103d60391b6044820152606401610f20565b60405180604001604052806401000003d019806148d8576148d8615b41565b87860981526020016401000003d0198785099052979650505050505050565b805160208201205b6401000003d0198110611e1e576040805160208082019390935281518082038401815290820190915280519101206148ff565b60006124bd82600261494b6401000003d01960016159d2565b901c614a32565b60008080600180826401000003d019896401000003d019038808905060006401000003d0198b6401000003d019038a089050600061499283838585614ac9565b90985090506149a388828e88614aed565b90985090506149b488828c87614aed565b909850905060006149c78d878b85614aed565b90985090506149d888828686614ac9565b90985090506149e988828e89614aed565b9098509050818114614a1e576401000003d019818a0998506401000003d01982890997506401000003d0198183099650614a22565b8196505b5050505050509450945094915050565b600080614a3d614bd7565b6020808252818101819052604082015260608101859052608081018490526401000003d01960a0820152614a6f614bf5565b60208160c0846005600019fa925082614abf5760405162461bcd60e51b81526020600482015260126024820152716269674d6f64457870206661696c7572652160701b6044820152606401610f20565b5195945050505050565b6000806401000003d0198487096401000003d0198487099097909650945050505050565b600080806401000003d019878509905060006401000003d01987876401000003d019030990506401000003d0198183086401000003d01986890990999098509650505050505050565b828054828255906000526020600020908101928215614b8b579160200282015b82811115614b8b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614b56565b50614b97929150614c13565b5090565b508054600082559060005260206000209081019061300d9190614c13565b60405180604001604052806002906020820280368337509192915050565b6040518060c001604052806006906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b5b80821115614b975760008155600101614c14565b8035611e1e81615b99565b600082601f830112614c4457600080fd5b604080519081016001600160401b0381118282101715614c6657614c66615b83565b8060405250808385604086011115614c7d57600080fd5b60005b6002811015614c9f578135835260209283019290910190600101614c80565b509195945050505050565b8035611e1e81615bae565b60008083601f840112614cc757600080fd5b5081356001600160401b03811115614cde57600080fd5b602083019150836020828501011115614cf657600080fd5b9250929050565b600082601f830112614d0e57600080fd5b81356001600160401b03811115614d2757614d27615b83565b614d3a601f8201601f1916602001615978565b818152846020838601011115614d4f57600080fd5b816020850160208301376000918101602001919091529392505050565b600060c08284031215614d7e57600080fd5b614d8661592d565b905081356001600160401b038082168214614da057600080fd5b81835260208401356020840152614db960408501614e1f565b6040840152614dca60608501614e1f565b6060840152614ddb60808501614c28565b608084015260a0840135915080821115614df457600080fd5b50614e0184828501614cfd565b60a08301525092915050565b803561ffff81168114611e1e57600080fd5b803563ffffffff81168114611e1e57600080fd5b803560ff81168114611e1e57600080fd5b80516001600160501b0381168114611e1e57600080fd5b80356001600160601b0381168114611e1e57600080fd5b600060208284031215614e8457600080fd5b8135610ee981615b99565b60008060408385031215614ea257600080fd5b8235614ead81615b99565b91506020830135614ebd81615b99565b809150509250929050565b60008060008060608587031215614ede57600080fd5b8435614ee981615b99565b93506020850135925060408501356001600160401b03811115614f0b57600080fd5b614f1787828801614cb5565b95989497509550505050565b600060408284031215614f3557600080fd5b82604083011115614f4557600080fd5b50919050565b600060408284031215614f5d57600080fd5b610ee98383614c33565b600060208284031215614f7957600080fd5b8151610ee981615bae565b600060208284031215614f9657600080fd5b5051919050565b60008060208385031215614fb057600080fd5b82356001600160401b03811115614fc657600080fd5b614fd285828601614cb5565b90969095509350505050565b600060208284031215614ff057600080fd5b604051602081016001600160401b038111828210171561501257615012615b83565b604052823561502081615bae565b81529392505050565b60008060008385036101e081121561504057600080fd5b6101a08082121561505057600080fd5b615058615955565b91506150648787614c33565b82526150738760408801614c33565b60208301526080860135604083015260a0860135606083015260c086013560808301526150a260e08701614c28565b60a08301526101006150b688828901614c33565b60c08401526150c9886101408901614c33565b60e0840152610180870135908301529093508401356001600160401b038111156150f257600080fd5b6150fe86828701614d6c565b92505061510e6101c08501614caa565b90509250925092565b60006020828403121561512957600080fd5b81356001600160401b0381111561513f57600080fd5b820160c08185031215610ee957600080fd5b6000602080838503121561516457600080fd5b82356001600160401b038082111561517b57600080fd5b9084019060c0828703121561518f57600080fd5b61519761592d565b6151a083614e33565b8152838301358482015260408301356151b881615b99565b60408201526060830135828111156151cf57600080fd5b8301601f810188136151e057600080fd5b8035838111156151f2576151f2615b83565b8060051b9350615203868501615978565b8181528681019083880186850189018c101561521e57600080fd5b600096505b8387101561524d578035945061523885615b99565b84835260019690960195918801918801615223565b5060608501525061526391505060808401614e5b565b608082015261527460a08401614e5b565b60a08201529695505050505050565b60006020828403121561529557600080fd5b610ee982614e0d565b60008060008060008060008060006101208a8c0312156152bd57600080fd5b6152c68a614e0d565b98506152d460208b01614e1f565b97506152e260408b01614e1f565b96506152f060608b01614e1f565b955060808a0135945061530560a08b01614e1f565b935061531360c08b01614e1f565b925061532160e08b01614e33565b91506153306101008b01614e33565b90509295985092959850929598565b60006020828403121561535157600080fd5b5035919050565b6000806040838503121561536b57600080fd5b823591506020830135614ebd81615b99565b6000806040838503121561539057600080fd5b50508035926020909101359150565b6000602082840312156153b157600080fd5b610ee982614e1f565b600080600080600060a086880312156153d257600080fd5b6153db86614e44565b94506020860151935060408601519250606086015191506153fe60808701614e44565b90509295509295909350565b600081518084526020808501945080840160005b838110156154435781516001600160a01b03168752958201959082019060010161541e565b509495945050505050565b8060005b6002811015612c76578151845260209384019390910190600101615452565b600081518084526020808501945080840160005b8381101561544357815187529582019590820190600101615485565b600081518084526154b9816020860160208601615ad0565b601f01601f19169290920160200192915050565b6154d7818361544e565b604001919050565b600083516154f1818460208801615ad0565b835190830190615505818360208801615ad0565b01949350505050565b86815261551e602082018761544e565b61552b606082018661544e565b61553860a082018561544e565b61554560e082018461544e565b60609190911b6001600160601b0319166101208201526101340195945050505050565b838152615578602082018461544e565b606081019190915260800192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039290921682526001600160601b0316602082015260400190565b604081016124bd828461544e565b602081526000610ee96020830184615471565b918252602082015260400190565b93845260ff9290921660208401526040830152606082015260800190565b602081526000610ee960208301846154a1565b6020815260ff82511660208201526020820151604082015260018060a01b0360408301511660608201526000606083015160c0608084015261569760e084018261540a565b60808501516001600160601b0390811660a0868101919091529095015190941660c0909301929092525090919050565b61ffff93841681529183166020830152909116604082015260600190565b60006060820161ffff86168352602063ffffffff86168185015260606040850152818551808452608086019150828701935060005b818110156157365784518352938301939183019160010161571a565b509098975050505050505050565b9182526001600160a01b0316602082015260400190565b82815260608101610ee9602083018461544e565b8281526040602082015260006135a36040830184615471565b86815285602082015261ffff85166040820152600063ffffffff808616606084015280851660808401525060c060a0830152613c6860c08301846154a1565b878152602081018790526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613d8c908301846154a1565b8781526001600160401b03871660208201526040810186905263ffffffff8581166060830152841660808201526001600160a01b03831660a082015260e060c08201819052600090613d8c908301846154a1565b63ffffffff92831681529116602082015260400190565b6001600160401b0391909116815260200190565b6001600160601b038681168252851660208201526001600160401b03841660408201526001600160a01b038316606082015260a0608082018190526000906158dc9083018461540a565b979650505050505050565b6000808335601e198436030181126158fe57600080fd5b8301803591506001600160401b0382111561591857600080fd5b602001915036819003821315614cf657600080fd5b60405160c081016001600160401b038111828210171561594f5761594f615b83565b60405290565b60405161012081016001600160401b038111828210171561594f5761594f615b83565b604051601f8201601f191681016001600160401b03811182821017156159a0576159a0615b83565b604052919050565b600080858511156159b857600080fd5b838611156159c557600080fd5b5050820193919092039150565b600082198211156159e5576159e5615b2b565b500190565b60006001600160401b0382811684821680830382111561550557615505615b2b565b60006001600160601b0382811684821680830382111561550557615505615b2b565b600082615a3d57615a3d615b41565b500490565b6000816000190483118215151615615a5c57615a5c615b2b565b500290565b600082821015615a7357615a73615b2b565b500390565b60006001600160601b0383811690831681811015615a9857615a98615b2b565b039392505050565b6001600160e01b03198135818116916004851015615ac85780818660040360031b1b83161692505b505092915050565b60005b83811015615aeb578181015183820152602001615ad3565b83811115612c765750506000910152565b6000600019821415615b1057615b10615b2b565b5060010190565b600082615b2657615b26615b41565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461300d57600080fd5b801515811461300d57600080fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000806000a",
}
var VRFCoordinatorV2PlusUpgradedVersionABI = VRFCoordinatorV2PlusUpgradedVersionMetaData.ABI
@@ -521,6 +516,10 @@ func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionC
outstruct.ReentrancyLock = *abi.ConvertType(out[2], new(bool)).(*bool)
outstruct.StalenessSeconds = *abi.ConvertType(out[3], new(uint32)).(*uint32)
outstruct.GasAfterPaymentCalculation = *abi.ConvertType(out[4], new(uint32)).(*uint32)
+ outstruct.FulfillmentFlatFeeNativePPM = *abi.ConvertType(out[5], new(uint32)).(*uint32)
+ outstruct.FulfillmentFlatFeeLinkDiscountPPM = *abi.ConvertType(out[6], new(uint32)).(*uint32)
+ outstruct.NativePremiumPercentage = *abi.ConvertType(out[7], new(uint8)).(*uint8)
+ outstruct.LinkPremiumPercentage = *abi.ConvertType(out[8], new(uint8)).(*uint8)
return *outstruct, err
@@ -708,16 +707,16 @@ func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionT
return _VRFCoordinatorV2PlusUpgradedVersion.Contract.CreateSubscription(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts)
}
-func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactor) FulfillRandomWords(opts *bind.TransactOpts, proof VRFProof, rc VRFCoordinatorV2PlusUpgradedVersionRequestCommitment) (*types.Transaction, error) {
- return _VRFCoordinatorV2PlusUpgradedVersion.contract.Transact(opts, "fulfillRandomWords", proof, rc)
+func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactor) FulfillRandomWords(opts *bind.TransactOpts, proof VRFProof, rc VRFCoordinatorV2PlusUpgradedVersionRequestCommitment, arg2 bool) (*types.Transaction, error) {
+ return _VRFCoordinatorV2PlusUpgradedVersion.contract.Transact(opts, "fulfillRandomWords", proof, rc, arg2)
}
-func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionSession) FulfillRandomWords(proof VRFProof, rc VRFCoordinatorV2PlusUpgradedVersionRequestCommitment) (*types.Transaction, error) {
- return _VRFCoordinatorV2PlusUpgradedVersion.Contract.FulfillRandomWords(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, proof, rc)
+func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionSession) FulfillRandomWords(proof VRFProof, rc VRFCoordinatorV2PlusUpgradedVersionRequestCommitment, arg2 bool) (*types.Transaction, error) {
+ return _VRFCoordinatorV2PlusUpgradedVersion.Contract.FulfillRandomWords(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, proof, rc, arg2)
}
-func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactorSession) FulfillRandomWords(proof VRFProof, rc VRFCoordinatorV2PlusUpgradedVersionRequestCommitment) (*types.Transaction, error) {
- return _VRFCoordinatorV2PlusUpgradedVersion.Contract.FulfillRandomWords(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, proof, rc)
+func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactorSession) FulfillRandomWords(proof VRFProof, rc VRFCoordinatorV2PlusUpgradedVersionRequestCommitment, arg2 bool) (*types.Transaction, error) {
+ return _VRFCoordinatorV2PlusUpgradedVersion.Contract.FulfillRandomWords(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, proof, rc, arg2)
}
func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactor) FundSubscriptionWithNative(opts *bind.TransactOpts, subId *big.Int) (*types.Transaction, error) {
@@ -864,16 +863,16 @@ func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionT
return _VRFCoordinatorV2PlusUpgradedVersion.Contract.RequestSubscriptionOwnerTransfer(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, subId, newOwner)
}
-func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactor) SetConfig(opts *bind.TransactOpts, minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig VRFCoordinatorV2PlusUpgradedVersionFeeConfig) (*types.Transaction, error) {
- return _VRFCoordinatorV2PlusUpgradedVersion.contract.Transact(opts, "setConfig", minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, feeConfig)
+func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactor) SetConfig(opts *bind.TransactOpts, minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, fulfillmentFlatFeeNativePPM uint32, fulfillmentFlatFeeLinkDiscountPPM uint32, nativePremiumPercentage uint8, linkPremiumPercentage uint8) (*types.Transaction, error) {
+ return _VRFCoordinatorV2PlusUpgradedVersion.contract.Transact(opts, "setConfig", minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, fulfillmentFlatFeeNativePPM, fulfillmentFlatFeeLinkDiscountPPM, nativePremiumPercentage, linkPremiumPercentage)
}
-func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionSession) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig VRFCoordinatorV2PlusUpgradedVersionFeeConfig) (*types.Transaction, error) {
- return _VRFCoordinatorV2PlusUpgradedVersion.Contract.SetConfig(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, feeConfig)
+func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionSession) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, fulfillmentFlatFeeNativePPM uint32, fulfillmentFlatFeeLinkDiscountPPM uint32, nativePremiumPercentage uint8, linkPremiumPercentage uint8) (*types.Transaction, error) {
+ return _VRFCoordinatorV2PlusUpgradedVersion.Contract.SetConfig(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, fulfillmentFlatFeeNativePPM, fulfillmentFlatFeeLinkDiscountPPM, nativePremiumPercentage, linkPremiumPercentage)
}
-func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactorSession) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig VRFCoordinatorV2PlusUpgradedVersionFeeConfig) (*types.Transaction, error) {
- return _VRFCoordinatorV2PlusUpgradedVersion.Contract.SetConfig(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, feeConfig)
+func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactorSession) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, fulfillmentFlatFeeNativePPM uint32, fulfillmentFlatFeeLinkDiscountPPM uint32, nativePremiumPercentage uint8, linkPremiumPercentage uint8) (*types.Transaction, error) {
+ return _VRFCoordinatorV2PlusUpgradedVersion.Contract.SetConfig(&_VRFCoordinatorV2PlusUpgradedVersion.TransactOpts, minimumRequestConfirmations, maxGasLimit, stalenessSeconds, gasAfterPaymentCalculation, fallbackWeiPerUnitLink, fulfillmentFlatFeeNativePPM, fulfillmentFlatFeeLinkDiscountPPM, nativePremiumPercentage, linkPremiumPercentage)
}
func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersionTransactor) SetLINKAndLINKNativeFeed(opts *bind.TransactOpts, link common.Address, linkNativeFeed common.Address) (*types.Transaction, error) {
@@ -990,7 +989,8 @@ type VRFCoordinatorV2PlusUpgradedVersionConfigSet struct {
StalenessSeconds uint32
GasAfterPaymentCalculation uint32
FallbackWeiPerUnitLink *big.Int
- FeeConfig VRFCoordinatorV2PlusUpgradedVersionFeeConfig
+ NativePremiumPercentage uint8
+ LinkPremiumPercentage uint8
Raw types.Log
}
@@ -3240,11 +3240,15 @@ type GetSubscription struct {
Consumers []common.Address
}
type SConfig struct {
- MinimumRequestConfirmations uint16
- MaxGasLimit uint32
- ReentrancyLock bool
- StalenessSeconds uint32
- GasAfterPaymentCalculation uint32
+ MinimumRequestConfirmations uint16
+ MaxGasLimit uint32
+ ReentrancyLock bool
+ StalenessSeconds uint32
+ GasAfterPaymentCalculation uint32
+ FulfillmentFlatFeeNativePPM uint32
+ FulfillmentFlatFeeLinkDiscountPPM uint32
+ NativePremiumPercentage uint8
+ LinkPremiumPercentage uint8
}
func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersion) ParseLog(log types.Log) (generated.AbigenLog, error) {
@@ -3292,7 +3296,7 @@ func (_VRFCoordinatorV2PlusUpgradedVersion *VRFCoordinatorV2PlusUpgradedVersion)
}
func (VRFCoordinatorV2PlusUpgradedVersionConfigSet) Topic() common.Hash {
- return common.HexToHash("0x777357bb93f63d088f18112d3dba38457aec633eb8f1341e1d418380ad328e78")
+ return common.HexToHash("0x95cb2ddab6d2297c29a4861691de69b3969c464aa4a9c44258b101ff02ff375a")
}
func (VRFCoordinatorV2PlusUpgradedVersionCoordinatorRegistered) Topic() common.Hash {
@@ -3420,7 +3424,7 @@ type VRFCoordinatorV2PlusUpgradedVersionInterface interface {
CreateSubscription(opts *bind.TransactOpts) (*types.Transaction, error)
- FulfillRandomWords(opts *bind.TransactOpts, proof VRFProof, rc VRFCoordinatorV2PlusUpgradedVersionRequestCommitment) (*types.Transaction, error)
+ FulfillRandomWords(opts *bind.TransactOpts, proof VRFProof, rc VRFCoordinatorV2PlusUpgradedVersionRequestCommitment, arg2 bool) (*types.Transaction, error)
FundSubscriptionWithNative(opts *bind.TransactOpts, subId *big.Int) (*types.Transaction, error)
@@ -3446,7 +3450,7 @@ type VRFCoordinatorV2PlusUpgradedVersionInterface interface {
RequestSubscriptionOwnerTransfer(opts *bind.TransactOpts, subId *big.Int, newOwner common.Address) (*types.Transaction, error)
- SetConfig(opts *bind.TransactOpts, minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig VRFCoordinatorV2PlusUpgradedVersionFeeConfig) (*types.Transaction, error)
+ SetConfig(opts *bind.TransactOpts, minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, fulfillmentFlatFeeNativePPM uint32, fulfillmentFlatFeeLinkDiscountPPM uint32, nativePremiumPercentage uint8, linkPremiumPercentage uint8) (*types.Transaction, error)
SetLINKAndLINKNativeFeed(opts *bind.TransactOpts, link common.Address, linkNativeFeed common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 3b395c98520..a94cf5a462c 100644
--- a/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -8,10 +8,10 @@ automation_forwarder_logic: ../../contracts/solc/v0.8.16/AutomationForwarderLogi
automation_registrar_wrapper2_1: ../../contracts/solc/v0.8.16/AutomationRegistrar2_1/AutomationRegistrar2_1.abi ../../contracts/solc/v0.8.16/AutomationRegistrar2_1/AutomationRegistrar2_1.bin eb06d853aab39d3196c593b03e555851cbe8386e0fe54a74c2479f62d14b3c42
automation_registrar_wrapper2_2: ../../contracts/solc/v0.8.19/AutomationRegistrar2_2/AutomationRegistrar2_2.abi ../../contracts/solc/v0.8.19/AutomationRegistrar2_2/AutomationRegistrar2_2.bin 7c61908c1bb1bfd05a4da22bb73d62c0e2c05240f3f8fb5e06331603ff2246a9
automation_utils_2_1: ../../contracts/solc/v0.8.16/AutomationUtils2_1/AutomationUtils2_1.abi ../../contracts/solc/v0.8.16/AutomationUtils2_1/AutomationUtils2_1.bin 331bfa79685aee6ddf63b64c0747abee556c454cae3fb8175edff425b615d8aa
-automation_utils_2_2: ../../contracts/solc/v0.8.19/AutomationUtils2_2/AutomationUtils2_2.abi ../../contracts/solc/v0.8.19/AutomationUtils2_2/AutomationUtils2_2.bin 02fa485ffa8dbe75cb8812302709ecf155e0466cd2bd532565fba84ae7e7e8b7
+automation_utils_2_2: ../../contracts/solc/v0.8.19/AutomationUtils2_2/AutomationUtils2_2.abi ../../contracts/solc/v0.8.19/AutomationUtils2_2/AutomationUtils2_2.bin 6fe2e41b1d3b74bee4013a48c10d84da25e559f28e22749aa13efabbf2cc2ee8
batch_blockhash_store: ../../contracts/solc/v0.8.6/BatchBlockhashStore/BatchBlockhashStore.abi ../../contracts/solc/v0.8.6/BatchBlockhashStore/BatchBlockhashStore.bin 14356c48ef70f66ef74f22f644450dbf3b2a147c1b68deaa7e7d1eb8ffab15db
batch_vrf_coordinator_v2: ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2/BatchVRFCoordinatorV2.abi ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2/BatchVRFCoordinatorV2.bin d0a54963260d8c1f1bbd984b758285e6027cfb5a7e42701bcb562ab123219332
-batch_vrf_coordinator_v2plus: ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.abi ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.bin 7bb76ae241cf1b37b41920830b836cb99f1ad33efd7435ca2398ff6cd2fe5d48
+batch_vrf_coordinator_v2plus: ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.abi ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.bin 73cb626b5cb2c3464655b61b8ac42fe7a1963fe25e6a5eea40b8e4d5bff3de36
blockhash_store: ../../contracts/solc/v0.8.6/BlockhashStore/BlockhashStore.abi ../../contracts/solc/v0.8.6/BlockhashStore/BlockhashStore.bin 12b0662f1636a341c8863bdec7a20f2ddd97c3a4fd1a7ae353fe316609face4e
chain_reader_example: ../../contracts/solc/v0.8.19/ChainReaderTestContract/LatestValueHolder.abi ../../contracts/solc/v0.8.19/ChainReaderTestContract/LatestValueHolder.bin de88c7e68de36b96aa2bec844bdc96fcd7c9017b38e25062b3b9f9cec42c814f
chain_specific_util_helper: ../../contracts/solc/v0.8.6/ChainSpecificUtilHelper/ChainSpecificUtilHelper.abi ../../contracts/solc/v0.8.6/ChainSpecificUtilHelper/ChainSpecificUtilHelper.bin 5f10664e31abc768f4a37901cae7a3bef90146180f97303e5a1bde5a08d84595
@@ -24,7 +24,7 @@ flux_aggregator_wrapper: ../../contracts/solc/v0.6/FluxAggregator/FluxAggregator
gas_wrapper: ../../contracts/solc/v0.8.6/KeeperRegistryCheckUpkeepGasUsageWrapper1_2/KeeperRegistryCheckUpkeepGasUsageWrapper1_2.abi ../../contracts/solc/v0.8.6/KeeperRegistryCheckUpkeepGasUsageWrapper1_2/KeeperRegistryCheckUpkeepGasUsageWrapper1_2.bin 4a5dcdac486d18fcd58e3488c15c1710ae76b977556a3f3191bd269a4bc75723
gas_wrapper_mock: ../../contracts/solc/v0.8.6/KeeperRegistryCheckUpkeepGasUsageWrapper1_2Mock/KeeperRegistryCheckUpkeepGasUsageWrapper1_2Mock.abi ../../contracts/solc/v0.8.6/KeeperRegistryCheckUpkeepGasUsageWrapper1_2Mock/KeeperRegistryCheckUpkeepGasUsageWrapper1_2Mock.bin a9b08f18da59125c6fc305855710241f3d35161b8b9f3e3f635a7b1d5c6da9c8
i_keeper_registry_master_wrapper_2_1: ../../contracts/solc/v0.8.16/IKeeperRegistryMaster/IKeeperRegistryMaster.abi ../../contracts/solc/v0.8.16/IKeeperRegistryMaster/IKeeperRegistryMaster.bin 6501bb9bcf5048bab2737b00685c6984a24867e234ddf5b60a65904eee9a4ebc
-i_keeper_registry_master_wrapper_2_2: ../../contracts/solc/v0.8.19/IAutomationRegistryMaster/IAutomationRegistryMaster.abi ../../contracts/solc/v0.8.19/IAutomationRegistryMaster/IAutomationRegistryMaster.bin 37aabed3df4c1ab6ac63def4aa8e251da975bbbb15a8bcf1c22ff7467d70f70f
+i_keeper_registry_master_wrapper_2_2: ../../contracts/solc/v0.8.19/IAutomationRegistryMaster/IAutomationRegistryMaster.abi ../../contracts/solc/v0.8.19/IAutomationRegistryMaster/IAutomationRegistryMaster.bin 0ce3cb008ba9681b8d08aa4e8b0b1f5b5b96852abf7c388e48166a9aeacc72f0
i_log_automation: ../../contracts/solc/v0.8.16/ILogAutomation/ILogAutomation.abi ../../contracts/solc/v0.8.16/ILogAutomation/ILogAutomation.bin 296beccb6af655d6fc3a6e676b244831cce2da6688d3afc4f21f8738ae59e03e
keeper_consumer_performance_wrapper: ../../contracts/solc/v0.8.16/KeeperConsumerPerformance/KeeperConsumerPerformance.abi ../../contracts/solc/v0.8.16/KeeperConsumerPerformance/KeeperConsumerPerformance.bin eeda39f5d3e1c8ffa0fb6cd1803731b98a4bc262d41833458e3fe8b40933ae90
keeper_consumer_wrapper: ../../contracts/solc/v0.8.16/KeeperConsumer/KeeperConsumer.abi ../../contracts/solc/v0.8.16/KeeperConsumer/KeeperConsumer.bin 2c6163b145082fbab74b7343577a9cec8fda8b0da9daccf2a82581b1f5a84b83
@@ -34,16 +34,16 @@ keeper_registrar_wrapper2_0: ../../contracts/solc/v0.8.6/KeeperRegistrar2_0/Keep
keeper_registry_logic1_3: ../../contracts/solc/v0.8.6/KeeperRegistryLogic1_3/KeeperRegistryLogic1_3.abi ../../contracts/solc/v0.8.6/KeeperRegistryLogic1_3/KeeperRegistryLogic1_3.bin 903f8b9c8e25425ca6d0b81b89e339d695a83630bfbfa24a6f3b38869676bc5a
keeper_registry_logic2_0: ../../contracts/solc/v0.8.6/KeeperRegistryLogic2_0/KeeperRegistryLogic2_0.abi ../../contracts/solc/v0.8.6/KeeperRegistryLogic2_0/KeeperRegistryLogic2_0.bin d69d2bc8e4844293dbc2d45abcddc50b84c88554ecccfa4fa77c0ca45ec80871
keeper_registry_logic_a_wrapper_2_1: ../../contracts/solc/v0.8.16/KeeperRegistryLogicA2_1/KeeperRegistryLogicA2_1.abi ../../contracts/solc/v0.8.16/KeeperRegistryLogicA2_1/KeeperRegistryLogicA2_1.bin 77481ab75c9aa86a62a7b2a708599b5ea1a6346ed1c0def6d4826e7ae523f1ee
-keeper_registry_logic_a_wrapper_2_2: ../../contracts/solc/v0.8.19/AutomationRegistryLogicA2_2/AutomationRegistryLogicA2_2.abi ../../contracts/solc/v0.8.19/AutomationRegistryLogicA2_2/AutomationRegistryLogicA2_2.bin 29cb8ca92fe15bc851c52e3bbf109cece5d485bf0840bcccebf5b03055b64730
+keeper_registry_logic_a_wrapper_2_2: ../../contracts/solc/v0.8.19/AutomationRegistryLogicA2_2/AutomationRegistryLogicA2_2.abi ../../contracts/solc/v0.8.19/AutomationRegistryLogicA2_2/AutomationRegistryLogicA2_2.bin 6bcf855e020256092a9d02be38d143006d3261c7531d2c98fb42f19296f08d6b
keeper_registry_logic_b_wrapper_2_1: ../../contracts/solc/v0.8.16/KeeperRegistryLogicB2_1/KeeperRegistryLogicB2_1.abi ../../contracts/solc/v0.8.16/KeeperRegistryLogicB2_1/KeeperRegistryLogicB2_1.bin 467d10741a04601b136553a2b1c6ab37f2a65d809366faf03180a22ff26be215
-keeper_registry_logic_b_wrapper_2_2: ../../contracts/solc/v0.8.19/AutomationRegistryLogicB2_2/AutomationRegistryLogicB2_2.abi ../../contracts/solc/v0.8.19/AutomationRegistryLogicB2_2/AutomationRegistryLogicB2_2.bin e0f5a9e7f83ad6098fa6a7605a49275e98904a1c3826fe3f757a6542fcf38169
+keeper_registry_logic_b_wrapper_2_2: ../../contracts/solc/v0.8.19/AutomationRegistryLogicB2_2/AutomationRegistryLogicB2_2.abi ../../contracts/solc/v0.8.19/AutomationRegistryLogicB2_2/AutomationRegistryLogicB2_2.bin 12f4fd408e4bed3ce5312c7f89a83e6a39ad95009c8f598d50f705fdc9463fdf
keeper_registry_wrapper1_1: ../../contracts/solc/v0.7/KeeperRegistry1_1/KeeperRegistry1_1.abi ../../contracts/solc/v0.7/KeeperRegistry1_1/KeeperRegistry1_1.bin 6ce079f2738f015f7374673a2816e8e9787143d00b780ea7652c8aa9ad9e1e20
keeper_registry_wrapper1_1_mock: ../../contracts/solc/v0.7/KeeperRegistry1_1Mock/KeeperRegistry1_1Mock.abi ../../contracts/solc/v0.7/KeeperRegistry1_1Mock/KeeperRegistry1_1Mock.bin 98ddb3680e86359de3b5d17e648253ba29a84703f087a1b52237824003a8c6df
keeper_registry_wrapper1_2: ../../contracts/solc/v0.8.6/KeeperRegistry1_2/KeeperRegistry1_2.abi ../../contracts/solc/v0.8.6/KeeperRegistry1_2/KeeperRegistry1_2.bin a40ff877dd7c280f984cbbb2b428e160662b0c295e881d5f778f941c0088ca22
keeper_registry_wrapper1_3: ../../contracts/solc/v0.8.6/KeeperRegistry1_3/KeeperRegistry1_3.abi ../../contracts/solc/v0.8.6/KeeperRegistry1_3/KeeperRegistry1_3.bin d4dc760b767ae274ee25c4a604ea371e1fa603a7b6421b69efb2088ad9e8abb3
keeper_registry_wrapper2_0: ../../contracts/solc/v0.8.6/KeeperRegistry2_0/KeeperRegistry2_0.abi ../../contracts/solc/v0.8.6/KeeperRegistry2_0/KeeperRegistry2_0.bin c32dea7d5ef66b7c58ddc84ddf69aa44df1b3ae8601fbc271c95be4ff5853056
keeper_registry_wrapper_2_1: ../../contracts/solc/v0.8.16/KeeperRegistry2_1/KeeperRegistry2_1.abi ../../contracts/solc/v0.8.16/KeeperRegistry2_1/KeeperRegistry2_1.bin 604e4a0cd980c713929b523b999462a3aa0ed06f96ff563a4c8566cf59c8445b
-keeper_registry_wrapper_2_2: ../../contracts/solc/v0.8.19/AutomationRegistry2_2/AutomationRegistry2_2.abi ../../contracts/solc/v0.8.19/AutomationRegistry2_2/AutomationRegistry2_2.bin 320d599d74c49fe773f60f5cbe939363918d9eaeb9963da294616300c55dabbf
+keeper_registry_wrapper_2_2: ../../contracts/solc/v0.8.19/AutomationRegistry2_2/AutomationRegistry2_2.abi ../../contracts/solc/v0.8.19/AutomationRegistry2_2/AutomationRegistry2_2.bin 0defe584ccaab499a584eecd742442ec06f8aacd80fbacb85a25c42b227ef6d2
keepers_vrf_consumer: ../../contracts/solc/v0.8.6/KeepersVRFConsumer/KeepersVRFConsumer.abi ../../contracts/solc/v0.8.6/KeepersVRFConsumer/KeepersVRFConsumer.bin fa75572e689c9e84705c63e8dbe1b7b8aa1a8fe82d66356c4873d024bb9166e8
log_emitter: ../../contracts/solc/v0.8.19/LogEmitter/LogEmitter.abi ../../contracts/solc/v0.8.19/LogEmitter/LogEmitter.bin 4b129ab93432c95ff9143f0631323e189887668889e0b36ccccf18a571e41ccf
log_triggered_streams_lookup_wrapper: ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.abi ../../contracts/solc/v0.8.16/LogTriggeredStreamsLookup/LogTriggeredStreamsLookup.bin f8da43a927c1a66238a9f4fd5d5dd7e280e361daa0444da1f7f79498ace901e1
@@ -83,9 +83,9 @@ vrf_consumer_v2_upgradeable_example: ../../contracts/solc/v0.8.6/VRFConsumerV2Up
vrf_coordinator_mock: ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.abi ../../contracts/solc/v0.8.6/VRFCoordinatorMock/VRFCoordinatorMock.bin 5c495cf8df1f46d8736b9150cdf174cce358cb8352f60f0d5bb9581e23920501
vrf_coordinator_test_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorTestV2/VRFCoordinatorTestV2.bin eaefd785c38bac67fb11a7fc2737ab2da68c988ca170e7db8ff235c80893e01c
vrf_coordinator_v2: ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2/VRFCoordinatorV2.bin 295f35ce282060317dfd01f45959f5a2b05ba26913e422fbd4fb6bf90b107006
-vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin bcad64e1b41278998c94867370fd9c4809b1376ccc004955bc7ed33fe716408c
+vrf_coordinator_v2_5: ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin aa5875f42461b4f128483ee0fd8b1f1b72a395ee857e6153197e92bcb21d149f
vrf_coordinator_v2_plus_v2_example: ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.bin 4a5b86701983b1b65f0a8dfa116b3f6d75f8f706fa274004b57bdf5992e4cec3
-vrf_coordinator_v2plus_interface: ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.abi ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.bin 834a2ce0e83276372a0e1446593fd89798f4cf6dc95d4be0113e99fadf61558b
+vrf_coordinator_v2plus_interface: ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.abi ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.bin 86b8e23aab28c5b98e3d2384dc4f702b093e382dc985c88101278e6e4bf6f7b8
vrf_external_sub_owner_example: ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.abi ../../contracts/solc/v0.8.6/VRFExternalSubOwnerExample/VRFExternalSubOwnerExample.bin 14f888eb313930b50233a6f01ea31eba0206b7f41a41f6311670da8bb8a26963
vrf_load_test_external_sub_owner: ../../contracts/solc/v0.8.6/VRFLoadTestExternalSubOwner/VRFLoadTestExternalSubOwner.abi ../../contracts/solc/v0.8.6/VRFLoadTestExternalSubOwner/VRFLoadTestExternalSubOwner.bin 2097faa70265e420036cc8a3efb1f1e0836ad2d7323b295b9a26a125dbbe6c7d
vrf_load_test_ownerless_consumer: ../../contracts/solc/v0.8.6/VRFLoadTestOwnerlessConsumer/VRFLoadTestOwnerlessConsumer.abi ../../contracts/solc/v0.8.6/VRFLoadTestOwnerlessConsumer/VRFLoadTestOwnerlessConsumer.bin 74f914843cbc70b9c3079c3e1c709382ce415225e8bb40113e7ac018bfcb0f5c
@@ -102,7 +102,7 @@ vrf_v2_consumer_wrapper: ../../contracts/solc/v0.8.6/VRFv2Consumer/VRFv2Consumer
vrf_v2plus_load_test_with_metrics: ../../contracts/solc/v0.8.6/VRFV2PlusLoadTestWithMetrics/VRFV2PlusLoadTestWithMetrics.abi ../../contracts/solc/v0.8.6/VRFV2PlusLoadTestWithMetrics/VRFV2PlusLoadTestWithMetrics.bin 0a89cb7ed9dfb42f91e559b03dc351ccdbe14d281a7ab71c63bd3f47eeed7711
vrf_v2plus_single_consumer: ../../contracts/solc/v0.8.6/VRFV2PlusSingleConsumerExample/VRFV2PlusSingleConsumerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusSingleConsumerExample/VRFV2PlusSingleConsumerExample.bin 6226d05afa1664033b182bfbdde11d5dfb1d4c8e3eb0bd0448c8bfb76f5b96e4
vrf_v2plus_sub_owner: ../../contracts/solc/v0.8.6/VRFV2PlusExternalSubOwnerExample/VRFV2PlusExternalSubOwnerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusExternalSubOwnerExample/VRFV2PlusExternalSubOwnerExample.bin 7541f986571b8a5671a256edc27ae9b8df9bcdff45ac3b96e5609bbfcc320e4e
-vrf_v2plus_upgraded_version: ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.bin 3bcd359eddf2bc861dda86f9bb10b78bac1e0370badd15f67ae17b35c5d228d4
+vrf_v2plus_upgraded_version: ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.bin 09e4186c64cdaf1e5d36405467fb86996d7e4177cb08ecec425a4352d4246140
vrfv2_proxy_admin: ../../contracts/solc/v0.8.6/VRFV2ProxyAdmin/VRFV2ProxyAdmin.abi ../../contracts/solc/v0.8.6/VRFV2ProxyAdmin/VRFV2ProxyAdmin.bin 402b1103087ffe1aa598854a8f8b38f8cd3de2e3aaa86369e28017a9157f4980
vrfv2_reverting_example: ../../contracts/solc/v0.8.6/VRFV2RevertingExample/VRFV2RevertingExample.abi ../../contracts/solc/v0.8.6/VRFV2RevertingExample/VRFV2RevertingExample.bin 1ae46f80351d428bd85ba58b9041b2a608a1845300d79a8fed83edf96606de87
vrfv2_transparent_upgradeable_proxy: ../../contracts/solc/v0.8.6/VRFV2TransparentUpgradeableProxy/VRFV2TransparentUpgradeableProxy.abi ../../contracts/solc/v0.8.6/VRFV2TransparentUpgradeableProxy/VRFV2TransparentUpgradeableProxy.bin fe1a8e6852fbd06d91f64315c5cede86d340891f5b5cc981fb5b86563f7eac3f
diff --git a/core/gethwrappers/go_generate_test.go b/core/gethwrappers/go_generate_test.go
index e0779c306c4..52d0f520dd7 100644
--- a/core/gethwrappers/go_generate_test.go
+++ b/core/gethwrappers/go_generate_test.go
@@ -138,11 +138,10 @@ func getProjectRoot(t *testing.T) (rootPath string) {
root, err := os.Getwd()
require.NoError(t, err, "could not get current working directory")
for root != "/" { // Walk up path to find dir containing go.mod
- if _, err := os.Stat(filepath.Join(root, "go.mod")); os.IsNotExist(err) {
- root = filepath.Dir(root)
- } else {
+ if _, err := os.Stat(filepath.Join(root, "go.mod")); !os.IsNotExist(err) {
return root
}
+ root = filepath.Dir(root)
}
t.Fatal("could not find project root")
return
diff --git a/core/gethwrappers/go_generate_vrfv2plus.go b/core/gethwrappers/go_generate_vrfv2plus.go
new file mode 100644
index 00000000000..efd11050034
--- /dev/null
+++ b/core/gethwrappers/go_generate_vrfv2plus.go
@@ -0,0 +1,21 @@
+package gethwrappers
+
+// VRF V2Plus
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.abi ../../contracts/solc/v0.8.6/IVRFCoordinatorV2PlusInternal/IVRFCoordinatorV2PlusInternal.bin IVRFCoordinatorV2PlusInternal vrf_coordinator_v2plus_interface
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.abi ../../contracts/solc/v0.8.6/BatchVRFCoordinatorV2Plus/BatchVRFCoordinatorV2Plus.bin BatchVRFCoordinatorV2Plus batch_vrf_coordinator_v2plus
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/TrustedBlockhashStore/TrustedBlockhashStore.abi ../../contracts/solc/v0.8.6/TrustedBlockhashStore/TrustedBlockhashStore.bin TrustedBlockhashStore trusted_blockhash_store
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusConsumerExample/VRFV2PlusConsumerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusConsumerExample/VRFV2PlusConsumerExample.bin VRFV2PlusConsumerExample vrfv2plus_consumer_example
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2_5/VRFCoordinatorV2_5.bin VRFCoordinatorV2_5 vrf_coordinator_v2_5
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusWrapper/VRFV2PlusWrapper.abi ../../contracts/solc/v0.8.6/VRFV2PlusWrapper/VRFV2PlusWrapper.bin VRFV2PlusWrapper vrfv2plus_wrapper
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusWrapperConsumerExample/VRFV2PlusWrapperConsumerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusWrapperConsumerExample/VRFV2PlusWrapperConsumerExample.bin VRFV2PlusWrapperConsumerExample vrfv2plus_wrapper_consumer_example
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFMaliciousConsumerV2Plus/VRFMaliciousConsumerV2Plus.abi ../../contracts/solc/v0.8.6/VRFMaliciousConsumerV2Plus/VRFMaliciousConsumerV2Plus.bin VRFMaliciousConsumerV2Plus vrf_malicious_consumer_v2_plus
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusSingleConsumerExample/VRFV2PlusSingleConsumerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusSingleConsumerExample/VRFV2PlusSingleConsumerExample.bin VRFV2PlusSingleConsumerExample vrf_v2plus_single_consumer
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusExternalSubOwnerExample/VRFV2PlusExternalSubOwnerExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusExternalSubOwnerExample/VRFV2PlusExternalSubOwnerExample.bin VRFV2PlusExternalSubOwnerExample vrf_v2plus_sub_owner
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusRevertingExample/VRFV2PlusRevertingExample.abi ../../contracts/solc/v0.8.6/VRFV2PlusRevertingExample/VRFV2PlusRevertingExample.bin VRFV2PlusRevertingExample vrfv2plus_reverting_example
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFConsumerV2PlusUpgradeableExample/VRFConsumerV2PlusUpgradeableExample.abi ../../contracts/solc/v0.8.6/VRFConsumerV2PlusUpgradeableExample/VRFConsumerV2PlusUpgradeableExample.bin VRFConsumerV2PlusUpgradeableExample vrf_consumer_v2_plus_upgradeable_example
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusClient/VRFV2PlusClient.abi ../../contracts/solc/v0.8.6/VRFV2PlusClient/VRFV2PlusClient.bin VRFV2PlusClient vrfv2plus_client
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2Plus_V2Example/VRFCoordinatorV2Plus_V2Example.bin VRFCoordinatorV2Plus_V2Example vrf_coordinator_v2_plus_v2_example
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusMaliciousMigrator/VRFV2PlusMaliciousMigrator.abi ../../contracts/solc/v0.8.6/VRFV2PlusMaliciousMigrator/VRFV2PlusMaliciousMigrator.bin VRFV2PlusMaliciousMigrator vrfv2plus_malicious_migrator
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusLoadTestWithMetrics/VRFV2PlusLoadTestWithMetrics.abi ../../contracts/solc/v0.8.6/VRFV2PlusLoadTestWithMetrics/VRFV2PlusLoadTestWithMetrics.bin VRFV2PlusLoadTestWithMetrics vrf_v2plus_load_test_with_metrics
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.abi ../../contracts/solc/v0.8.6/VRFCoordinatorV2PlusUpgradedVersion/VRFCoordinatorV2PlusUpgradedVersion.bin VRFCoordinatorV2PlusUpgradedVersion vrf_v2plus_upgraded_version
+//go:generate go run ./generation/generate/wrap.go ../../contracts/solc/v0.8.6/VRFV2PlusWrapperLoadTestConsumer/VRFV2PlusWrapperLoadTestConsumer.abi ../../contracts/solc/v0.8.6/VRFV2PlusWrapperLoadTestConsumer/VRFV2PlusWrapperLoadTestConsumer.bin VRFV2PlusWrapperLoadTestConsumer vrfv2plus_wrapper_load_test_consumer
diff --git a/core/gethwrappers/llo-feeds/generated/channel_config_store/channel_config_store.go b/core/gethwrappers/llo-feeds/generated/channel_config_store/channel_config_store.go
new file mode 100644
index 00000000000..d6874fed1f7
--- /dev/null
+++ b/core/gethwrappers/llo-feeds/generated/channel_config_store/channel_config_store.go
@@ -0,0 +1,1032 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package channel_config_store
+
+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
+)
+
+type IChannelConfigStoreChannelDefinition struct {
+ ReportFormat [8]byte
+ ChainSelector uint64
+ StreamIDs []uint32
+}
+
+var ChannelConfigStoreMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ChannelDefinitionNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyStreamIDs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByEOA\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StagingConfigAlreadyPromoted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroReportFormat\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"channelId\",\"type\":\"uint32\"}],\"name\":\"ChannelDefinitionRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"channelId\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"bytes8\",\"name\":\"reportFormat\",\"type\":\"bytes8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint32[]\",\"name\":\"streamIDs\",\"type\":\"uint32[]\"}],\"indexed\":false,\"internalType\":\"structIChannelConfigStore.ChannelDefinition\",\"name\":\"channelDefinition\",\"type\":\"tuple\"}],\"name\":\"NewChannelDefinition\",\"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\":\"uint32\",\"name\":\"channelId\",\"type\":\"uint32\"}],\"name\":\"PromoteStagingConfig\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"channelId\",\"type\":\"uint32\"},{\"components\":[{\"internalType\":\"bytes8\",\"name\":\"reportFormat\",\"type\":\"bytes8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint32[]\",\"name\":\"streamIDs\",\"type\":\"uint32[]\"}],\"internalType\":\"structIChannelConfigStore.ChannelDefinition\",\"name\":\"channelDefinition\",\"type\":\"tuple\"}],\"name\":\"addChannel\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"channelId\",\"type\":\"uint32\"}],\"name\":\"getChannelDefinitions\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes8\",\"name\":\"reportFormat\",\"type\":\"bytes8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint32[]\",\"name\":\"streamIDs\",\"type\":\"uint32[]\"}],\"internalType\":\"structIChannelConfigStore.ChannelDefinition\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"channelId\",\"type\":\"uint32\"}],\"name\":\"removeChannel\",\"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\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
+ Bin: "0x608060405234801561001057600080fd5b5033806000816100675760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615610097576100978161009f565b505050610148565b336001600160a01b038216036100f75760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005e565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b610f1e806101576000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637e37e7191161005b5780637e37e719146101535780638da5cb5b14610166578063f2fde38b1461018e578063f5810719146101a157600080fd5b806301ffc9a71461008d578063181f5a77146100f757806322d9780c1461013657806379ba50971461014b575b600080fd5b6100e261009b366004610816565b7fffffffff00000000000000000000000000000000000000000000000000000000167fa96f980c000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b604080518082018252601881527f4368616e6e656c436f6e66696753746f726520302e302e300000000000000000602082015290516100ee919061085f565b6101496101443660046108dd565b6101c1565b005b61014961032d565b610149610161366004610934565b61042f565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ee565b61014961019c366004610951565b61050f565b6101b46101af366004610934565b610523565b6040516100ee9190610987565b6101c9610665565b6101d66040820182610a1f565b9050600003610211576040517f4b620e2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102216040820160208301610aa4565b67ffffffffffffffff16600003610264576040517ff89d762900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102716020820182610aef565b7fffffffffffffffff000000000000000000000000000000000000000000000000166000036102cc576040517febd3ef0200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8216600090815260026020526040902081906102ed8282610ce5565b9050507fbf2cd44714205d633d3f888ac72ea66d53cd12d4c4e8723a80d9c0bc36484a548282604051610321929190610e2e565b60405180910390a15050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146103b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610437610665565b63ffffffff81166000908152600260205260408120600101549003610488576040517fd1a751e200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff8116600090815260026020526040812080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000168155906104d160018301826107dd565b505060405163ffffffff821681527f334e877e9691ecae0660510061973bebaa8b4fb37332ed6090052e630c9798619060200160405180910390a150565b610517610665565b610520816106e8565b50565b60408051606080820183526000808352602083015291810191909152333214610578576040517f74e2cd5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63ffffffff82166000908152600260209081526040918290208251606081018452815460c081901b7fffffffffffffffff00000000000000000000000000000000000000000000000016825268010000000000000000900467ffffffffffffffff16818401526001820180548551818602810186018752818152929593949386019383018282801561065557602002820191906000526020600020906000905b82829054906101000a900463ffffffff1663ffffffff16815260200190600401906020826003010492830192600103820291508084116106185790505b5050505050815250509050919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146106e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016103aa565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610767576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016103aa565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b50805460008255600701600890049060005260206000209081019061052091905b8082111561081257600081556001016107fe565b5090565b60006020828403121561082857600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461085857600080fd5b9392505050565b600060208083528351808285015260005b8181101561088c57858101830151858201604001528201610870565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b63ffffffff8116811461052057600080fd5b600080604083850312156108f057600080fd5b82356108fb816108cb565b9150602083013567ffffffffffffffff81111561091757600080fd5b83016060818603121561092957600080fd5b809150509250929050565b60006020828403121561094657600080fd5b8135610858816108cb565b60006020828403121561096357600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461085857600080fd5b60006020808352608083017fffffffffffffffff0000000000000000000000000000000000000000000000008551168285015267ffffffffffffffff82860151166040850152604085015160608086015281815180845260a0870191508483019350600092505b80831015610a1457835163ffffffff1682529284019260019290920191908401906109ee565b509695505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112610a5457600080fd5b83018035915067ffffffffffffffff821115610a6f57600080fd5b6020019150600581901b3603821315610a8757600080fd5b9250929050565b67ffffffffffffffff8116811461052057600080fd5b600060208284031215610ab657600080fd5b813561085881610a8e565b7fffffffffffffffff0000000000000000000000000000000000000000000000008116811461052057600080fd5b600060208284031215610b0157600080fd5b813561085881610ac1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b68010000000000000000821115610b5457610b54610b0c565b805482825580831015610bd9576000828152602081206007850160031c81016007840160031c82019150601c8660021b168015610bc0577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8083018054828460200360031b1c16815550505b505b81811015610bd557828155600101610bc2565b5050505b505050565b60008135610beb816108cb565b92915050565b67ffffffffffffffff831115610c0957610c09610b0c565b610c138382610b3b565b60008181526020902082908460031c60005b81811015610c7e576000805b6008811015610c7157610c60610c4687610bde565b63ffffffff908116600584901b90811b91901b1984161790565b602096909601959150600101610c31565b5083820155600101610c25565b507ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88616808703818814610cdb576000805b82811015610cd557610cc4610c4688610bde565b602097909701969150600101610cb0565b50848401555b5050505050505050565b8135610cf081610ac1565b8060c01c90508154817fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000082161783556020840135610d2d81610a8e565b6fffffffffffffffff00000000000000008160401b16837fffffffffffffffffffffffffffffffff0000000000000000000000000000000084161717845550505060408201357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1833603018112610da357600080fd5b8201803567ffffffffffffffff811115610dbc57600080fd5b6020820191508060051b3603821315610dd457600080fd5b610de2818360018601610bf1565b50505050565b8183526000602080850194508260005b85811015610e23578135610e0b816108cb565b63ffffffff1687529582019590820190600101610df8565b509495945050505050565b63ffffffff831681526040602082015260008235610e4b81610ac1565b7fffffffffffffffff0000000000000000000000000000000000000000000000001660408301526020830135610e8081610a8e565b67ffffffffffffffff8082166060850152604085013591507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1853603018212610ec857600080fd5b6020918501918201913581811115610edf57600080fd5b8060051b3603831315610ef157600080fd5b60606080860152610f0660a086018285610de8565b97965050505050505056fea164736f6c6343000813000a",
+}
+
+var ChannelConfigStoreABI = ChannelConfigStoreMetaData.ABI
+
+var ChannelConfigStoreBin = ChannelConfigStoreMetaData.Bin
+
+func DeployChannelConfigStore(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ChannelConfigStore, error) {
+ parsed, err := ChannelConfigStoreMetaData.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(ChannelConfigStoreBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &ChannelConfigStore{address: address, abi: *parsed, ChannelConfigStoreCaller: ChannelConfigStoreCaller{contract: contract}, ChannelConfigStoreTransactor: ChannelConfigStoreTransactor{contract: contract}, ChannelConfigStoreFilterer: ChannelConfigStoreFilterer{contract: contract}}, nil
+}
+
+type ChannelConfigStore struct {
+ address common.Address
+ abi abi.ABI
+ ChannelConfigStoreCaller
+ ChannelConfigStoreTransactor
+ ChannelConfigStoreFilterer
+}
+
+type ChannelConfigStoreCaller struct {
+ contract *bind.BoundContract
+}
+
+type ChannelConfigStoreTransactor struct {
+ contract *bind.BoundContract
+}
+
+type ChannelConfigStoreFilterer struct {
+ contract *bind.BoundContract
+}
+
+type ChannelConfigStoreSession struct {
+ Contract *ChannelConfigStore
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type ChannelConfigStoreCallerSession struct {
+ Contract *ChannelConfigStoreCaller
+ CallOpts bind.CallOpts
+}
+
+type ChannelConfigStoreTransactorSession struct {
+ Contract *ChannelConfigStoreTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type ChannelConfigStoreRaw struct {
+ Contract *ChannelConfigStore
+}
+
+type ChannelConfigStoreCallerRaw struct {
+ Contract *ChannelConfigStoreCaller
+}
+
+type ChannelConfigStoreTransactorRaw struct {
+ Contract *ChannelConfigStoreTransactor
+}
+
+func NewChannelConfigStore(address common.Address, backend bind.ContractBackend) (*ChannelConfigStore, error) {
+ abi, err := abi.JSON(strings.NewReader(ChannelConfigStoreABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindChannelConfigStore(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStore{address: address, abi: abi, ChannelConfigStoreCaller: ChannelConfigStoreCaller{contract: contract}, ChannelConfigStoreTransactor: ChannelConfigStoreTransactor{contract: contract}, ChannelConfigStoreFilterer: ChannelConfigStoreFilterer{contract: contract}}, nil
+}
+
+func NewChannelConfigStoreCaller(address common.Address, caller bind.ContractCaller) (*ChannelConfigStoreCaller, error) {
+ contract, err := bindChannelConfigStore(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStoreCaller{contract: contract}, nil
+}
+
+func NewChannelConfigStoreTransactor(address common.Address, transactor bind.ContractTransactor) (*ChannelConfigStoreTransactor, error) {
+ contract, err := bindChannelConfigStore(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStoreTransactor{contract: contract}, nil
+}
+
+func NewChannelConfigStoreFilterer(address common.Address, filterer bind.ContractFilterer) (*ChannelConfigStoreFilterer, error) {
+ contract, err := bindChannelConfigStore(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStoreFilterer{contract: contract}, nil
+}
+
+func bindChannelConfigStore(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := ChannelConfigStoreMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ChannelConfigStore.Contract.ChannelConfigStoreCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.ChannelConfigStoreTransactor.contract.Transfer(opts)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.ChannelConfigStoreTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ChannelConfigStore.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.contract.Transfer(opts)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCaller) GetChannelDefinitions(opts *bind.CallOpts, channelId uint32) (IChannelConfigStoreChannelDefinition, error) {
+ var out []interface{}
+ err := _ChannelConfigStore.contract.Call(opts, &out, "getChannelDefinitions", channelId)
+
+ if err != nil {
+ return *new(IChannelConfigStoreChannelDefinition), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(IChannelConfigStoreChannelDefinition)).(*IChannelConfigStoreChannelDefinition)
+
+ return out0, err
+
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreSession) GetChannelDefinitions(channelId uint32) (IChannelConfigStoreChannelDefinition, error) {
+ return _ChannelConfigStore.Contract.GetChannelDefinitions(&_ChannelConfigStore.CallOpts, channelId)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCallerSession) GetChannelDefinitions(channelId uint32) (IChannelConfigStoreChannelDefinition, error) {
+ return _ChannelConfigStore.Contract.GetChannelDefinitions(&_ChannelConfigStore.CallOpts, channelId)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _ChannelConfigStore.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 (_ChannelConfigStore *ChannelConfigStoreSession) Owner() (common.Address, error) {
+ return _ChannelConfigStore.Contract.Owner(&_ChannelConfigStore.CallOpts)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCallerSession) Owner() (common.Address, error) {
+ return _ChannelConfigStore.Contract.Owner(&_ChannelConfigStore.CallOpts)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
+ var out []interface{}
+ err := _ChannelConfigStore.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 (_ChannelConfigStore *ChannelConfigStoreSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _ChannelConfigStore.Contract.SupportsInterface(&_ChannelConfigStore.CallOpts, interfaceId)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _ChannelConfigStore.Contract.SupportsInterface(&_ChannelConfigStore.CallOpts, interfaceId)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _ChannelConfigStore.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreSession) TypeAndVersion() (string, error) {
+ return _ChannelConfigStore.Contract.TypeAndVersion(&_ChannelConfigStore.CallOpts)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreCallerSession) TypeAndVersion() (string, error) {
+ return _ChannelConfigStore.Contract.TypeAndVersion(&_ChannelConfigStore.CallOpts)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ChannelConfigStore.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreSession) AcceptOwnership() (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.AcceptOwnership(&_ChannelConfigStore.TransactOpts)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.AcceptOwnership(&_ChannelConfigStore.TransactOpts)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactor) AddChannel(opts *bind.TransactOpts, channelId uint32, channelDefinition IChannelConfigStoreChannelDefinition) (*types.Transaction, error) {
+ return _ChannelConfigStore.contract.Transact(opts, "addChannel", channelId, channelDefinition)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreSession) AddChannel(channelId uint32, channelDefinition IChannelConfigStoreChannelDefinition) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.AddChannel(&_ChannelConfigStore.TransactOpts, channelId, channelDefinition)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactorSession) AddChannel(channelId uint32, channelDefinition IChannelConfigStoreChannelDefinition) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.AddChannel(&_ChannelConfigStore.TransactOpts, channelId, channelDefinition)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactor) RemoveChannel(opts *bind.TransactOpts, channelId uint32) (*types.Transaction, error) {
+ return _ChannelConfigStore.contract.Transact(opts, "removeChannel", channelId)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreSession) RemoveChannel(channelId uint32) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.RemoveChannel(&_ChannelConfigStore.TransactOpts, channelId)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactorSession) RemoveChannel(channelId uint32) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.RemoveChannel(&_ChannelConfigStore.TransactOpts, channelId)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _ChannelConfigStore.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.TransferOwnership(&_ChannelConfigStore.TransactOpts, to)
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _ChannelConfigStore.Contract.TransferOwnership(&_ChannelConfigStore.TransactOpts, to)
+}
+
+type ChannelConfigStoreChannelDefinitionRemovedIterator struct {
+ Event *ChannelConfigStoreChannelDefinitionRemoved
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelConfigStoreChannelDefinitionRemovedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelConfigStoreChannelDefinitionRemoved)
+ 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(ChannelConfigStoreChannelDefinitionRemoved)
+ 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 *ChannelConfigStoreChannelDefinitionRemovedIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelConfigStoreChannelDefinitionRemovedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelConfigStoreChannelDefinitionRemoved struct {
+ ChannelId uint32
+ Raw types.Log
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) FilterChannelDefinitionRemoved(opts *bind.FilterOpts) (*ChannelConfigStoreChannelDefinitionRemovedIterator, error) {
+
+ logs, sub, err := _ChannelConfigStore.contract.FilterLogs(opts, "ChannelDefinitionRemoved")
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStoreChannelDefinitionRemovedIterator{contract: _ChannelConfigStore.contract, event: "ChannelDefinitionRemoved", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) WatchChannelDefinitionRemoved(opts *bind.WatchOpts, sink chan<- *ChannelConfigStoreChannelDefinitionRemoved) (event.Subscription, error) {
+
+ logs, sub, err := _ChannelConfigStore.contract.WatchLogs(opts, "ChannelDefinitionRemoved")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(ChannelConfigStoreChannelDefinitionRemoved)
+ if err := _ChannelConfigStore.contract.UnpackLog(event, "ChannelDefinitionRemoved", 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 (_ChannelConfigStore *ChannelConfigStoreFilterer) ParseChannelDefinitionRemoved(log types.Log) (*ChannelConfigStoreChannelDefinitionRemoved, error) {
+ event := new(ChannelConfigStoreChannelDefinitionRemoved)
+ if err := _ChannelConfigStore.contract.UnpackLog(event, "ChannelDefinitionRemoved", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelConfigStoreNewChannelDefinitionIterator struct {
+ Event *ChannelConfigStoreNewChannelDefinition
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelConfigStoreNewChannelDefinitionIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelConfigStoreNewChannelDefinition)
+ 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(ChannelConfigStoreNewChannelDefinition)
+ 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 *ChannelConfigStoreNewChannelDefinitionIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelConfigStoreNewChannelDefinitionIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelConfigStoreNewChannelDefinition struct {
+ ChannelId uint32
+ ChannelDefinition IChannelConfigStoreChannelDefinition
+ Raw types.Log
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) FilterNewChannelDefinition(opts *bind.FilterOpts) (*ChannelConfigStoreNewChannelDefinitionIterator, error) {
+
+ logs, sub, err := _ChannelConfigStore.contract.FilterLogs(opts, "NewChannelDefinition")
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStoreNewChannelDefinitionIterator{contract: _ChannelConfigStore.contract, event: "NewChannelDefinition", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) WatchNewChannelDefinition(opts *bind.WatchOpts, sink chan<- *ChannelConfigStoreNewChannelDefinition) (event.Subscription, error) {
+
+ logs, sub, err := _ChannelConfigStore.contract.WatchLogs(opts, "NewChannelDefinition")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(ChannelConfigStoreNewChannelDefinition)
+ if err := _ChannelConfigStore.contract.UnpackLog(event, "NewChannelDefinition", 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 (_ChannelConfigStore *ChannelConfigStoreFilterer) ParseNewChannelDefinition(log types.Log) (*ChannelConfigStoreNewChannelDefinition, error) {
+ event := new(ChannelConfigStoreNewChannelDefinition)
+ if err := _ChannelConfigStore.contract.UnpackLog(event, "NewChannelDefinition", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelConfigStoreOwnershipTransferRequestedIterator struct {
+ Event *ChannelConfigStoreOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelConfigStoreOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelConfigStoreOwnershipTransferRequested)
+ 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(ChannelConfigStoreOwnershipTransferRequested)
+ 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 *ChannelConfigStoreOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelConfigStoreOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelConfigStoreOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ChannelConfigStoreOwnershipTransferRequestedIterator, 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 := _ChannelConfigStore.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStoreOwnershipTransferRequestedIterator{contract: _ChannelConfigStore.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *ChannelConfigStoreOwnershipTransferRequested, 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 := _ChannelConfigStore.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(ChannelConfigStoreOwnershipTransferRequested)
+ if err := _ChannelConfigStore.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 (_ChannelConfigStore *ChannelConfigStoreFilterer) ParseOwnershipTransferRequested(log types.Log) (*ChannelConfigStoreOwnershipTransferRequested, error) {
+ event := new(ChannelConfigStoreOwnershipTransferRequested)
+ if err := _ChannelConfigStore.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelConfigStoreOwnershipTransferredIterator struct {
+ Event *ChannelConfigStoreOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelConfigStoreOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelConfigStoreOwnershipTransferred)
+ 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(ChannelConfigStoreOwnershipTransferred)
+ 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 *ChannelConfigStoreOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelConfigStoreOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelConfigStoreOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ChannelConfigStoreOwnershipTransferredIterator, 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 := _ChannelConfigStore.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStoreOwnershipTransferredIterator{contract: _ChannelConfigStore.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ChannelConfigStoreOwnershipTransferred, 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 := _ChannelConfigStore.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(ChannelConfigStoreOwnershipTransferred)
+ if err := _ChannelConfigStore.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 (_ChannelConfigStore *ChannelConfigStoreFilterer) ParseOwnershipTransferred(log types.Log) (*ChannelConfigStoreOwnershipTransferred, error) {
+ event := new(ChannelConfigStoreOwnershipTransferred)
+ if err := _ChannelConfigStore.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelConfigStorePromoteStagingConfigIterator struct {
+ Event *ChannelConfigStorePromoteStagingConfig
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelConfigStorePromoteStagingConfigIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelConfigStorePromoteStagingConfig)
+ 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(ChannelConfigStorePromoteStagingConfig)
+ 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 *ChannelConfigStorePromoteStagingConfigIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelConfigStorePromoteStagingConfigIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelConfigStorePromoteStagingConfig struct {
+ ChannelId uint32
+ Raw types.Log
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) FilterPromoteStagingConfig(opts *bind.FilterOpts) (*ChannelConfigStorePromoteStagingConfigIterator, error) {
+
+ logs, sub, err := _ChannelConfigStore.contract.FilterLogs(opts, "PromoteStagingConfig")
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelConfigStorePromoteStagingConfigIterator{contract: _ChannelConfigStore.contract, event: "PromoteStagingConfig", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelConfigStore *ChannelConfigStoreFilterer) WatchPromoteStagingConfig(opts *bind.WatchOpts, sink chan<- *ChannelConfigStorePromoteStagingConfig) (event.Subscription, error) {
+
+ logs, sub, err := _ChannelConfigStore.contract.WatchLogs(opts, "PromoteStagingConfig")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(ChannelConfigStorePromoteStagingConfig)
+ if err := _ChannelConfigStore.contract.UnpackLog(event, "PromoteStagingConfig", 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 (_ChannelConfigStore *ChannelConfigStoreFilterer) ParsePromoteStagingConfig(log types.Log) (*ChannelConfigStorePromoteStagingConfig, error) {
+ event := new(ChannelConfigStorePromoteStagingConfig)
+ if err := _ChannelConfigStore.contract.UnpackLog(event, "PromoteStagingConfig", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+func (_ChannelConfigStore *ChannelConfigStore) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _ChannelConfigStore.abi.Events["ChannelDefinitionRemoved"].ID:
+ return _ChannelConfigStore.ParseChannelDefinitionRemoved(log)
+ case _ChannelConfigStore.abi.Events["NewChannelDefinition"].ID:
+ return _ChannelConfigStore.ParseNewChannelDefinition(log)
+ case _ChannelConfigStore.abi.Events["OwnershipTransferRequested"].ID:
+ return _ChannelConfigStore.ParseOwnershipTransferRequested(log)
+ case _ChannelConfigStore.abi.Events["OwnershipTransferred"].ID:
+ return _ChannelConfigStore.ParseOwnershipTransferred(log)
+ case _ChannelConfigStore.abi.Events["PromoteStagingConfig"].ID:
+ return _ChannelConfigStore.ParsePromoteStagingConfig(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (ChannelConfigStoreChannelDefinitionRemoved) Topic() common.Hash {
+ return common.HexToHash("0x334e877e9691ecae0660510061973bebaa8b4fb37332ed6090052e630c979861")
+}
+
+func (ChannelConfigStoreNewChannelDefinition) Topic() common.Hash {
+ return common.HexToHash("0xbf2cd44714205d633d3f888ac72ea66d53cd12d4c4e8723a80d9c0bc36484a54")
+}
+
+func (ChannelConfigStoreOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (ChannelConfigStoreOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (ChannelConfigStorePromoteStagingConfig) Topic() common.Hash {
+ return common.HexToHash("0xbdd8ee023f9979bf23e8af6fd7241f484024e83fb0fabd11bb7fd5e9bed7308a")
+}
+
+func (_ChannelConfigStore *ChannelConfigStore) Address() common.Address {
+ return _ChannelConfigStore.address
+}
+
+type ChannelConfigStoreInterface interface {
+ GetChannelDefinitions(opts *bind.CallOpts, channelId uint32) (IChannelConfigStoreChannelDefinition, error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
+
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ AddChannel(opts *bind.TransactOpts, channelId uint32, channelDefinition IChannelConfigStoreChannelDefinition) (*types.Transaction, error)
+
+ RemoveChannel(opts *bind.TransactOpts, channelId uint32) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ FilterChannelDefinitionRemoved(opts *bind.FilterOpts) (*ChannelConfigStoreChannelDefinitionRemovedIterator, error)
+
+ WatchChannelDefinitionRemoved(opts *bind.WatchOpts, sink chan<- *ChannelConfigStoreChannelDefinitionRemoved) (event.Subscription, error)
+
+ ParseChannelDefinitionRemoved(log types.Log) (*ChannelConfigStoreChannelDefinitionRemoved, error)
+
+ FilterNewChannelDefinition(opts *bind.FilterOpts) (*ChannelConfigStoreNewChannelDefinitionIterator, error)
+
+ WatchNewChannelDefinition(opts *bind.WatchOpts, sink chan<- *ChannelConfigStoreNewChannelDefinition) (event.Subscription, error)
+
+ ParseNewChannelDefinition(log types.Log) (*ChannelConfigStoreNewChannelDefinition, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ChannelConfigStoreOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *ChannelConfigStoreOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*ChannelConfigStoreOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ChannelConfigStoreOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ChannelConfigStoreOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*ChannelConfigStoreOwnershipTransferred, error)
+
+ FilterPromoteStagingConfig(opts *bind.FilterOpts) (*ChannelConfigStorePromoteStagingConfigIterator, error)
+
+ WatchPromoteStagingConfig(opts *bind.WatchOpts, sink chan<- *ChannelConfigStorePromoteStagingConfig) (event.Subscription, error)
+
+ ParsePromoteStagingConfig(log types.Log) (*ChannelConfigStorePromoteStagingConfig, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/llo-feeds/generated/channel_verifier/channel_verifier.go b/core/gethwrappers/llo-feeds/generated/channel_verifier/channel_verifier.go
new file mode 100644
index 00000000000..104cab61040
--- /dev/null
+++ b/core/gethwrappers/llo-feeds/generated/channel_verifier/channel_verifier.go
@@ -0,0 +1,1583 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package channel_verifier
+
+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
+)
+
+type CommonAddressAndWeight struct {
+ Addr common.Address
+ Weight uint64
+}
+
+var ChannelVerifierMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifierProxyAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadVerification\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"CannotDeactivateLatestConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DigestEmpty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"DigestInactive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"DigestNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSigners\",\"type\":\"uint256\"}],\"name\":\"ExcessSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FaultToleranceMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeedIdEmpty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"InactiveFeed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedNumSigners\",\"type\":\"uint256\"}],\"name\":\"IncorrectSignatureCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSigners\",\"type\":\"uint256\"}],\"name\":\"InsufficientSigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"InvalidFeed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"rsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ssLength\",\"type\":\"uint256\"}],\"name\":\"MismatchedSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"bytes32[]\",\"name\":\"offchainTransmitters\",\"type\":\"bytes32[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"FeedActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"FeedDeactivated\",\"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\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requester\",\"type\":\"address\"}],\"name\":\"ReportVerified\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"activateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"activateFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"deactivateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"deactivateFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"offchainTransmitters\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"recipientAddressesAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sourceChainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sourceAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"newConfigCount\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"offchainTransmitters\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"recipientAddressesAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setConfigFromSource\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isVerifier\",\"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\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signedReport\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"verifierResponse\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x60a06040523480156200001157600080fd5b50604051620020ed380380620020ed8339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e95760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b608051611ef9620001f4600039600061051a0152611ef96000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063564a0a7a1161008c5780638da5cb5b116100665780638da5cb5b14610247578063afcb95d71461026f578063eb1dc803146102a4578063f2fde38b146102b757600080fd5b8063564a0a7a146101fc57806379ba50971461020f57806381ff70481461021757600080fd5b8063181f5a77116100c8578063181f5a77146101815780633d3ac1b5146101c35780633dd86430146101d657806354e68a81146101e957600080fd5b806301ffc9a7146100ef5780630d1d79af146101595780630f672ef41461016e575b600080fd5b6101446100fd3660046113d0565b7fffffffff00000000000000000000000000000000000000000000000000000000167f3d3ac1b5000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b61016c610167366004611419565b6102ca565b005b61016c61017c366004611419565b6103d0565b60408051808201909152601581527f4368616e6e656c566572696669657220302e302e30000000000000000000000060208201525b6040516101509190611496565b6101b66101d13660046114d2565b610500565b61016c6101e4366004611419565b610680565b61016c6101f7366004611866565b6106fd565b61016c61020a366004611419565b61080d565b61016c61088d565b6002546003546040805163ffffffff80851682526401000000009094049093166020840152820152606001610150565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610150565b600354600254604080516000815260208101939093526801000000000000000090910463ffffffff1690820152606001610150565b61016c6102b2366004611986565b61098a565b61016c6102c5366004611a79565b610a52565b6102d2610a63565b80610309576040517fe332262700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526005602052604081205460ff16900361035b576040517f74eb4b93000000000000000000000000000000000000000000000000000000008152600481018290526024015b60405180910390fd5b6000818152600560205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055517fa543797a0501218bba8a3daf75a71c8df8d1a7f791f4e44d40e43b6450183cea906103c59083815260200190565b60405180910390a150565b6103d8610a63565b8061040f576040517fe332262700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526005602052604081205460ff16900361045c576040517f74eb4b9300000000000000000000000000000000000000000000000000000000815260048101829052602401610352565b600354810361049a576040517f67863f4400000000000000000000000000000000000000000000000000000000815260048101829052602401610352565b6000818152600560205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055517f5bfaab86edc1b932e3c334327a591c9ded067cb521abae19b95ca927d6076579906103c59083815260200190565b60603373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610571576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080808080610583888a018a611a94565b9450945094509450945060008461059990611b6f565b60008181526004602052604090205490915060ff16156105e8576040517f36dbe74800000000000000000000000000000000000000000000000000000000815260048101829052602401610352565b8551600081815260056020526040902061060482878784610ae6565b61060f886002610bda565b86516020880120610624818a89898987610c42565b60405173ffffffffffffffffffffffffffffffffffffffff8c16815284907f58ca9502e98a536e06e72d680fcc251e5d10b72291a281665a2c2dc0ac30fcc59060200160405180910390a250959b9a5050505050505050505050565b610688610a63565b60008181526004602052604090205460ff166106fa5760008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555182917ff438564f793525caa89c6e3a26d41e16aa39d1e589747595751e3f3df75cb2b491a25b50565b86518560ff168060000361073d576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f821115610782576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101839052601f6024820152604401610352565b61078d816003611c12565b82116107e5578161079f826003611c12565b6107aa906001611c2f565b6040517f9dd9e6d800000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610352565b6107ed610a63565b6107ff8c8c8c8c8c8c8c8c8c8c610ebe565b505050505050505050505050565b610815610a63565b60008181526004602052604090205460ff16156106fa5760008181526004602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555182917ffc4f79b8c65b6be1773063461984c0974400d1e99654c79477a092ace83fd06191a250565b60015473ffffffffffffffffffffffffffffffffffffffff16331461090e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610352565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b86518560ff16806000036109ca576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f821115610a0f576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101839052601f6024820152604401610352565b610a1a816003611c12565b8211610a2c578161079f826003611c12565b610a34610a63565b610a47463060008c8c8c8c8c8c8c610ebe565b505050505050505050565b610a5a610a63565b6106fa81611230565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ae4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610352565b565b8054600090610af99060ff166001611c42565b8254909150610100900460ff16610b3f576040517fd990d62100000000000000000000000000000000000000000000000000000000815260048101869052602401610352565b8060ff16845114610b8b5783516040517f5348a282000000000000000000000000000000000000000000000000000000008152600481019190915260ff82166024820152604401610352565b8251845114610bd357835183516040517ff0d3140800000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610352565b5050505050565b6020820151815463ffffffff600883901c81169168010000000000000000900416811115610c3c5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff166801000000000000000063ffffffff8316021783555b50505050565b60008686604051602001610c57929190611c5b565b6040516020818303038152906040528051906020012090506000610c8b604080518082019091526000808252602082015290565b8651600090815b81811015610e5657600186898360208110610caf57610caf611bb4565b610cbc91901a601b611c42565b8c8481518110610cce57610cce611bb4565b60200260200101518c8581518110610ce857610ce8611bb4565b602002602001015160405160008152602001604052604051610d26949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610d48573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526001808d01602090815291859020848601909552845460ff808216865293995093955090850192610100900490911690811115610dcd57610dcd611c97565b6001811115610dde57610dde611c97565b9052509350600184602001516001811115610dfb57610dfb611c97565b14610e32576040517f4df18f0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000015160080260ff166001901b8501945080610e4f90611cc6565b9050610c92565b50837e01010101010101010101010101010101010101010101010101010101010101851614610eb1576040517f4df18f0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b63ffffffff881615610eff57600280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8a16179055610f35565b6002805463ffffffff16906000610f1583611cfe565b91906101000a81548163ffffffff021916908363ffffffff160217905550505b600254600090610f54908c908c9063ffffffff168b8b8b8b8b8b611325565b600081815260056020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8a16176101001790559091505b88518160ff16101561118f576000898260ff1681518110610fb857610fb8611bb4565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611028576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452600190810190925290912054610100900460ff169081111561107957611079611c97565b14801591506110b4576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff841681526020810160019052600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684526001908101835292208351815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681178355928501519193919284927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216179061010090849081111561117457611174611c97565b021790555090505050508061118890611d21565b9050610f95565b506002546040517f1074b4b9a073f79bd1f7f5c808348125ce0f25c27188df7efcaa7a08276051b3916111e29163ffffffff640100000000830481169286929116908d908d908d908d908d908d90611dc1565b60405180910390a1600280547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff1664010000000063ffffffff43160217905560035550505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036112af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610352565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000808a8a8a8a8a8a8a8a8a60405160200161134999989796959493929190611e57565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e09000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6000602082840312156113e257600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461141257600080fd5b9392505050565b60006020828403121561142b57600080fd5b5035919050565b6000815180845260005b818110156114585760208185018101518683018201520161143c565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006114126020830184611432565b803573ffffffffffffffffffffffffffffffffffffffff811681146114cd57600080fd5b919050565b6000806000604084860312156114e757600080fd5b833567ffffffffffffffff808211156114ff57600080fd5b818601915086601f83011261151357600080fd5b81358181111561152257600080fd5b87602082850101111561153457600080fd5b60209283019550935061154a91860190506114a9565b90509250925092565b803563ffffffff811681146114cd57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156115b9576115b9611567565b60405290565b6040516060810167ffffffffffffffff811182821017156115b9576115b9611567565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561162957611629611567565b604052919050565b600067ffffffffffffffff82111561164b5761164b611567565b5060051b60200190565b600082601f83011261166657600080fd5b8135602061167b61167683611631565b6115e2565b82815260059290921b8401810191818101908684111561169a57600080fd5b8286015b848110156116bc576116af816114a9565b835291830191830161169e565b509695505050505050565b600082601f8301126116d857600080fd5b813560206116e861167683611631565b82815260059290921b8401810191818101908684111561170757600080fd5b8286015b848110156116bc578035835291830191830161170b565b803560ff811681146114cd57600080fd5b600082601f83011261174457600080fd5b813567ffffffffffffffff81111561175e5761175e611567565b61178f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016115e2565b8181528460208386010111156117a457600080fd5b816020850160208301376000918101602001919091529392505050565b803567ffffffffffffffff811681146114cd57600080fd5b600082601f8301126117ea57600080fd5b813560206117fa61167683611631565b82815260069290921b8401810191818101908684111561181957600080fd5b8286015b848110156116bc57604081890312156118365760008081fd5b61183e611596565b611847826114a9565b81526118548583016117c1565b8186015283529183019160400161181d565b6000806000806000806000806000806101408b8d03121561188657600080fd5b8a35995061189660208c016114a9565b98506118a460408c01611553565b975060608b013567ffffffffffffffff808211156118c157600080fd5b6118cd8e838f01611655565b985060808d01359150808211156118e357600080fd5b6118ef8e838f016116c7565b97506118fd60a08e01611722565b965060c08d013591508082111561191357600080fd5b61191f8e838f01611733565b955061192d60e08e016117c1565b94506101008d013591508082111561194457600080fd5b6119508e838f01611733565b93506101208d013591508082111561196757600080fd5b506119748d828e016117d9565b9150509295989b9194979a5092959850565b600080600080600080600060e0888a0312156119a157600080fd5b873567ffffffffffffffff808211156119b957600080fd5b6119c58b838c01611655565b985060208a01359150808211156119db57600080fd5b6119e78b838c016116c7565b97506119f560408b01611722565b965060608a0135915080821115611a0b57600080fd5b611a178b838c01611733565b9550611a2560808b016117c1565b945060a08a0135915080821115611a3b57600080fd5b611a478b838c01611733565b935060c08a0135915080821115611a5d57600080fd5b50611a6a8a828b016117d9565b91505092959891949750929550565b600060208284031215611a8b57600080fd5b611412826114a9565b600080600080600060e08688031215611aac57600080fd5b86601f870112611abb57600080fd5b611ac36115bf565b806060880189811115611ad557600080fd5b885b81811015611aef578035845260209384019301611ad7565b5090965035905067ffffffffffffffff80821115611b0c57600080fd5b611b1889838a01611733565b95506080880135915080821115611b2e57600080fd5b611b3a89838a016116c7565b945060a0880135915080821115611b5057600080fd5b50611b5d888289016116c7565b9598949750929560c001359392505050565b80516020808301519190811015611bae577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417611c2957611c29611be3565b92915050565b80820180821115611c2957611c29611be3565b60ff8181168382160190811115611c2957611c29611be3565b828152600060208083018460005b6003811015611c8657815183529183019190830190600101611c69565b505050506080820190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611cf757611cf7611be3565b5060010190565b600063ffffffff808316818103611d1757611d17611be3565b6001019392505050565b600060ff821660ff8103611d3757611d37611be3565b60010192915050565b600081518084526020808501945080840160005b83811015611d8657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101611d54565b509495945050505050565b600081518084526020808501945080840160005b83811015611d8657815187529582019590820190600101611da5565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152611df18184018a611d40565b90508281036080840152611e058189611d91565b905060ff871660a084015282810360c0840152611e228187611432565b905067ffffffffffffffff851660e0840152828103610100840152611e478185611432565b9c9b505050505050505050505050565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152611e9e8285018b611d40565b91508382036080850152611eb2828a611d91565b915060ff881660a085015283820360c0850152611ecf8288611432565b90861660e08501528381036101008501529050611e47818561143256fea164736f6c6343000813000a",
+}
+
+var ChannelVerifierABI = ChannelVerifierMetaData.ABI
+
+var ChannelVerifierBin = ChannelVerifierMetaData.Bin
+
+func DeployChannelVerifier(auth *bind.TransactOpts, backend bind.ContractBackend, verifierProxyAddr common.Address) (common.Address, *types.Transaction, *ChannelVerifier, error) {
+ parsed, err := ChannelVerifierMetaData.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(ChannelVerifierBin), backend, verifierProxyAddr)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &ChannelVerifier{address: address, abi: *parsed, ChannelVerifierCaller: ChannelVerifierCaller{contract: contract}, ChannelVerifierTransactor: ChannelVerifierTransactor{contract: contract}, ChannelVerifierFilterer: ChannelVerifierFilterer{contract: contract}}, nil
+}
+
+type ChannelVerifier struct {
+ address common.Address
+ abi abi.ABI
+ ChannelVerifierCaller
+ ChannelVerifierTransactor
+ ChannelVerifierFilterer
+}
+
+type ChannelVerifierCaller struct {
+ contract *bind.BoundContract
+}
+
+type ChannelVerifierTransactor struct {
+ contract *bind.BoundContract
+}
+
+type ChannelVerifierFilterer struct {
+ contract *bind.BoundContract
+}
+
+type ChannelVerifierSession struct {
+ Contract *ChannelVerifier
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type ChannelVerifierCallerSession struct {
+ Contract *ChannelVerifierCaller
+ CallOpts bind.CallOpts
+}
+
+type ChannelVerifierTransactorSession struct {
+ Contract *ChannelVerifierTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type ChannelVerifierRaw struct {
+ Contract *ChannelVerifier
+}
+
+type ChannelVerifierCallerRaw struct {
+ Contract *ChannelVerifierCaller
+}
+
+type ChannelVerifierTransactorRaw struct {
+ Contract *ChannelVerifierTransactor
+}
+
+func NewChannelVerifier(address common.Address, backend bind.ContractBackend) (*ChannelVerifier, error) {
+ abi, err := abi.JSON(strings.NewReader(ChannelVerifierABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindChannelVerifier(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifier{address: address, abi: abi, ChannelVerifierCaller: ChannelVerifierCaller{contract: contract}, ChannelVerifierTransactor: ChannelVerifierTransactor{contract: contract}, ChannelVerifierFilterer: ChannelVerifierFilterer{contract: contract}}, nil
+}
+
+func NewChannelVerifierCaller(address common.Address, caller bind.ContractCaller) (*ChannelVerifierCaller, error) {
+ contract, err := bindChannelVerifier(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierCaller{contract: contract}, nil
+}
+
+func NewChannelVerifierTransactor(address common.Address, transactor bind.ContractTransactor) (*ChannelVerifierTransactor, error) {
+ contract, err := bindChannelVerifier(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierTransactor{contract: contract}, nil
+}
+
+func NewChannelVerifierFilterer(address common.Address, filterer bind.ContractFilterer) (*ChannelVerifierFilterer, error) {
+ contract, err := bindChannelVerifier(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierFilterer{contract: contract}, nil
+}
+
+func bindChannelVerifier(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := ChannelVerifierMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_ChannelVerifier *ChannelVerifierRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ChannelVerifier.Contract.ChannelVerifierCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_ChannelVerifier *ChannelVerifierRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.ChannelVerifierTransactor.contract.Transfer(opts)
+}
+
+func (_ChannelVerifier *ChannelVerifierRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.ChannelVerifierTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_ChannelVerifier *ChannelVerifierCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ChannelVerifier.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.contract.Transfer(opts)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_ChannelVerifier *ChannelVerifierCaller) LatestConfigDetails(opts *bind.CallOpts) (LatestConfigDetails,
+
+ error) {
+ var out []interface{}
+ err := _ChannelVerifier.contract.Call(opts, &out, "latestConfigDetails")
+
+ outstruct := new(LatestConfigDetails)
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.ConfigCount = *abi.ConvertType(out[0], new(uint32)).(*uint32)
+ outstruct.BlockNumber = *abi.ConvertType(out[1], new(uint32)).(*uint32)
+ outstruct.ConfigDigest = *abi.ConvertType(out[2], new([32]byte)).(*[32]byte)
+
+ return *outstruct, err
+
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) LatestConfigDetails() (LatestConfigDetails,
+
+ error) {
+ return _ChannelVerifier.Contract.LatestConfigDetails(&_ChannelVerifier.CallOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierCallerSession) LatestConfigDetails() (LatestConfigDetails,
+
+ error) {
+ return _ChannelVerifier.Contract.LatestConfigDetails(&_ChannelVerifier.CallOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierCaller) LatestConfigDigestAndEpoch(opts *bind.CallOpts) (LatestConfigDigestAndEpoch,
+
+ error) {
+ var out []interface{}
+ err := _ChannelVerifier.contract.Call(opts, &out, "latestConfigDigestAndEpoch")
+
+ outstruct := new(LatestConfigDigestAndEpoch)
+ if err != nil {
+ return *outstruct, err
+ }
+
+ outstruct.ScanLogs = *abi.ConvertType(out[0], new(bool)).(*bool)
+ outstruct.ConfigDigest = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte)
+ outstruct.Epoch = *abi.ConvertType(out[2], new(uint32)).(*uint32)
+
+ return *outstruct, err
+
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) LatestConfigDigestAndEpoch() (LatestConfigDigestAndEpoch,
+
+ error) {
+ return _ChannelVerifier.Contract.LatestConfigDigestAndEpoch(&_ChannelVerifier.CallOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierCallerSession) LatestConfigDigestAndEpoch() (LatestConfigDigestAndEpoch,
+
+ error) {
+ return _ChannelVerifier.Contract.LatestConfigDigestAndEpoch(&_ChannelVerifier.CallOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _ChannelVerifier.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 (_ChannelVerifier *ChannelVerifierSession) Owner() (common.Address, error) {
+ return _ChannelVerifier.Contract.Owner(&_ChannelVerifier.CallOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierCallerSession) Owner() (common.Address, error) {
+ return _ChannelVerifier.Contract.Owner(&_ChannelVerifier.CallOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) {
+ var out []interface{}
+ err := _ChannelVerifier.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 (_ChannelVerifier *ChannelVerifierSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _ChannelVerifier.Contract.SupportsInterface(&_ChannelVerifier.CallOpts, interfaceId)
+}
+
+func (_ChannelVerifier *ChannelVerifierCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) {
+ return _ChannelVerifier.Contract.SupportsInterface(&_ChannelVerifier.CallOpts, interfaceId)
+}
+
+func (_ChannelVerifier *ChannelVerifierCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _ChannelVerifier.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) TypeAndVersion() (string, error) {
+ return _ChannelVerifier.Contract.TypeAndVersion(&_ChannelVerifier.CallOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierCallerSession) TypeAndVersion() (string, error) {
+ return _ChannelVerifier.Contract.TypeAndVersion(&_ChannelVerifier.CallOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "acceptOwnership")
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) AcceptOwnership() (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.AcceptOwnership(&_ChannelVerifier.TransactOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) AcceptOwnership() (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.AcceptOwnership(&_ChannelVerifier.TransactOpts)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) ActivateConfig(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "activateConfig", configDigest)
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) ActivateConfig(configDigest [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.ActivateConfig(&_ChannelVerifier.TransactOpts, configDigest)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) ActivateConfig(configDigest [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.ActivateConfig(&_ChannelVerifier.TransactOpts, configDigest)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) ActivateFeed(opts *bind.TransactOpts, feedId [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "activateFeed", feedId)
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) ActivateFeed(feedId [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.ActivateFeed(&_ChannelVerifier.TransactOpts, feedId)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) ActivateFeed(feedId [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.ActivateFeed(&_ChannelVerifier.TransactOpts, feedId)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) DeactivateConfig(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "deactivateConfig", configDigest)
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) DeactivateConfig(configDigest [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.DeactivateConfig(&_ChannelVerifier.TransactOpts, configDigest)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) DeactivateConfig(configDigest [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.DeactivateConfig(&_ChannelVerifier.TransactOpts, configDigest)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) DeactivateFeed(opts *bind.TransactOpts, feedId [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "deactivateFeed", feedId)
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) DeactivateFeed(feedId [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.DeactivateFeed(&_ChannelVerifier.TransactOpts, feedId)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) DeactivateFeed(feedId [32]byte) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.DeactivateFeed(&_ChannelVerifier.TransactOpts, feedId)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) SetConfig(opts *bind.TransactOpts, signers []common.Address, offchainTransmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, recipientAddressesAndWeights []CommonAddressAndWeight) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "setConfig", signers, offchainTransmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, recipientAddressesAndWeights)
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) SetConfig(signers []common.Address, offchainTransmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, recipientAddressesAndWeights []CommonAddressAndWeight) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.SetConfig(&_ChannelVerifier.TransactOpts, signers, offchainTransmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, recipientAddressesAndWeights)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) SetConfig(signers []common.Address, offchainTransmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, recipientAddressesAndWeights []CommonAddressAndWeight) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.SetConfig(&_ChannelVerifier.TransactOpts, signers, offchainTransmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, recipientAddressesAndWeights)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) SetConfigFromSource(opts *bind.TransactOpts, sourceChainId *big.Int, sourceAddress common.Address, newConfigCount uint32, signers []common.Address, offchainTransmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, recipientAddressesAndWeights []CommonAddressAndWeight) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "setConfigFromSource", sourceChainId, sourceAddress, newConfigCount, signers, offchainTransmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, recipientAddressesAndWeights)
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) SetConfigFromSource(sourceChainId *big.Int, sourceAddress common.Address, newConfigCount uint32, signers []common.Address, offchainTransmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, recipientAddressesAndWeights []CommonAddressAndWeight) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.SetConfigFromSource(&_ChannelVerifier.TransactOpts, sourceChainId, sourceAddress, newConfigCount, signers, offchainTransmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, recipientAddressesAndWeights)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) SetConfigFromSource(sourceChainId *big.Int, sourceAddress common.Address, newConfigCount uint32, signers []common.Address, offchainTransmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, recipientAddressesAndWeights []CommonAddressAndWeight) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.SetConfigFromSource(&_ChannelVerifier.TransactOpts, sourceChainId, sourceAddress, newConfigCount, signers, offchainTransmitters, f, onchainConfig, offchainConfigVersion, offchainConfig, recipientAddressesAndWeights)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "transferOwnership", to)
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.TransferOwnership(&_ChannelVerifier.TransactOpts, to)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.TransferOwnership(&_ChannelVerifier.TransactOpts, to)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactor) Verify(opts *bind.TransactOpts, signedReport []byte, sender common.Address) (*types.Transaction, error) {
+ return _ChannelVerifier.contract.Transact(opts, "verify", signedReport, sender)
+}
+
+func (_ChannelVerifier *ChannelVerifierSession) Verify(signedReport []byte, sender common.Address) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.Verify(&_ChannelVerifier.TransactOpts, signedReport, sender)
+}
+
+func (_ChannelVerifier *ChannelVerifierTransactorSession) Verify(signedReport []byte, sender common.Address) (*types.Transaction, error) {
+ return _ChannelVerifier.Contract.Verify(&_ChannelVerifier.TransactOpts, signedReport, sender)
+}
+
+type ChannelVerifierConfigActivatedIterator struct {
+ Event *ChannelVerifierConfigActivated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelVerifierConfigActivatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelVerifierConfigActivated)
+ 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(ChannelVerifierConfigActivated)
+ 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 *ChannelVerifierConfigActivatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelVerifierConfigActivatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelVerifierConfigActivated struct {
+ ConfigDigest [32]byte
+ Raw types.Log
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) FilterConfigActivated(opts *bind.FilterOpts) (*ChannelVerifierConfigActivatedIterator, error) {
+
+ logs, sub, err := _ChannelVerifier.contract.FilterLogs(opts, "ConfigActivated")
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierConfigActivatedIterator{contract: _ChannelVerifier.contract, event: "ConfigActivated", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) WatchConfigActivated(opts *bind.WatchOpts, sink chan<- *ChannelVerifierConfigActivated) (event.Subscription, error) {
+
+ logs, sub, err := _ChannelVerifier.contract.WatchLogs(opts, "ConfigActivated")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(ChannelVerifierConfigActivated)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "ConfigActivated", 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 (_ChannelVerifier *ChannelVerifierFilterer) ParseConfigActivated(log types.Log) (*ChannelVerifierConfigActivated, error) {
+ event := new(ChannelVerifierConfigActivated)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "ConfigActivated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelVerifierConfigDeactivatedIterator struct {
+ Event *ChannelVerifierConfigDeactivated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelVerifierConfigDeactivatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelVerifierConfigDeactivated)
+ 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(ChannelVerifierConfigDeactivated)
+ 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 *ChannelVerifierConfigDeactivatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelVerifierConfigDeactivatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelVerifierConfigDeactivated struct {
+ ConfigDigest [32]byte
+ Raw types.Log
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) FilterConfigDeactivated(opts *bind.FilterOpts) (*ChannelVerifierConfigDeactivatedIterator, error) {
+
+ logs, sub, err := _ChannelVerifier.contract.FilterLogs(opts, "ConfigDeactivated")
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierConfigDeactivatedIterator{contract: _ChannelVerifier.contract, event: "ConfigDeactivated", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) WatchConfigDeactivated(opts *bind.WatchOpts, sink chan<- *ChannelVerifierConfigDeactivated) (event.Subscription, error) {
+
+ logs, sub, err := _ChannelVerifier.contract.WatchLogs(opts, "ConfigDeactivated")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(ChannelVerifierConfigDeactivated)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "ConfigDeactivated", 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 (_ChannelVerifier *ChannelVerifierFilterer) ParseConfigDeactivated(log types.Log) (*ChannelVerifierConfigDeactivated, error) {
+ event := new(ChannelVerifierConfigDeactivated)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "ConfigDeactivated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelVerifierConfigSetIterator struct {
+ Event *ChannelVerifierConfigSet
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelVerifierConfigSetIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelVerifierConfigSet)
+ 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(ChannelVerifierConfigSet)
+ 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 *ChannelVerifierConfigSetIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelVerifierConfigSetIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelVerifierConfigSet struct {
+ PreviousConfigBlockNumber uint32
+ ConfigDigest [32]byte
+ ConfigCount uint64
+ Signers []common.Address
+ OffchainTransmitters [][32]byte
+ F uint8
+ OnchainConfig []byte
+ OffchainConfigVersion uint64
+ OffchainConfig []byte
+ Raw types.Log
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) FilterConfigSet(opts *bind.FilterOpts) (*ChannelVerifierConfigSetIterator, error) {
+
+ logs, sub, err := _ChannelVerifier.contract.FilterLogs(opts, "ConfigSet")
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierConfigSetIterator{contract: _ChannelVerifier.contract, event: "ConfigSet", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) WatchConfigSet(opts *bind.WatchOpts, sink chan<- *ChannelVerifierConfigSet) (event.Subscription, error) {
+
+ logs, sub, err := _ChannelVerifier.contract.WatchLogs(opts, "ConfigSet")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(ChannelVerifierConfigSet)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "ConfigSet", 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 (_ChannelVerifier *ChannelVerifierFilterer) ParseConfigSet(log types.Log) (*ChannelVerifierConfigSet, error) {
+ event := new(ChannelVerifierConfigSet)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "ConfigSet", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelVerifierFeedActivatedIterator struct {
+ Event *ChannelVerifierFeedActivated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelVerifierFeedActivatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelVerifierFeedActivated)
+ 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(ChannelVerifierFeedActivated)
+ 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 *ChannelVerifierFeedActivatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelVerifierFeedActivatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelVerifierFeedActivated struct {
+ FeedId [32]byte
+ Raw types.Log
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) FilterFeedActivated(opts *bind.FilterOpts, feedId [][32]byte) (*ChannelVerifierFeedActivatedIterator, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _ChannelVerifier.contract.FilterLogs(opts, "FeedActivated", feedIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierFeedActivatedIterator{contract: _ChannelVerifier.contract, event: "FeedActivated", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) WatchFeedActivated(opts *bind.WatchOpts, sink chan<- *ChannelVerifierFeedActivated, feedId [][32]byte) (event.Subscription, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _ChannelVerifier.contract.WatchLogs(opts, "FeedActivated", 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(ChannelVerifierFeedActivated)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "FeedActivated", 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 (_ChannelVerifier *ChannelVerifierFilterer) ParseFeedActivated(log types.Log) (*ChannelVerifierFeedActivated, error) {
+ event := new(ChannelVerifierFeedActivated)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "FeedActivated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelVerifierFeedDeactivatedIterator struct {
+ Event *ChannelVerifierFeedDeactivated
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelVerifierFeedDeactivatedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelVerifierFeedDeactivated)
+ 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(ChannelVerifierFeedDeactivated)
+ 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 *ChannelVerifierFeedDeactivatedIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelVerifierFeedDeactivatedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelVerifierFeedDeactivated struct {
+ FeedId [32]byte
+ Raw types.Log
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) FilterFeedDeactivated(opts *bind.FilterOpts, feedId [][32]byte) (*ChannelVerifierFeedDeactivatedIterator, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _ChannelVerifier.contract.FilterLogs(opts, "FeedDeactivated", feedIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierFeedDeactivatedIterator{contract: _ChannelVerifier.contract, event: "FeedDeactivated", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) WatchFeedDeactivated(opts *bind.WatchOpts, sink chan<- *ChannelVerifierFeedDeactivated, feedId [][32]byte) (event.Subscription, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _ChannelVerifier.contract.WatchLogs(opts, "FeedDeactivated", 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(ChannelVerifierFeedDeactivated)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "FeedDeactivated", 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 (_ChannelVerifier *ChannelVerifierFilterer) ParseFeedDeactivated(log types.Log) (*ChannelVerifierFeedDeactivated, error) {
+ event := new(ChannelVerifierFeedDeactivated)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "FeedDeactivated", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelVerifierOwnershipTransferRequestedIterator struct {
+ Event *ChannelVerifierOwnershipTransferRequested
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelVerifierOwnershipTransferRequestedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelVerifierOwnershipTransferRequested)
+ 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(ChannelVerifierOwnershipTransferRequested)
+ 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 *ChannelVerifierOwnershipTransferRequestedIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelVerifierOwnershipTransferRequestedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelVerifierOwnershipTransferRequested struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ChannelVerifierOwnershipTransferRequestedIterator, 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 := _ChannelVerifier.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierOwnershipTransferRequestedIterator{contract: _ChannelVerifier.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *ChannelVerifierOwnershipTransferRequested, 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 := _ChannelVerifier.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(ChannelVerifierOwnershipTransferRequested)
+ if err := _ChannelVerifier.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 (_ChannelVerifier *ChannelVerifierFilterer) ParseOwnershipTransferRequested(log types.Log) (*ChannelVerifierOwnershipTransferRequested, error) {
+ event := new(ChannelVerifierOwnershipTransferRequested)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelVerifierOwnershipTransferredIterator struct {
+ Event *ChannelVerifierOwnershipTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelVerifierOwnershipTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelVerifierOwnershipTransferred)
+ 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(ChannelVerifierOwnershipTransferred)
+ 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 *ChannelVerifierOwnershipTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelVerifierOwnershipTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelVerifierOwnershipTransferred struct {
+ From common.Address
+ To common.Address
+ Raw types.Log
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ChannelVerifierOwnershipTransferredIterator, 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 := _ChannelVerifier.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierOwnershipTransferredIterator{contract: _ChannelVerifier.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ChannelVerifierOwnershipTransferred, 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 := _ChannelVerifier.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(ChannelVerifierOwnershipTransferred)
+ if err := _ChannelVerifier.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 (_ChannelVerifier *ChannelVerifierFilterer) ParseOwnershipTransferred(log types.Log) (*ChannelVerifierOwnershipTransferred, error) {
+ event := new(ChannelVerifierOwnershipTransferred)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type ChannelVerifierReportVerifiedIterator struct {
+ Event *ChannelVerifierReportVerified
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *ChannelVerifierReportVerifiedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(ChannelVerifierReportVerified)
+ 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(ChannelVerifierReportVerified)
+ 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 *ChannelVerifierReportVerifiedIterator) Error() error {
+ return it.fail
+}
+
+func (it *ChannelVerifierReportVerifiedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type ChannelVerifierReportVerified struct {
+ FeedId [32]byte
+ Requester common.Address
+ Raw types.Log
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) FilterReportVerified(opts *bind.FilterOpts, feedId [][32]byte) (*ChannelVerifierReportVerifiedIterator, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _ChannelVerifier.contract.FilterLogs(opts, "ReportVerified", feedIdRule)
+ if err != nil {
+ return nil, err
+ }
+ return &ChannelVerifierReportVerifiedIterator{contract: _ChannelVerifier.contract, event: "ReportVerified", logs: logs, sub: sub}, nil
+}
+
+func (_ChannelVerifier *ChannelVerifierFilterer) WatchReportVerified(opts *bind.WatchOpts, sink chan<- *ChannelVerifierReportVerified, feedId [][32]byte) (event.Subscription, error) {
+
+ var feedIdRule []interface{}
+ for _, feedIdItem := range feedId {
+ feedIdRule = append(feedIdRule, feedIdItem)
+ }
+
+ logs, sub, err := _ChannelVerifier.contract.WatchLogs(opts, "ReportVerified", 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(ChannelVerifierReportVerified)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "ReportVerified", 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 (_ChannelVerifier *ChannelVerifierFilterer) ParseReportVerified(log types.Log) (*ChannelVerifierReportVerified, error) {
+ event := new(ChannelVerifierReportVerified)
+ if err := _ChannelVerifier.contract.UnpackLog(event, "ReportVerified", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
+type LatestConfigDetails struct {
+ ConfigCount uint32
+ BlockNumber uint32
+ ConfigDigest [32]byte
+}
+type LatestConfigDigestAndEpoch struct {
+ ScanLogs bool
+ ConfigDigest [32]byte
+ Epoch uint32
+}
+
+func (_ChannelVerifier *ChannelVerifier) ParseLog(log types.Log) (generated.AbigenLog, error) {
+ switch log.Topics[0] {
+ case _ChannelVerifier.abi.Events["ConfigActivated"].ID:
+ return _ChannelVerifier.ParseConfigActivated(log)
+ case _ChannelVerifier.abi.Events["ConfigDeactivated"].ID:
+ return _ChannelVerifier.ParseConfigDeactivated(log)
+ case _ChannelVerifier.abi.Events["ConfigSet"].ID:
+ return _ChannelVerifier.ParseConfigSet(log)
+ case _ChannelVerifier.abi.Events["FeedActivated"].ID:
+ return _ChannelVerifier.ParseFeedActivated(log)
+ case _ChannelVerifier.abi.Events["FeedDeactivated"].ID:
+ return _ChannelVerifier.ParseFeedDeactivated(log)
+ case _ChannelVerifier.abi.Events["OwnershipTransferRequested"].ID:
+ return _ChannelVerifier.ParseOwnershipTransferRequested(log)
+ case _ChannelVerifier.abi.Events["OwnershipTransferred"].ID:
+ return _ChannelVerifier.ParseOwnershipTransferred(log)
+ case _ChannelVerifier.abi.Events["ReportVerified"].ID:
+ return _ChannelVerifier.ParseReportVerified(log)
+
+ default:
+ return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0])
+ }
+}
+
+func (ChannelVerifierConfigActivated) Topic() common.Hash {
+ return common.HexToHash("0xa543797a0501218bba8a3daf75a71c8df8d1a7f791f4e44d40e43b6450183cea")
+}
+
+func (ChannelVerifierConfigDeactivated) Topic() common.Hash {
+ return common.HexToHash("0x5bfaab86edc1b932e3c334327a591c9ded067cb521abae19b95ca927d6076579")
+}
+
+func (ChannelVerifierConfigSet) Topic() common.Hash {
+ return common.HexToHash("0x1074b4b9a073f79bd1f7f5c808348125ce0f25c27188df7efcaa7a08276051b3")
+}
+
+func (ChannelVerifierFeedActivated) Topic() common.Hash {
+ return common.HexToHash("0xf438564f793525caa89c6e3a26d41e16aa39d1e589747595751e3f3df75cb2b4")
+}
+
+func (ChannelVerifierFeedDeactivated) Topic() common.Hash {
+ return common.HexToHash("0xfc4f79b8c65b6be1773063461984c0974400d1e99654c79477a092ace83fd061")
+}
+
+func (ChannelVerifierOwnershipTransferRequested) Topic() common.Hash {
+ return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278")
+}
+
+func (ChannelVerifierOwnershipTransferred) Topic() common.Hash {
+ return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0")
+}
+
+func (ChannelVerifierReportVerified) Topic() common.Hash {
+ return common.HexToHash("0x58ca9502e98a536e06e72d680fcc251e5d10b72291a281665a2c2dc0ac30fcc5")
+}
+
+func (_ChannelVerifier *ChannelVerifier) Address() common.Address {
+ return _ChannelVerifier.address
+}
+
+type ChannelVerifierInterface interface {
+ LatestConfigDetails(opts *bind.CallOpts) (LatestConfigDetails,
+
+ error)
+
+ LatestConfigDigestAndEpoch(opts *bind.CallOpts) (LatestConfigDigestAndEpoch,
+
+ error)
+
+ Owner(opts *bind.CallOpts) (common.Address, error)
+
+ SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error)
+
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
+ AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
+
+ ActivateConfig(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error)
+
+ ActivateFeed(opts *bind.TransactOpts, feedId [32]byte) (*types.Transaction, error)
+
+ DeactivateConfig(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error)
+
+ DeactivateFeed(opts *bind.TransactOpts, feedId [32]byte) (*types.Transaction, error)
+
+ SetConfig(opts *bind.TransactOpts, signers []common.Address, offchainTransmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, recipientAddressesAndWeights []CommonAddressAndWeight) (*types.Transaction, error)
+
+ SetConfigFromSource(opts *bind.TransactOpts, sourceChainId *big.Int, sourceAddress common.Address, newConfigCount uint32, signers []common.Address, offchainTransmitters [][32]byte, f uint8, onchainConfig []byte, offchainConfigVersion uint64, offchainConfig []byte, recipientAddressesAndWeights []CommonAddressAndWeight) (*types.Transaction, error)
+
+ TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+
+ Verify(opts *bind.TransactOpts, signedReport []byte, sender common.Address) (*types.Transaction, error)
+
+ FilterConfigActivated(opts *bind.FilterOpts) (*ChannelVerifierConfigActivatedIterator, error)
+
+ WatchConfigActivated(opts *bind.WatchOpts, sink chan<- *ChannelVerifierConfigActivated) (event.Subscription, error)
+
+ ParseConfigActivated(log types.Log) (*ChannelVerifierConfigActivated, error)
+
+ FilterConfigDeactivated(opts *bind.FilterOpts) (*ChannelVerifierConfigDeactivatedIterator, error)
+
+ WatchConfigDeactivated(opts *bind.WatchOpts, sink chan<- *ChannelVerifierConfigDeactivated) (event.Subscription, error)
+
+ ParseConfigDeactivated(log types.Log) (*ChannelVerifierConfigDeactivated, error)
+
+ FilterConfigSet(opts *bind.FilterOpts) (*ChannelVerifierConfigSetIterator, error)
+
+ WatchConfigSet(opts *bind.WatchOpts, sink chan<- *ChannelVerifierConfigSet) (event.Subscription, error)
+
+ ParseConfigSet(log types.Log) (*ChannelVerifierConfigSet, error)
+
+ FilterFeedActivated(opts *bind.FilterOpts, feedId [][32]byte) (*ChannelVerifierFeedActivatedIterator, error)
+
+ WatchFeedActivated(opts *bind.WatchOpts, sink chan<- *ChannelVerifierFeedActivated, feedId [][32]byte) (event.Subscription, error)
+
+ ParseFeedActivated(log types.Log) (*ChannelVerifierFeedActivated, error)
+
+ FilterFeedDeactivated(opts *bind.FilterOpts, feedId [][32]byte) (*ChannelVerifierFeedDeactivatedIterator, error)
+
+ WatchFeedDeactivated(opts *bind.WatchOpts, sink chan<- *ChannelVerifierFeedDeactivated, feedId [][32]byte) (event.Subscription, error)
+
+ ParseFeedDeactivated(log types.Log) (*ChannelVerifierFeedDeactivated, error)
+
+ FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ChannelVerifierOwnershipTransferRequestedIterator, error)
+
+ WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *ChannelVerifierOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferRequested(log types.Log) (*ChannelVerifierOwnershipTransferRequested, error)
+
+ FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*ChannelVerifierOwnershipTransferredIterator, error)
+
+ WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *ChannelVerifierOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error)
+
+ ParseOwnershipTransferred(log types.Log) (*ChannelVerifierOwnershipTransferred, error)
+
+ FilterReportVerified(opts *bind.FilterOpts, feedId [][32]byte) (*ChannelVerifierReportVerifiedIterator, error)
+
+ WatchReportVerified(opts *bind.WatchOpts, sink chan<- *ChannelVerifierReportVerified, feedId [][32]byte) (event.Subscription, error)
+
+ ParseReportVerified(log types.Log) (*ChannelVerifierReportVerified, error)
+
+ ParseLog(log types.Log) (generated.AbigenLog, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/llo-feeds/generated/errored_verifier/errored_verifier.go b/core/gethwrappers/llo-feeds/generated/errored_verifier/errored_verifier.go
index ad0ff294789..4d140ea064a 100644
--- a/core/gethwrappers/llo-feeds/generated/errored_verifier/errored_verifier.go
+++ b/core/gethwrappers/llo-feeds/generated/errored_verifier/errored_verifier.go
@@ -35,7 +35,7 @@ type CommonAddressAndWeight struct {
var ErroredVerifierMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"activateConfig\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"activateFeed\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"deactivateConfig\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"deactivateFeed\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"name\":\"setConfigFromSource\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b50610c2e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063b70d929d11610076578063e7db9c2a1161005b578063e7db9c2a146101d1578063e84f128e146101e4578063f01072211461021a57600080fd5b8063b70d929d14610188578063ded6307c146101be57600080fd5b80633dd86430116100a75780633dd864301461014d578063564a0a7a1461016257806394d959801461017557600080fd5b806301ffc9a7146100c35780633d3ac1b51461012d575b600080fd5b6101186100d136600461059a565b7fffffffff00000000000000000000000000000000000000000000000000000000167f3d3ac1b5000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b61014061013b366004610741565b610228565b604051610124919061078f565b61016061015b3660046107fb565b610292565b005b6101606101703660046107fb565b6102f4565b610160610183366004610814565b610356565b61019b6101963660046107fb565b6103b8565b604080519315158452602084019290925263ffffffff1690820152606001610124565b6101606101cc366004610814565b610447565b6101606101df3660046109f1565b6104a9565b6101f76101f23660046107fb565b61050b565b6040805163ffffffff948516815293909216602084015290820152606001610124565b6101606101df366004610b24565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4661696c656420746f207665726966790000000000000000000000000000000060448201526060906064015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4661696c656420746f20616374697661746520666565640000000000000000006044820152606401610289565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4661696c656420746f20646561637469766174652066656564000000000000006044820152606401610289565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f206465616374697661746520636f6e66696700000000006044820152606401610289565b60008060006040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610289906020808252602c908201527f4661696c656420746f20676574206c617465737420636f6e666967206469676560408201527f737420616e642065706f63680000000000000000000000000000000000000000606082015260800190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4661696c656420746f20616374697661746520636f6e666967000000000000006044820152606401610289565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4661696c656420746f2073657420636f6e6669670000000000000000000000006044820152606401610289565b60008060006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102899060208082526023908201527f4661696c656420746f20676574206c617465737420636f6e666967206465746160408201527f696c730000000000000000000000000000000000000000000000000000000000606082015260800190565b6000602082840312156105ac57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105dc57600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610635576106356105e3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610682576106826105e3565b604052919050565b600082601f83011261069b57600080fd5b813567ffffffffffffffff8111156106b5576106b56105e3565b6106e660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161063b565b8181528460208386010111156106fb57600080fd5b816020850160208301376000918101602001919091529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461073c57600080fd5b919050565b6000806040838503121561075457600080fd5b823567ffffffffffffffff81111561076b57600080fd5b6107778582860161068a565b92505061078660208401610718565b90509250929050565b600060208083528351808285015260005b818110156107bc578581018301518582016040015282016107a0565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60006020828403121561080d57600080fd5b5035919050565b6000806040838503121561082757600080fd5b50508035926020909101359150565b803563ffffffff8116811461073c57600080fd5b600067ffffffffffffffff821115610864576108646105e3565b5060051b60200190565b600082601f83011261087f57600080fd5b8135602061089461088f8361084a565b61063b565b82815260059290921b840181019181810190868411156108b357600080fd5b8286015b848110156108d5576108c881610718565b83529183019183016108b7565b509695505050505050565b600082601f8301126108f157600080fd5b8135602061090161088f8361084a565b82815260059290921b8401810191818101908684111561092057600080fd5b8286015b848110156108d55780358352918301918301610924565b803560ff8116811461073c57600080fd5b803567ffffffffffffffff8116811461073c57600080fd5b600082601f83011261097557600080fd5b8135602061098561088f8361084a565b82815260069290921b840181019181810190868411156109a457600080fd5b8286015b848110156108d557604081890312156109c15760008081fd5b6109c9610612565b6109d282610718565b81526109df85830161094c565b818601528352918301916040016109a8565b60008060008060008060008060008060006101608c8e031215610a1357600080fd5b8b359a5060208c01359950610a2a60408d01610718565b9850610a3860608d01610836565b975067ffffffffffffffff8060808e01351115610a5457600080fd5b610a648e60808f01358f0161086e565b97508060a08e01351115610a7757600080fd5b610a878e60a08f01358f016108e0565b9650610a9560c08e0161093b565b95508060e08e01351115610aa857600080fd5b610ab88e60e08f01358f0161068a565b9450610ac76101008e0161094c565b9350806101208e01351115610adb57600080fd5b610aec8e6101208f01358f0161068a565b9250806101408e01351115610b0057600080fd5b50610b128d6101408e01358e01610964565b90509295989b509295989b9093969950565b600080600080600080600080610100898b031215610b4157600080fd5b88359750602089013567ffffffffffffffff80821115610b6057600080fd5b610b6c8c838d0161086e565b985060408b0135915080821115610b8257600080fd5b610b8e8c838d016108e0565b9750610b9c60608c0161093b565b965060808b0135915080821115610bb257600080fd5b610bbe8c838d0161068a565b9550610bcc60a08c0161094c565b945060c08b0135915080821115610be257600080fd5b610bee8c838d0161068a565b935060e08b0135915080821115610c0457600080fd5b50610c118b828c01610964565b915050929598509295989093965056fea164736f6c6343000810000a",
+ Bin: "0x608060405234801561001057600080fd5b50610c2e806100206000396000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c8063b70d929d11610076578063e7db9c2a1161005b578063e7db9c2a146101d1578063e84f128e146101e4578063f01072211461021a57600080fd5b8063b70d929d14610188578063ded6307c146101be57600080fd5b80633dd86430116100a75780633dd864301461014d578063564a0a7a1461016257806394d959801461017557600080fd5b806301ffc9a7146100c35780633d3ac1b51461012d575b600080fd5b6101186100d136600461059a565b7fffffffff00000000000000000000000000000000000000000000000000000000167f3d3ac1b5000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b61014061013b366004610741565b610228565b604051610124919061078f565b61016061015b3660046107fb565b610292565b005b6101606101703660046107fb565b6102f4565b610160610183366004610814565b610356565b61019b6101963660046107fb565b6103b8565b604080519315158452602084019290925263ffffffff1690820152606001610124565b6101606101cc366004610814565b610447565b6101606101df3660046109f1565b6104a9565b6101f76101f23660046107fb565b61050b565b6040805163ffffffff948516815293909216602084015290820152606001610124565b6101606101df366004610b24565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4661696c656420746f207665726966790000000000000000000000000000000060448201526060906064015b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4661696c656420746f20616374697661746520666565640000000000000000006044820152606401610289565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4661696c656420746f20646561637469766174652066656564000000000000006044820152606401610289565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4661696c656420746f206465616374697661746520636f6e66696700000000006044820152606401610289565b60008060006040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610289906020808252602c908201527f4661696c656420746f20676574206c617465737420636f6e666967206469676560408201527f737420616e642065706f63680000000000000000000000000000000000000000606082015260800190565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4661696c656420746f20616374697661746520636f6e666967000000000000006044820152606401610289565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4661696c656420746f2073657420636f6e6669670000000000000000000000006044820152606401610289565b60008060006040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102899060208082526023908201527f4661696c656420746f20676574206c617465737420636f6e666967206465746160408201527f696c730000000000000000000000000000000000000000000000000000000000606082015260800190565b6000602082840312156105ac57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146105dc57600080fd5b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715610635576106356105e3565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610682576106826105e3565b604052919050565b600082601f83011261069b57600080fd5b813567ffffffffffffffff8111156106b5576106b56105e3565b6106e660207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161063b565b8181528460208386010111156106fb57600080fd5b816020850160208301376000918101602001919091529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461073c57600080fd5b919050565b6000806040838503121561075457600080fd5b823567ffffffffffffffff81111561076b57600080fd5b6107778582860161068a565b92505061078660208401610718565b90509250929050565b600060208083528351808285015260005b818110156107bc578581018301518582016040015282016107a0565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60006020828403121561080d57600080fd5b5035919050565b6000806040838503121561082757600080fd5b50508035926020909101359150565b803563ffffffff8116811461073c57600080fd5b600067ffffffffffffffff821115610864576108646105e3565b5060051b60200190565b600082601f83011261087f57600080fd5b8135602061089461088f8361084a565b61063b565b82815260059290921b840181019181810190868411156108b357600080fd5b8286015b848110156108d5576108c881610718565b83529183019183016108b7565b509695505050505050565b600082601f8301126108f157600080fd5b8135602061090161088f8361084a565b82815260059290921b8401810191818101908684111561092057600080fd5b8286015b848110156108d55780358352918301918301610924565b803560ff8116811461073c57600080fd5b803567ffffffffffffffff8116811461073c57600080fd5b600082601f83011261097557600080fd5b8135602061098561088f8361084a565b82815260069290921b840181019181810190868411156109a457600080fd5b8286015b848110156108d557604081890312156109c15760008081fd5b6109c9610612565b6109d282610718565b81526109df85830161094c565b818601528352918301916040016109a8565b60008060008060008060008060008060006101608c8e031215610a1357600080fd5b8b359a5060208c01359950610a2a60408d01610718565b9850610a3860608d01610836565b975067ffffffffffffffff8060808e01351115610a5457600080fd5b610a648e60808f01358f0161086e565b97508060a08e01351115610a7757600080fd5b610a878e60a08f01358f016108e0565b9650610a9560c08e0161093b565b95508060e08e01351115610aa857600080fd5b610ab88e60e08f01358f0161068a565b9450610ac76101008e0161094c565b9350806101208e01351115610adb57600080fd5b610aec8e6101208f01358f0161068a565b9250806101408e01351115610b0057600080fd5b50610b128d6101408e01358e01610964565b90509295989b509295989b9093969950565b600080600080600080600080610100898b031215610b4157600080fd5b88359750602089013567ffffffffffffffff80821115610b6057600080fd5b610b6c8c838d0161086e565b985060408b0135915080821115610b8257600080fd5b610b8e8c838d016108e0565b9750610b9c60608c0161093b565b965060808b0135915080821115610bb257600080fd5b610bbe8c838d0161068a565b9550610bcc60a08c0161094c565b945060c08b0135915080821115610be257600080fd5b610bee8c838d0161068a565b935060e08b0135915080821115610c0457600080fd5b50610c118b828c01610964565b915050929598509295989093965056fea164736f6c6343000813000a",
}
var ErroredVerifierABI = ErroredVerifierMetaData.ABI
diff --git a/core/gethwrappers/llo-feeds/generated/exposed_channel_verifier/exposed_channel_verifier.go b/core/gethwrappers/llo-feeds/generated/exposed_channel_verifier/exposed_channel_verifier.go
new file mode 100644
index 00000000000..e516b9a247f
--- /dev/null
+++ b/core/gethwrappers/llo-feeds/generated/exposed_channel_verifier/exposed_channel_verifier.go
@@ -0,0 +1,202 @@
+// Code generated - DO NOT EDIT.
+// This file is a generated binding and any manual changes will be lost.
+
+package exposed_channel_verifier
+
+import (
+ "errors"
+ "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"
+)
+
+var (
+ _ = errors.New
+ _ = big.NewInt
+ _ = strings.NewReader
+ _ = ethereum.NotFound
+ _ = bind.Bind
+ _ = common.Big1
+ _ = types.BloomLookup
+ _ = event.NewSubscription
+ _ = abi.ConvertType
+)
+
+var ExposedChannelVerifierMetaData = &bind.MetaData{
+ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_configCount\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"_signers\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"_offchainTransmitters\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"_f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_encodedConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_encodedConfig\",\"type\":\"bytes\"}],\"name\":\"exposedConfigDigestFromConfigData\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
+ Bin: "0x608060405234801561001057600080fd5b5061067e806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b05a355014610030575b600080fd5b61004361003e3660046103f2565b610055565b60405190815260200160405180910390f35b60006100a08b8b8b8b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508d92508c91506100af9050565b9b9a5050505050505050505050565b6000808a8a8a8a8a8a8a8a8a6040516020016100d399989796959493929190610594565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e09000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461017e57600080fd5b919050565b803567ffffffffffffffff8116811461017e57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156102115761021161019b565b604052919050565b600067ffffffffffffffff8211156102335761023361019b565b5060051b60200190565b600082601f83011261024e57600080fd5b8135602061026361025e83610219565b6101ca565b82815260059290921b8401810191818101908684111561028257600080fd5b8286015b848110156102a4576102978161015a565b8352918301918301610286565b509695505050505050565b600082601f8301126102c057600080fd5b813560206102d061025e83610219565b82815260059290921b840181019181810190868411156102ef57600080fd5b8286015b848110156102a457803583529183019183016102f3565b803560ff8116811461017e57600080fd5b60008083601f84011261032d57600080fd5b50813567ffffffffffffffff81111561034557600080fd5b60208301915083602082850101111561035d57600080fd5b9250929050565b600082601f83011261037557600080fd5b813567ffffffffffffffff81111561038f5761038f61019b565b6103c060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016101ca565b8181528460208386010111156103d557600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000806000806000806000806101208b8d03121561041257600080fd5b8a35995061042260208c0161015a565b985061043060408c01610183565b975060608b013567ffffffffffffffff8082111561044d57600080fd5b6104598e838f0161023d565b985060808d013591508082111561046f57600080fd5b61047b8e838f016102af565b975061048960a08e0161030a565b965060c08d013591508082111561049f57600080fd5b6104ab8e838f0161031b565b90965094508491506104bf60e08e01610183565b93506101008d01359150808211156104d657600080fd5b506104e38d828e01610364565b9150509295989b9194979a5092959850565b600081518084526020808501945080840160005b8381101561052557815187529582019590820190600101610509565b509495945050505050565b6000815180845260005b818110156105565760208185018101518683018201520161053a565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60006101208083018c8452602073ffffffffffffffffffffffffffffffffffffffff808e168287015267ffffffffffffffff8d1660408701528360608701528293508b5180845261014087019450828d01935060005b818110156106085784518316865294830194938301936001016105ea565b5050505050828103608084015261061f81896104f5565b60ff881660a0850152905082810360c084015261063c8187610530565b67ffffffffffffffff861660e085015290508281036101008401526106618185610530565b9c9b50505050505050505050505056fea164736f6c6343000813000a",
+}
+
+var ExposedChannelVerifierABI = ExposedChannelVerifierMetaData.ABI
+
+var ExposedChannelVerifierBin = ExposedChannelVerifierMetaData.Bin
+
+func DeployExposedChannelVerifier(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *ExposedChannelVerifier, error) {
+ parsed, err := ExposedChannelVerifierMetaData.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(ExposedChannelVerifierBin), backend)
+ if err != nil {
+ return common.Address{}, nil, nil, err
+ }
+ return address, tx, &ExposedChannelVerifier{address: address, abi: *parsed, ExposedChannelVerifierCaller: ExposedChannelVerifierCaller{contract: contract}, ExposedChannelVerifierTransactor: ExposedChannelVerifierTransactor{contract: contract}, ExposedChannelVerifierFilterer: ExposedChannelVerifierFilterer{contract: contract}}, nil
+}
+
+type ExposedChannelVerifier struct {
+ address common.Address
+ abi abi.ABI
+ ExposedChannelVerifierCaller
+ ExposedChannelVerifierTransactor
+ ExposedChannelVerifierFilterer
+}
+
+type ExposedChannelVerifierCaller struct {
+ contract *bind.BoundContract
+}
+
+type ExposedChannelVerifierTransactor struct {
+ contract *bind.BoundContract
+}
+
+type ExposedChannelVerifierFilterer struct {
+ contract *bind.BoundContract
+}
+
+type ExposedChannelVerifierSession struct {
+ Contract *ExposedChannelVerifier
+ CallOpts bind.CallOpts
+ TransactOpts bind.TransactOpts
+}
+
+type ExposedChannelVerifierCallerSession struct {
+ Contract *ExposedChannelVerifierCaller
+ CallOpts bind.CallOpts
+}
+
+type ExposedChannelVerifierTransactorSession struct {
+ Contract *ExposedChannelVerifierTransactor
+ TransactOpts bind.TransactOpts
+}
+
+type ExposedChannelVerifierRaw struct {
+ Contract *ExposedChannelVerifier
+}
+
+type ExposedChannelVerifierCallerRaw struct {
+ Contract *ExposedChannelVerifierCaller
+}
+
+type ExposedChannelVerifierTransactorRaw struct {
+ Contract *ExposedChannelVerifierTransactor
+}
+
+func NewExposedChannelVerifier(address common.Address, backend bind.ContractBackend) (*ExposedChannelVerifier, error) {
+ abi, err := abi.JSON(strings.NewReader(ExposedChannelVerifierABI))
+ if err != nil {
+ return nil, err
+ }
+ contract, err := bindExposedChannelVerifier(address, backend, backend, backend)
+ if err != nil {
+ return nil, err
+ }
+ return &ExposedChannelVerifier{address: address, abi: abi, ExposedChannelVerifierCaller: ExposedChannelVerifierCaller{contract: contract}, ExposedChannelVerifierTransactor: ExposedChannelVerifierTransactor{contract: contract}, ExposedChannelVerifierFilterer: ExposedChannelVerifierFilterer{contract: contract}}, nil
+}
+
+func NewExposedChannelVerifierCaller(address common.Address, caller bind.ContractCaller) (*ExposedChannelVerifierCaller, error) {
+ contract, err := bindExposedChannelVerifier(address, caller, nil, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ExposedChannelVerifierCaller{contract: contract}, nil
+}
+
+func NewExposedChannelVerifierTransactor(address common.Address, transactor bind.ContractTransactor) (*ExposedChannelVerifierTransactor, error) {
+ contract, err := bindExposedChannelVerifier(address, nil, transactor, nil)
+ if err != nil {
+ return nil, err
+ }
+ return &ExposedChannelVerifierTransactor{contract: contract}, nil
+}
+
+func NewExposedChannelVerifierFilterer(address common.Address, filterer bind.ContractFilterer) (*ExposedChannelVerifierFilterer, error) {
+ contract, err := bindExposedChannelVerifier(address, nil, nil, filterer)
+ if err != nil {
+ return nil, err
+ }
+ return &ExposedChannelVerifierFilterer{contract: contract}, nil
+}
+
+func bindExposedChannelVerifier(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
+ parsed, err := ExposedChannelVerifierMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ExposedChannelVerifier.Contract.ExposedChannelVerifierCaller.contract.Call(opts, result, method, params...)
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ExposedChannelVerifier.Contract.ExposedChannelVerifierTransactor.contract.Transfer(opts)
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ExposedChannelVerifier.Contract.ExposedChannelVerifierTransactor.contract.Transact(opts, method, params...)
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
+ return _ExposedChannelVerifier.Contract.contract.Call(opts, result, method, params...)
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
+ return _ExposedChannelVerifier.Contract.contract.Transfer(opts)
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
+ return _ExposedChannelVerifier.Contract.contract.Transact(opts, method, params...)
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierCaller) ExposedConfigDigestFromConfigData(opts *bind.CallOpts, _chainId *big.Int, _contractAddress common.Address, _configCount uint64, _signers []common.Address, _offchainTransmitters [][32]byte, _f uint8, _onchainConfig []byte, _encodedConfigVersion uint64, _encodedConfig []byte) ([32]byte, error) {
+ var out []interface{}
+ err := _ExposedChannelVerifier.contract.Call(opts, &out, "exposedConfigDigestFromConfigData", _chainId, _contractAddress, _configCount, _signers, _offchainTransmitters, _f, _onchainConfig, _encodedConfigVersion, _encodedConfig)
+
+ if err != nil {
+ return *new([32]byte), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)
+
+ return out0, err
+
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierSession) ExposedConfigDigestFromConfigData(_chainId *big.Int, _contractAddress common.Address, _configCount uint64, _signers []common.Address, _offchainTransmitters [][32]byte, _f uint8, _onchainConfig []byte, _encodedConfigVersion uint64, _encodedConfig []byte) ([32]byte, error) {
+ return _ExposedChannelVerifier.Contract.ExposedConfigDigestFromConfigData(&_ExposedChannelVerifier.CallOpts, _chainId, _contractAddress, _configCount, _signers, _offchainTransmitters, _f, _onchainConfig, _encodedConfigVersion, _encodedConfig)
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifierCallerSession) ExposedConfigDigestFromConfigData(_chainId *big.Int, _contractAddress common.Address, _configCount uint64, _signers []common.Address, _offchainTransmitters [][32]byte, _f uint8, _onchainConfig []byte, _encodedConfigVersion uint64, _encodedConfig []byte) ([32]byte, error) {
+ return _ExposedChannelVerifier.Contract.ExposedConfigDigestFromConfigData(&_ExposedChannelVerifier.CallOpts, _chainId, _contractAddress, _configCount, _signers, _offchainTransmitters, _f, _onchainConfig, _encodedConfigVersion, _encodedConfig)
+}
+
+func (_ExposedChannelVerifier *ExposedChannelVerifier) Address() common.Address {
+ return _ExposedChannelVerifier.address
+}
+
+type ExposedChannelVerifierInterface interface {
+ ExposedConfigDigestFromConfigData(opts *bind.CallOpts, _chainId *big.Int, _contractAddress common.Address, _configCount uint64, _signers []common.Address, _offchainTransmitters [][32]byte, _f uint8, _onchainConfig []byte, _encodedConfigVersion uint64, _encodedConfig []byte) ([32]byte, error)
+
+ Address() common.Address
+}
diff --git a/core/gethwrappers/llo-feeds/generated/exposed_verifier/exposed_verifier.go b/core/gethwrappers/llo-feeds/generated/exposed_verifier/exposed_verifier.go
index e27cb58d157..c7ee746bac3 100644
--- a/core/gethwrappers/llo-feeds/generated/exposed_verifier/exposed_verifier.go
+++ b/core/gethwrappers/llo-feeds/generated/exposed_verifier/exposed_verifier.go
@@ -30,7 +30,7 @@ var (
var ExposedVerifierMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_feedId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_contractAddress\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_configCount\",\"type\":\"uint64\"},{\"internalType\":\"address[]\",\"name\":\"_signers\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"_offchainTransmitters\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"_f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"_onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"_encodedConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_encodedConfig\",\"type\":\"bytes\"}],\"name\":\"exposedConfigDigestFromConfigData\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]",
- Bin: "0x608060405234801561001057600080fd5b50610696806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630ebd702314610030575b600080fd5b61004361003e3660046103f7565b610055565b60405190815260200160405180910390f35b60006100a18c8c8c8c8c8c8c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e92508d91506100b19050565b9c9b505050505050505050505050565b6000808b8b8b8b8b8b8b8b8b8b6040516020016100d79a999897969594939291906105a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e06000000000000000000000000000000000000000000000000000000000000179150509a9950505050505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461018357600080fd5b919050565b803567ffffffffffffffff8116811461018357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610216576102166101a0565b604052919050565b600067ffffffffffffffff821115610238576102386101a0565b5060051b60200190565b600082601f83011261025357600080fd5b813560206102686102638361021e565b6101cf565b82815260059290921b8401810191818101908684111561028757600080fd5b8286015b848110156102a95761029c8161015f565b835291830191830161028b565b509695505050505050565b600082601f8301126102c557600080fd5b813560206102d56102638361021e565b82815260059290921b840181019181810190868411156102f457600080fd5b8286015b848110156102a957803583529183019183016102f8565b803560ff8116811461018357600080fd5b60008083601f84011261033257600080fd5b50813567ffffffffffffffff81111561034a57600080fd5b60208301915083602082850101111561036257600080fd5b9250929050565b600082601f83011261037a57600080fd5b813567ffffffffffffffff811115610394576103946101a0565b6103c560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016101cf565b8181528460208386010111156103da57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060008060006101408c8e03121561041957600080fd5b8b359a5060208c0135995061043060408d0161015f565b985061043e60608d01610188565b975067ffffffffffffffff8060808e0135111561045a57600080fd5b61046a8e60808f01358f01610242565b97508060a08e0135111561047d57600080fd5b61048d8e60a08f01358f016102b4565b965061049b60c08e0161030f565b95508060e08e013511156104ae57600080fd5b6104be8e60e08f01358f01610320565b90955093506104d06101008e01610188565b9250806101208e013511156104e457600080fd5b506104f68d6101208e01358e01610369565b90509295989b509295989b9093969950565b600081518084526020808501945080840160005b838110156105385781518752958201959082019060010161051c565b509495945050505050565b6000815180845260005b818110156105695760208185018101518683018201520161054d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b8a815260208082018b905273ffffffffffffffffffffffffffffffffffffffff8a8116604084015267ffffffffffffffff8a1660608401526101406080840181905289519084018190526000926101608501928b820192855b8181101561061e578451831686529483019493830193600101610600565b505050505082810360a08401526106358189610508565b60ff881660c0850152905082810360e08401526106528187610543565b67ffffffffffffffff861661010085015290508281036101208401526106788185610543565b9d9c5050505050505050505050505056fea164736f6c6343000810000a",
+ Bin: "0x608060405234801561001057600080fd5b50610696806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c80630ebd702314610030575b600080fd5b61004361003e3660046103f7565b610055565b60405190815260200160405180910390f35b60006100a18c8c8c8c8c8c8c8c8c8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e92508d91506100b19050565b9c9b505050505050505050505050565b6000808b8b8b8b8b8b8b8b8b8b6040516020016100d79a999897969594939291906105a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e06000000000000000000000000000000000000000000000000000000000000179150509a9950505050505050505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461018357600080fd5b919050565b803567ffffffffffffffff8116811461018357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610216576102166101a0565b604052919050565b600067ffffffffffffffff821115610238576102386101a0565b5060051b60200190565b600082601f83011261025357600080fd5b813560206102686102638361021e565b6101cf565b82815260059290921b8401810191818101908684111561028757600080fd5b8286015b848110156102a95761029c8161015f565b835291830191830161028b565b509695505050505050565b600082601f8301126102c557600080fd5b813560206102d56102638361021e565b82815260059290921b840181019181810190868411156102f457600080fd5b8286015b848110156102a957803583529183019183016102f8565b803560ff8116811461018357600080fd5b60008083601f84011261033257600080fd5b50813567ffffffffffffffff81111561034a57600080fd5b60208301915083602082850101111561036257600080fd5b9250929050565b600082601f83011261037a57600080fd5b813567ffffffffffffffff811115610394576103946101a0565b6103c560207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016101cf565b8181528460208386010111156103da57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060008060006101408c8e03121561041957600080fd5b8b359a5060208c0135995061043060408d0161015f565b985061043e60608d01610188565b975067ffffffffffffffff8060808e0135111561045a57600080fd5b61046a8e60808f01358f01610242565b97508060a08e0135111561047d57600080fd5b61048d8e60a08f01358f016102b4565b965061049b60c08e0161030f565b95508060e08e013511156104ae57600080fd5b6104be8e60e08f01358f01610320565b90955093506104d06101008e01610188565b9250806101208e013511156104e457600080fd5b506104f68d6101208e01358e01610369565b90509295989b509295989b9093969950565b600081518084526020808501945080840160005b838110156105385781518752958201959082019060010161051c565b509495945050505050565b6000815180845260005b818110156105695760208185018101518683018201520161054d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b8a815260208082018b905273ffffffffffffffffffffffffffffffffffffffff8a8116604084015267ffffffffffffffff8a1660608401526101406080840181905289519084018190526000926101608501928b820192855b8181101561061e578451831686529483019493830193600101610600565b505050505082810360a08401526106358189610508565b60ff881660c0850152905082810360e08401526106528187610543565b67ffffffffffffffff861661010085015290508281036101208401526106788185610543565b9d9c5050505050505050505050505056fea164736f6c6343000813000a",
}
var ExposedVerifierABI = ExposedVerifierMetaData.ABI
diff --git a/core/gethwrappers/llo-feeds/generated/fee_manager/fee_manager.go b/core/gethwrappers/llo-feeds/generated/fee_manager/fee_manager.go
index 742ec91bf97..9adbff4e5c5 100644
--- a/core/gethwrappers/llo-feeds/generated/fee_manager/fee_manager.go
+++ b/core/gethwrappers/llo-feeds/generated/fee_manager/fee_manager.go
@@ -47,7 +47,7 @@ type IRewardManagerFeePayment struct {
var FeeManagerMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_linkAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_nativeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_proxyAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rewardManagerAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ExpiredReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDeposit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDiscount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidQuote\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceivingAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSurcharge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroDeficit\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structCommon.Asset\",\"name\":\"fee\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structCommon.Asset\",\"name\":\"reward\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"appliedDiscount\",\"type\":\"uint256\"}],\"name\":\"DiscountApplied\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"internalType\":\"uint192\",\"name\":\"amount\",\"type\":\"uint192\"}],\"indexed\":false,\"internalType\":\"structIRewardManager.FeePayment[]\",\"name\":\"rewards\",\"type\":\"tuple[]\"}],\"name\":\"InsufficientLink\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"linkQuantity\",\"type\":\"uint256\"}],\"name\":\"LinkDeficitCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newSurcharge\",\"type\":\"uint64\"}],\"name\":\"NativeSurchargeUpdated\",\"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\":\"subscriber\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"discount\",\"type\":\"uint64\"}],\"name\":\"SubscriberDiscountUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"adminAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint192\",\"name\":\"quantity\",\"type\":\"uint192\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"quoteAddress\",\"type\":\"address\"}],\"name\":\"getFeeAndReward\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structCommon.Asset\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structCommon.Asset\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_linkAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_nativeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_proxyAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_rewardManager\",\"outputs\":[{\"internalType\":\"contractIRewardManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"payLinkDeficit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"parameterPayload\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"}],\"name\":\"processFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"parameterPayload\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"}],\"name\":\"processFeeBulk\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_linkDeficit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_nativeSurcharge\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"s_subscriberDiscounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"rewardRecipientAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setFeeRecipients\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"surcharge\",\"type\":\"uint64\"}],\"name\":\"setNativeSurcharge\",\"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\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"discount\",\"type\":\"uint64\"}],\"name\":\"updateSubscriberDiscount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"quantity\",\"type\":\"uint192\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b506040516200349938038062003499833981016040819052620000359162000288565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001c0565b5050506001600160a01b0384161580620000e057506001600160a01b038316155b80620000f357506001600160a01b038216155b806200010657506001600160a01b038116155b15620001255760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03848116608081905284821660a05283821660c05290821660e081905260405163095ea7b360e01b81526004810191909152600019602482015263095ea7b3906044016020604051808303816000875af11580156200018f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b59190620002e5565b505050505062000310565b336001600160a01b038216036200021a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b03811681146200028357600080fd5b919050565b600080600080608085870312156200029f57600080fd5b620002aa856200026b565b9350620002ba602086016200026b565b9250620002ca604086016200026b565b9150620002da606086016200026b565b905092959194509250565b600060208284031215620002f857600080fd5b815180151581146200030957600080fd5b9392505050565b60805160a05160c05160e0516130a7620003f26000396000818161027501528181611462015281816115f001528181611e0b0152612059015260008181610335015281816107fb01528181610db601526115360152600081816102ee01528181610bd901528181610fd30152818161102a015281816112d701528181611d310152611dda0152600081816104ba0152818161097601528181610b8201528181610d1901528181610ec201528181610ff801528181611081015281816111c60152818161123301528181611273015281816119ac0152611ecc01526130a76000f3fe60806040526004361061016a5760003560e01c806379ba5097116100cb578063dba45fe01161007f578063ea4b861b11610059578063ea4b861b146104a8578063f2fde38b146104dc578063f65df962146104fc57600080fd5b8063dba45fe01461040a578063e03dab1a1461041d578063e389d9a41461048857600080fd5b80638da5cb5b116100b05780638da5cb5b146103aa578063ce7817d1146103d5578063d09dc339146103f557600080fd5b806379ba50971461035757806387d6d8431461036c57600080fd5b80633aa5ac0711610122578063638786681161010757806363878668146102dc5780636c2f1a17146103105780636d1342cb1461032357600080fd5b80633aa5ac071461026357806350538094146102bc57600080fd5b8063181f5a7711610153578063181f5a77146101df5780631d4d84a21461022b57806332f5f7461461024d57600080fd5b8063013f542b1461016f57806301ffc9a7146101af575b600080fd5b34801561017b57600080fd5b5061019c61018a36600461265b565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101bb57600080fd5b506101cf6101ca366004612674565b61051c565b60405190151581526020016101a6565b3480156101eb57600080fd5b50604080518082018252601081527f4665654d616e6167657220322e302e3000000000000000000000000000000000602082015290516101a691906126da565b34801561023757600080fd5b5061024b610246366004612783565b6105b5565b005b34801561025957600080fd5b5061019c60045481565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b3480156102c857600080fd5b5061024b6102d73660046127e6565b610749565b3480156102e857600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b61024b61031e36600461284a565b6107e3565b34801561032f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b34801561036357600080fd5b5061024b610a2a565b34801561037857600080fd5b5061019c6103873660046128f9565b600260209081526000938452604080852082529284528284209052825290205481565b3480156103b657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610297565b3480156103e157600080fd5b5061024b6103f0366004612930565b610b2c565b34801561040157600080fd5b5061019c610ce8565b61024b610418366004612981565b610d9e565b34801561042957600080fd5b5061043d610438366004612adf565b610f3a565b60408051845173ffffffffffffffffffffffffffffffffffffffff9081168252602095860151868301528451169181019190915292909101516060830152608082015260a0016101a6565b34801561049457600080fd5b5061024b6104a336600461265b565b611339565b3480156104b457600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e857600080fd5b5061024b6104f7366004612b38565b61150a565b34801561050857600080fd5b5061024b610517366004612b55565b61151e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fdba45fe00000000000000000000000000000000000000000000000000000000014806105af57507fffffffff0000000000000000000000000000000000000000000000000000000082167f6c2f1a1700000000000000000000000000000000000000000000000000000000145b92915050565b6105bd611660565b73ffffffffffffffffffffffffffffffffffffffff83166106925760008273ffffffffffffffffffffffffffffffffffffffff168277ffffffffffffffffffffffffffffffffffffffffffffffff1660405160006040518083038185875af1925050503d806000811461064c576040519150601f19603f3d011682016040523d82523d6000602084013e610651565b606091505b505090508061068c576040517fef2af20100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6106cd73ffffffffffffffffffffffffffffffffffffffff84168377ffffffffffffffffffffffffffffffffffffffffffffffff84166116e3565b6040805133815273ffffffffffffffffffffffffffffffffffffffff848116602083015285168183015277ffffffffffffffffffffffffffffffffffffffffffffffff8316606082015290517f7ff78a71698bdb18dcca96f52ab25e0a1b146fb6a49adf8e6845299e49021f299181900360800190a15b505050565b610751611660565b670de0b6b3a764000067ffffffffffffffff8216111561079d576040517f05e8ac2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff811660048190556040519081527f08f7c0d17932ddb8523bc06754d42ff19ebc77d76a8b9bfde02c28ab1ed3d6399060200160405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610852576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008467ffffffffffffffff81111561086d5761086d612a05565b6040519080825280602002602001820160405280156108a657816020015b6108936125ce565b81526020019060019003908161088b5790505b5090506000806000805b888110156109f15760008060006108ec8d8d868181106108d2576108d2612bd4565b90506020028101906108e49190612c03565b8d8d8d6117b7565b92509250925082602001516000146109dd5760405180608001604052808e8e8781811061091b5761091b612bd4565b905060200281019061092d9190612c03565b61093691612c68565b81526020018481526020018381526020018281525088868061095790612cd3565b97508151811061096957610969612bd4565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16036109d6578660010196506109dd565b8560010195505b505050806109ea90612cd3565b90506108b0565b50821515806109ff57508115155b15610a1557610a10858585856118c7565b610a1f565b610a1f85346120db565b505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b34611660565b670de0b6b3a764000067ffffffffffffffff82161115610b80576040517f997ea36000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610c2857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610c5f576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600081815260026020908152604080832088845282528083209487168084529482529182902067ffffffffffffffff86169081905582519485529084015285927f5eba5a8afa39780f0f99b6cbeb95f3da6a7040ca00abd46bdc91a0a060134139910160405180910390a350505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d999190612d0b565b905090565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e0d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000610e1f88888888886117b7565b9250925092508260200151600003610e4357610e3b84346120db565b505050610f33565b604080516001808252818301909252600091816020015b610e626125ce565b815260200190600190039081610e5a575050604080516080810190915290915080610e8d8a8c612c68565b81526020018581526020018481526020018381525081600081518110610eb557610eb5612bd4565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1603610f2557610a108582600160006118c7565b610a1f8582600060016118c7565b5050505050565b6040805180820182526000808252602080830182905283518085018552828152808201839052845180860186528381528083018490528551808701909652838652918501839052929382610f8d88612d24565b90507fffff00000000000000000000000000000000000000000000000000000000000080821690810161102857505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811683527f0000000000000000000000000000000000000000000000000000000000000000168152909350915060009050611330565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141580156110d057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b15611107576040517ff861803000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008b8060200190518101906111209190612d7d565b77ffffffffffffffffffffffffffffffffffffffffffffffff91821698509116955063ffffffff1693505050428210159050611188576040517fb6c405f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808e16600090815260026020908152604080832089845282528083208f851684529091529020547f000000000000000000000000000000000000000000000000000000000000000090911687526112176111ff82670de0b6b3a7640000612def565b6112099086612e02565b670de0b6b3a7640000612128565b602088015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116908d16036112a45773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016885260208088015190890152611321565b6004546000906112c0906111ff90670de0b6b3a7640000612e3f565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168a52905061131a61131083670de0b6b3a7640000612def565b6112099083612e02565b60208a0152505b96995094975094955050505050505b93509350939050565b611341611660565b6000818152600360205260408120549081900361138a576040517f03aad31200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600360205260408082208290558051600180825281830190925290816020015b60408051808201909152600080825260208201528152602001906001900390816113af57905050905060405180604001604052808481526020018377ffffffffffffffffffffffffffffffffffffffffffffffff168152508160008151811061141a5761141a612bd4565b60209081029190910101526040517fb0d9fa1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b0d9fa19906114999084903090600401612eb2565b600060405180830381600087803b1580156114b357600080fd5b505af11580156114c7573d6000803e3d6000fd5b50505050827f843f0b103e50b42b08f9d30f12f961845a6d02623730872e24644899c0dd9895836040516114fd91815260200190565b60405180910390a2505050565b611512611660565b61151b81612160565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480159061157c575060005473ffffffffffffffffffffffffffffffffffffffff163314155b156115b3576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f14060f2300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906314060f239061162990869086908690600401612eea565b600060405180830381600087803b15801561164357600080fd5b505af1158015611657573d6000803e3d6000fd5b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610aa7565b565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107449084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612255565b6040805180820190915260008082526020820152604080518082019091526000808252602082015260003073ffffffffffffffffffffffffffffffffffffffff851603611830576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061183e888a018a612f6a565b91505060008161184d90612d24565b905060007e010000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008316146118a8576118a5888a018a612b38565b90505b6118b3878483610f3a565b955095509550505050955095509592505050565b60008267ffffffffffffffff8111156118e2576118e2612a05565b60405190808252806020026020018201604052801561192757816020015b60408051808201909152600080825260208201528152602001906001900390816119005790505b50905060008267ffffffffffffffff81111561194557611945612a05565b60405190808252806020026020018201604052801561198a57816020015b60408051808201909152600080825260208201528152602001906001900390816119635790505b50905060008080808061199d888a612e3f565b905060005b81811015611cec577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b82815181106119f3576119f3612bd4565b6020026020010151602001516000015173ffffffffffffffffffffffffffffffffffffffff1603611ab95760405180604001604052808c8381518110611a3b57611a3b612bd4565b60200260200101516000015181526020018c8381518110611a5e57611a5e612bd4565b6020026020010151604001516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16815250888580611a9790612cd3565b965081518110611aa957611aa9612bd4565b6020026020010181905250611bae565b60405180604001604052808c8381518110611ad657611ad6612bd4565b60200260200101516000015181526020018c8381518110611af957611af9612bd4565b6020026020010151604001516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16815250878480611b3290612cd3565b955081518110611b4457611b44612bd4565b60200260200101819052508a8181518110611b6157611b61612bd4565b6020026020010151602001516020015186611b7c9190612e3f565b95508a8181518110611b9057611b90612bd4565b6020026020010151604001516020015185611bab9190612e3f565b94505b8a8181518110611bc057611bc0612bd4565b602002602001015160600151600014611cdc578b73ffffffffffffffffffffffffffffffffffffffff168b8281518110611bfc57611bfc612bd4565b6020026020010151600001517f88b15eb682210089cddf967648e2cb2a4535aeadc8f8f36050922e33c04e71258d8481518110611c3b57611c3b612bd4565b6020026020010151602001518e8581518110611c5957611c59612bd4565b6020026020010151604001518f8681518110611c7757611c77612bd4565b602002602001015160600151604051611cd393929190835173ffffffffffffffffffffffffffffffffffffffff908116825260209485015185830152835116604082015291909201516060820152608081019190915260a00190565b60405180910390a35b611ce581612cd3565b90506119a2565b5060003415611dba5734861115611d2f576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d9757600080fd5b505af1158015611dab573d6000803e3d6000fd5b50505050508534039050611e02565b8515611e0257611e0273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168d3089612361565b875115611e97577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b0d9fa19898e6040518363ffffffff1660e01b8152600401611e64929190612eb2565b600060405180830381600087803b158015611e7e57600080fd5b505af1158015611e92573d6000803e3d6000fd5b505050505b8651156120c3576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4c9190612d0b565b85111561201c5760005b8751811015611fdf57878181518110611f7157611f71612bd4565b60200260200101516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16600360008a8481518110611fad57611fad612bd4565b60209081029190910181015151825281019190915260400160002080549091019055611fd881612cd3565b9050611f56565b507ff52e5907b69d97c33392936c12d78b494463b78c5b72df50b4c497eee5720b678760405161200f919061300e565b60405180910390a16120c3565b6040517fb0d9fa1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b0d9fa1990612090908a903090600401612eb2565b600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b505050505b6120cd8c826120db565b505050505050505050505050565b80156121245760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610744573d6000803e3d6000fd5b5050565b60008215612156578161213c600185612def565b6121469190613021565b612151906001612e3f565b612159565b60005b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036121df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610aa7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006122b7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123bf9092919063ffffffff16565b80519091501561074457808060200190518101906122d5919061305c565b610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610aa7565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261068c9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611735565b60606123ce84846000856123d6565b949350505050565b606082471015612468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610aa7565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051612491919061307e565b60006040518083038185875af1925050503d80600081146124ce576040519150601f19603f3d011682016040523d82523d6000602084013e6124d3565b606091505b50915091506124e4878383876124ef565b979650505050505050565b6060831561258557825160000361257e5773ffffffffffffffffffffffffffffffffffffffff85163b61257e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aa7565b50816123ce565b6123ce838381511561259a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa791906126da565b6040518060800160405280600080191681526020016126166040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b815260200161264e6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b8152602001600081525090565b60006020828403121561266d57600080fd5b5035919050565b60006020828403121561268657600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461215957600080fd5b60005b838110156126d15781810151838201526020016126b9565b50506000910152565b60208152600082518060208401526126f98160408501602087016126b6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461151b57600080fd5b80356127588161272b565b919050565b77ffffffffffffffffffffffffffffffffffffffffffffffff8116811461151b57600080fd5b60008060006060848603121561279857600080fd5b83356127a38161272b565b925060208401356127b38161272b565b915060408401356127c38161275d565b809150509250925092565b803567ffffffffffffffff8116811461275857600080fd5b6000602082840312156127f857600080fd5b612159826127ce565b60008083601f84011261281357600080fd5b50813567ffffffffffffffff81111561282b57600080fd5b60208301915083602082850101111561284357600080fd5b9250929050565b60008060008060006060868803121561286257600080fd5b853567ffffffffffffffff8082111561287a57600080fd5b818801915088601f83011261288e57600080fd5b81358181111561289d57600080fd5b8960208260051b85010111156128b257600080fd5b6020928301975095509087013590808211156128cd57600080fd5b506128da88828901612801565b90945092506128ed90506040870161274d565b90509295509295909350565b60008060006060848603121561290e57600080fd5b83356129198161272b565b92506020840135915060408401356127c38161272b565b6000806000806080858703121561294657600080fd5b84356129518161272b565b93506020850135925060408501356129688161272b565b9150612976606086016127ce565b905092959194509250565b60008060008060006060868803121561299957600080fd5b853567ffffffffffffffff808211156129b157600080fd5b6129bd89838a01612801565b909750955060208801359150808211156129d657600080fd5b506129e388828901612801565b90945092505060408601356129f78161272b565b809150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612a4557600080fd5b813567ffffffffffffffff80821115612a6057612a60612a05565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612aa657612aa6612a05565b81604052838152866020858801011115612abf57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612af457600080fd5b8335612aff8161272b565b9250602084013567ffffffffffffffff811115612b1b57600080fd5b612b2786828701612a34565b92505060408401356127c38161272b565b600060208284031215612b4a57600080fd5b81356121598161272b565b600080600060408486031215612b6a57600080fd5b83359250602084013567ffffffffffffffff80821115612b8957600080fd5b818601915086601f830112612b9d57600080fd5b813581811115612bac57600080fd5b8760208260061b8501011115612bc157600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612c3857600080fd5b83018035915067ffffffffffffffff821115612c5357600080fd5b60200191503681900382131561284357600080fd5b803560208310156105af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d0457612d04612ca4565b5060010190565b600060208284031215612d1d57600080fd5b5051919050565b80516020808301519190811015612d63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b805163ffffffff8116811461275857600080fd5b60008060008060008060c08789031215612d9657600080fd5b86519550612da660208801612d69565b9450612db460408801612d69565b93506060870151612dc48161275d565b6080880151909350612dd58161275d565b9150612de360a08801612d69565b90509295509295509295565b818103818111156105af576105af612ca4565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612e3a57612e3a612ca4565b500290565b808201808211156105af576105af612ca4565b600081518084526020808501945080840160005b83811015612ea75781518051885283015177ffffffffffffffffffffffffffffffffffffffffffffffff168388015260409096019590820190600101612e66565b509495945050505050565b604081526000612ec56040830185612e52565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b8381526040602080830182905282820184905260009190859060608501845b87811015612f5d578335612f1c8161272b565b73ffffffffffffffffffffffffffffffffffffffff16825267ffffffffffffffff612f488585016127ce565b16828401529284019290840190600101612f09565b5098975050505050505050565b60008060808385031215612f7d57600080fd5b83601f840112612f8c57600080fd5b6040516060810167ffffffffffffffff8282108183111715612fb057612fb0612a05565b816040528291506060860187811115612fc857600080fd5b865b81811015612fe2578035845260209384019301612fca565b5092945091359180831115612ff657600080fd5b505061300485828601612a34565b9150509250929050565b6020815260006121596020830184612e52565b600082613057577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561306e57600080fd5b8151801515811461215957600080fd5b600082516130908184602087016126b6565b919091019291505056fea164736f6c6343000810000a",
+ Bin: "0x6101006040523480156200001257600080fd5b506040516200347338038062003473833981016040819052620000359162000288565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001c0565b5050506001600160a01b0384161580620000e057506001600160a01b038316155b80620000f357506001600160a01b038216155b806200010657506001600160a01b038116155b15620001255760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03848116608081905284821660a05283821660c05290821660e081905260405163095ea7b360e01b81526004810191909152600019602482015263095ea7b3906044016020604051808303816000875af11580156200018f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b59190620002e5565b505050505062000310565b336001600160a01b038216036200021a5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b03811681146200028357600080fd5b919050565b600080600080608085870312156200029f57600080fd5b620002aa856200026b565b9350620002ba602086016200026b565b9250620002ca604086016200026b565b9150620002da606086016200026b565b905092959194509250565b600060208284031215620002f857600080fd5b815180151581146200030957600080fd5b9392505050565b60805160a05160c05160e051613081620003f26000396000818161027501528181611462015281816115f001528181611e0b0152612059015260008181610335015281816107fb01528181610db601526115360152600081816102ee01528181610bd901528181610fd30152818161102a015281816112d701528181611d310152611dda0152600081816104ba0152818161097601528181610b8201528181610d1901528181610ec201528181610ff801528181611081015281816111c60152818161123301528181611273015281816119ac0152611ecc01526130816000f3fe60806040526004361061016a5760003560e01c806379ba5097116100cb578063dba45fe01161007f578063ea4b861b11610059578063ea4b861b146104a8578063f2fde38b146104dc578063f65df962146104fc57600080fd5b8063dba45fe01461040a578063e03dab1a1461041d578063e389d9a41461048857600080fd5b80638da5cb5b116100b05780638da5cb5b146103aa578063ce7817d1146103d5578063d09dc339146103f557600080fd5b806379ba50971461035757806387d6d8431461036c57600080fd5b80633aa5ac0711610122578063638786681161010757806363878668146102dc5780636c2f1a17146103105780636d1342cb1461032357600080fd5b80633aa5ac071461026357806350538094146102bc57600080fd5b8063181f5a7711610153578063181f5a77146101df5780631d4d84a21461022b57806332f5f7461461024d57600080fd5b8063013f542b1461016f57806301ffc9a7146101af575b600080fd5b34801561017b57600080fd5b5061019c61018a36600461265b565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101bb57600080fd5b506101cf6101ca366004612674565b61051c565b60405190151581526020016101a6565b3480156101eb57600080fd5b50604080518082018252601081527f4665654d616e6167657220322e302e3000000000000000000000000000000000602082015290516101a691906126da565b34801561023757600080fd5b5061024b610246366004612783565b6105b5565b005b34801561025957600080fd5b5061019c60045481565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b3480156102c857600080fd5b5061024b6102d73660046127e6565b610749565b3480156102e857600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b61024b61031e36600461284a565b6107e3565b34801561032f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b34801561036357600080fd5b5061024b610a2a565b34801561037857600080fd5b5061019c6103873660046128f9565b600260209081526000938452604080852082529284528284209052825290205481565b3480156103b657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610297565b3480156103e157600080fd5b5061024b6103f0366004612930565b610b2c565b34801561040157600080fd5b5061019c610ce8565b61024b610418366004612981565b610d9e565b34801561042957600080fd5b5061043d610438366004612adf565b610f3a565b60408051845173ffffffffffffffffffffffffffffffffffffffff9081168252602095860151868301528451169181019190915292909101516060830152608082015260a0016101a6565b34801561049457600080fd5b5061024b6104a336600461265b565b611339565b3480156104b457600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e857600080fd5b5061024b6104f7366004612b38565b61150a565b34801561050857600080fd5b5061024b610517366004612b55565b61151e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fdba45fe00000000000000000000000000000000000000000000000000000000014806105af57507fffffffff0000000000000000000000000000000000000000000000000000000082167f6c2f1a1700000000000000000000000000000000000000000000000000000000145b92915050565b6105bd611660565b73ffffffffffffffffffffffffffffffffffffffff83166106925760008273ffffffffffffffffffffffffffffffffffffffff168277ffffffffffffffffffffffffffffffffffffffffffffffff1660405160006040518083038185875af1925050503d806000811461064c576040519150601f19603f3d011682016040523d82523d6000602084013e610651565b606091505b505090508061068c576040517fef2af20100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6106cd73ffffffffffffffffffffffffffffffffffffffff84168377ffffffffffffffffffffffffffffffffffffffffffffffff84166116e3565b6040805133815273ffffffffffffffffffffffffffffffffffffffff848116602083015285168183015277ffffffffffffffffffffffffffffffffffffffffffffffff8316606082015290517f7ff78a71698bdb18dcca96f52ab25e0a1b146fb6a49adf8e6845299e49021f299181900360800190a15b505050565b610751611660565b670de0b6b3a764000067ffffffffffffffff8216111561079d576040517f05e8ac2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff811660048190556040519081527f08f7c0d17932ddb8523bc06754d42ff19ebc77d76a8b9bfde02c28ab1ed3d6399060200160405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610852576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008467ffffffffffffffff81111561086d5761086d612a05565b6040519080825280602002602001820160405280156108a657816020015b6108936125ce565b81526020019060019003908161088b5790505b5090506000806000805b888110156109f15760008060006108ec8d8d868181106108d2576108d2612bd4565b90506020028101906108e49190612c03565b8d8d8d6117b7565b92509250925082602001516000146109dd5760405180608001604052808e8e8781811061091b5761091b612bd4565b905060200281019061092d9190612c03565b61093691612c68565b81526020018481526020018381526020018281525088868061095790612cd3565b97508151811061096957610969612bd4565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16036109d6578660010196506109dd565b8560010195505b505050806109ea90612cd3565b90506108b0565b50821515806109ff57508115155b15610a1557610a10858585856118c7565b610a1f565b610a1f85346120db565b505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ab0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b34611660565b670de0b6b3a764000067ffffffffffffffff82161115610b80576040517f997ea36000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610c2857507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610c5f576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600081815260026020908152604080832088845282528083209487168084529482529182902067ffffffffffffffff86169081905582519485529084015285927f5eba5a8afa39780f0f99b6cbeb95f3da6a7040ca00abd46bdc91a0a060134139910160405180910390a350505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d999190612d0b565b905090565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e0d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000610e1f88888888886117b7565b9250925092508260200151600003610e4357610e3b84346120db565b505050610f33565b604080516001808252818301909252600091816020015b610e626125ce565b815260200190600190039081610e5a575050604080516080810190915290915080610e8d8a8c612c68565b81526020018581526020018481526020018381525081600081518110610eb557610eb5612bd4565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1603610f2557610a108582600160006118c7565b610a1f8582600060016118c7565b5050505050565b6040805180820182526000808252602080830182905283518085018552828152808201839052845180860186528381528083018490528551808701909652838652918501839052929382610f8d88612d24565b90507fffff00000000000000000000000000000000000000000000000000000000000080821690810161102857505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811683527f0000000000000000000000000000000000000000000000000000000000000000168152909350915060009050611330565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16141580156110d057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b15611107576040517ff861803000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008b8060200190518101906111209190612d7d565b77ffffffffffffffffffffffffffffffffffffffffffffffff91821698509116955063ffffffff1693505050428210159050611188576040517fb6c405f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808e16600090815260026020908152604080832089845282528083208f851684529091529020547f000000000000000000000000000000000000000000000000000000000000000090911687526112176111ff82670de0b6b3a7640000612def565b6112099086612e02565b670de0b6b3a7640000612128565b602088015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116908d16036112a45773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016885260208088015190890152611321565b6004546000906112c0906111ff90670de0b6b3a7640000612e19565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168a52905061131a61131083670de0b6b3a7640000612def565b6112099083612e02565b60208a0152505b96995094975094955050505050505b93509350939050565b611341611660565b6000818152600360205260408120549081900361138a576040517f03aad31200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600360205260408082208290558051600180825281830190925290816020015b60408051808201909152600080825260208201528152602001906001900390816113af57905050905060405180604001604052808481526020018377ffffffffffffffffffffffffffffffffffffffffffffffff168152508160008151811061141a5761141a612bd4565b60209081029190910101526040517fb0d9fa1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b0d9fa19906114999084903090600401612e8c565b600060405180830381600087803b1580156114b357600080fd5b505af11580156114c7573d6000803e3d6000fd5b50505050827f843f0b103e50b42b08f9d30f12f961845a6d02623730872e24644899c0dd9895836040516114fd91815260200190565b60405180910390a2505050565b611512611660565b61151b81612160565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161480159061157c575060005473ffffffffffffffffffffffffffffffffffffffff163314155b156115b3576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f14060f2300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906314060f239061162990869086908690600401612ec4565b600060405180830381600087803b15801561164357600080fd5b505af1158015611657573d6000803e3d6000fd5b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146116e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610aa7565b565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107449084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612255565b6040805180820190915260008082526020820152604080518082019091526000808252602082015260003073ffffffffffffffffffffffffffffffffffffffff851603611830576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061183e888a018a612f44565b91505060008161184d90612d24565b905060007e010000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008316146118a8576118a5888a018a612b38565b90505b6118b3878483610f3a565b955095509550505050955095509592505050565b60008267ffffffffffffffff8111156118e2576118e2612a05565b60405190808252806020026020018201604052801561192757816020015b60408051808201909152600080825260208201528152602001906001900390816119005790505b50905060008267ffffffffffffffff81111561194557611945612a05565b60405190808252806020026020018201604052801561198a57816020015b60408051808201909152600080825260208201528152602001906001900390816119635790505b50905060008080808061199d888a612e19565b905060005b81811015611cec577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b82815181106119f3576119f3612bd4565b6020026020010151602001516000015173ffffffffffffffffffffffffffffffffffffffff1603611ab95760405180604001604052808c8381518110611a3b57611a3b612bd4565b60200260200101516000015181526020018c8381518110611a5e57611a5e612bd4565b6020026020010151604001516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16815250888580611a9790612cd3565b965081518110611aa957611aa9612bd4565b6020026020010181905250611bae565b60405180604001604052808c8381518110611ad657611ad6612bd4565b60200260200101516000015181526020018c8381518110611af957611af9612bd4565b6020026020010151604001516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16815250878480611b3290612cd3565b955081518110611b4457611b44612bd4565b60200260200101819052508a8181518110611b6157611b61612bd4565b6020026020010151602001516020015186611b7c9190612e19565b95508a8181518110611b9057611b90612bd4565b6020026020010151604001516020015185611bab9190612e19565b94505b8a8181518110611bc057611bc0612bd4565b602002602001015160600151600014611cdc578b73ffffffffffffffffffffffffffffffffffffffff168b8281518110611bfc57611bfc612bd4565b6020026020010151600001517f88b15eb682210089cddf967648e2cb2a4535aeadc8f8f36050922e33c04e71258d8481518110611c3b57611c3b612bd4565b6020026020010151602001518e8581518110611c5957611c59612bd4565b6020026020010151604001518f8681518110611c7757611c77612bd4565b602002602001015160600151604051611cd393929190835173ffffffffffffffffffffffffffffffffffffffff908116825260209485015185830152835116604082015291909201516060820152608081019190915260a00190565b60405180910390a35b611ce581612cd3565b90506119a2565b5060003415611dba5734861115611d2f576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b158015611d9757600080fd5b505af1158015611dab573d6000803e3d6000fd5b50505050508534039050611e02565b8515611e0257611e0273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168d3089612361565b875115611e97577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b0d9fa19898e6040518363ffffffff1660e01b8152600401611e64929190612e8c565b600060405180830381600087803b158015611e7e57600080fd5b505af1158015611e92573d6000803e3d6000fd5b505050505b8651156120c3576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4c9190612d0b565b85111561201c5760005b8751811015611fdf57878181518110611f7157611f71612bd4565b60200260200101516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16600360008a8481518110611fad57611fad612bd4565b60209081029190910181015151825281019190915260400160002080549091019055611fd881612cd3565b9050611f56565b507ff52e5907b69d97c33392936c12d78b494463b78c5b72df50b4c497eee5720b678760405161200f9190612fe8565b60405180910390a16120c3565b6040517fb0d9fa1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b0d9fa1990612090908a903090600401612e8c565b600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b505050505b6120cd8c826120db565b505050505050505050505050565b80156121245760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610744573d6000803e3d6000fd5b5050565b60008215612156578161213c600185612def565b6121469190612ffb565b612151906001612e19565b612159565b60005b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036121df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610aa7565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006122b7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166123bf9092919063ffffffff16565b80519091501561074457808060200190518101906122d59190613036565b610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610aa7565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261068c9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611735565b60606123ce84846000856123d6565b949350505050565b606082471015612468576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610aa7565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516124919190613058565b60006040518083038185875af1925050503d80600081146124ce576040519150601f19603f3d011682016040523d82523d6000602084013e6124d3565b606091505b50915091506124e4878383876124ef565b979650505050505050565b6060831561258557825160000361257e5773ffffffffffffffffffffffffffffffffffffffff85163b61257e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aa7565b50816123ce565b6123ce838381511561259a5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa791906126da565b6040518060800160405280600080191681526020016126166040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b815260200161264e6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b8152602001600081525090565b60006020828403121561266d57600080fd5b5035919050565b60006020828403121561268657600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461215957600080fd5b60005b838110156126d15781810151838201526020016126b9565b50506000910152565b60208152600082518060208401526126f98160408501602087016126b6565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461151b57600080fd5b80356127588161272b565b919050565b77ffffffffffffffffffffffffffffffffffffffffffffffff8116811461151b57600080fd5b60008060006060848603121561279857600080fd5b83356127a38161272b565b925060208401356127b38161272b565b915060408401356127c38161275d565b809150509250925092565b803567ffffffffffffffff8116811461275857600080fd5b6000602082840312156127f857600080fd5b612159826127ce565b60008083601f84011261281357600080fd5b50813567ffffffffffffffff81111561282b57600080fd5b60208301915083602082850101111561284357600080fd5b9250929050565b60008060008060006060868803121561286257600080fd5b853567ffffffffffffffff8082111561287a57600080fd5b818801915088601f83011261288e57600080fd5b81358181111561289d57600080fd5b8960208260051b85010111156128b257600080fd5b6020928301975095509087013590808211156128cd57600080fd5b506128da88828901612801565b90945092506128ed90506040870161274d565b90509295509295909350565b60008060006060848603121561290e57600080fd5b83356129198161272b565b92506020840135915060408401356127c38161272b565b6000806000806080858703121561294657600080fd5b84356129518161272b565b93506020850135925060408501356129688161272b565b9150612976606086016127ce565b905092959194509250565b60008060008060006060868803121561299957600080fd5b853567ffffffffffffffff808211156129b157600080fd5b6129bd89838a01612801565b909750955060208801359150808211156129d657600080fd5b506129e388828901612801565b90945092505060408601356129f78161272b565b809150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612a4557600080fd5b813567ffffffffffffffff80821115612a6057612a60612a05565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612aa657612aa6612a05565b81604052838152866020858801011115612abf57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612af457600080fd5b8335612aff8161272b565b9250602084013567ffffffffffffffff811115612b1b57600080fd5b612b2786828701612a34565b92505060408401356127c38161272b565b600060208284031215612b4a57600080fd5b81356121598161272b565b600080600060408486031215612b6a57600080fd5b83359250602084013567ffffffffffffffff80821115612b8957600080fd5b818601915086601f830112612b9d57600080fd5b813581811115612bac57600080fd5b8760208260061b8501011115612bc157600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612c3857600080fd5b83018035915067ffffffffffffffff821115612c5357600080fd5b60200191503681900382131561284357600080fd5b803560208310156105af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d0457612d04612ca4565b5060010190565b600060208284031215612d1d57600080fd5b5051919050565b80516020808301519190811015612d63577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b805163ffffffff8116811461275857600080fd5b60008060008060008060c08789031215612d9657600080fd5b86519550612da660208801612d69565b9450612db460408801612d69565b93506060870151612dc48161275d565b6080880151909350612dd58161275d565b9150612de360a08801612d69565b90509295509295509295565b818103818111156105af576105af612ca4565b80820281158282048414176105af576105af612ca4565b808201808211156105af576105af612ca4565b600081518084526020808501945080840160005b83811015612e815781518051885283015177ffffffffffffffffffffffffffffffffffffffffffffffff168388015260409096019590820190600101612e40565b509495945050505050565b604081526000612e9f6040830185612e2c565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b8381526040602080830182905282820184905260009190859060608501845b87811015612f37578335612ef68161272b565b73ffffffffffffffffffffffffffffffffffffffff16825267ffffffffffffffff612f228585016127ce565b16828401529284019290840190600101612ee3565b5098975050505050505050565b60008060808385031215612f5757600080fd5b83601f840112612f6657600080fd5b6040516060810167ffffffffffffffff8282108183111715612f8a57612f8a612a05565b816040528291506060860187811115612fa257600080fd5b865b81811015612fbc578035845260209384019301612fa4565b5092945091359180831115612fd057600080fd5b5050612fde85828601612a34565b9150509250929050565b6020815260006121596020830184612e2c565b600082613031577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561304857600080fd5b8151801515811461215957600080fd5b6000825161306a8184602087016126b6565b919091019291505056fea164736f6c6343000813000a",
}
var FeeManagerABI = FeeManagerMetaData.ABI
diff --git a/core/gethwrappers/llo-feeds/generated/reward_manager/reward_manager.go b/core/gethwrappers/llo-feeds/generated/reward_manager/reward_manager.go
index c870a403016..5b2a72f4e0c 100644
--- a/core/gethwrappers/llo-feeds/generated/reward_manager/reward_manager.go
+++ b/core/gethwrappers/llo-feeds/generated/reward_manager/reward_manager.go
@@ -42,7 +42,7 @@ type IRewardManagerFeePayment struct {
var RewardManagerMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"linkAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPoolId\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPoolLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWeights\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeManagerAddress\",\"type\":\"address\"}],\"name\":\"FeeManagerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"internalType\":\"uint192\",\"name\":\"amount\",\"type\":\"uint192\"}],\"indexed\":false,\"internalType\":\"structIRewardManager.FeePayment[]\",\"name\":\"payments\",\"type\":\"tuple[]\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"}],\"name\":\"FeePaid\",\"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\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"indexed\":false,\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"newRewardRecipients\",\"type\":\"tuple[]\"}],\"name\":\"RewardRecipientsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint192\",\"name\":\"quantity\",\"type\":\"uint192\"}],\"name\":\"RewardsClaimed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"poolIds\",\"type\":\"bytes32[]\"}],\"name\":\"claimRewards\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endIndex\",\"type\":\"uint256\"}],\"name\":\"getAvailableRewardPoolIds\",\"outputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_linkAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"internalType\":\"uint192\",\"name\":\"amount\",\"type\":\"uint192\"}],\"internalType\":\"structIRewardManager.FeePayment[]\",\"name\":\"payments\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"payer\",\"type\":\"address\"}],\"name\":\"onFeePaid\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"recipients\",\"type\":\"address[]\"}],\"name\":\"payRecipients\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeManagerAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"s_registeredPoolIds\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"s_rewardRecipientWeights\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_rewardRecipientWeightsSet\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_totalRewardRecipientFees\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"s_totalRewardRecipientFeesLastClaimedAmounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newFeeManagerAddress\",\"type\":\"address\"}],\"name\":\"setFeeManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"rewardRecipientAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setRewardRecipients\",\"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\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"newRewardRecipients\",\"type\":\"tuple[]\"}],\"name\":\"updateRewardRecipients\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b50604051620020c2380380620020c28339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e95760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b608051611ec062000202600039600081816103bd01528181610ce30152610f1e0152611ec06000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80634d322084116100cd5780638da5cb5b11610081578063cd5f729211610066578063cd5f7292146103a5578063ea4b861b146103b8578063f2fde38b146103df57600080fd5b80638da5cb5b14610374578063b0d9fa191461039257600080fd5b806360122608116100b2578063601226081461031657806379ba5097146103415780638ac85a5c1461034957600080fd5b80634d322084146102e057806359256201146102f357600080fd5b8063276e7660116101245780634722647511610109578063472264751461029a578063472d35b9146102ba5780634944832f146102cd57600080fd5b8063276e76601461022757806339ee81e11461026c57600080fd5b806301ffc9a7146101565780630f3c34d1146101c057806314060f23146101d5578063181f5a77146101e8575b600080fd5b6101ab6101643660046117ac565b7fffffffff00000000000000000000000000000000000000000000000000000000167fb0d9fa19000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b6101d36101ce36600461186c565b6103f2565b005b6101d36101e336600461195e565b610400565b604080518082018252601381527f5265776172644d616e6167657220312e312e3000000000000000000000000000602082015290516101b791906119ce565b6007546102479073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b61028c61027a366004611a1f565b60026020526000908152604090205481565b6040519081526020016101b7565b6102ad6102a8366004611a61565b6105b6565b6040516101b79190611a94565b6101d36102c8366004611ad8565b610740565b6101d36102db36600461195e565b61080e565b6101d36102ee366004611afa565b610957565b6101ab610301366004611a1f565b60056020526000908152604090205460ff1681565b61028c610324366004611b79565b600360209081526000928352604080842090915290825290205481565b6101d3610a96565b61028c610357366004611b79565b600460209081526000928352604080842090915290825290205481565b60005473ffffffffffffffffffffffffffffffffffffffff16610247565b6101d36103a0366004611ba5565b610b98565b61028c6103b3366004611a1f565b610d4c565b6102477f000000000000000000000000000000000000000000000000000000000000000081565b6101d36103ed366004611ad8565b610d6d565b6103fc3382610d81565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590610440575060075473ffffffffffffffffffffffffffffffffffffffff163314155b15610477576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008190036104b2576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526005602052604090205460ff16156104fb576040517f0afa7ee800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01849055600084815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055610577838383670de0b6b3a7640000610f4e565b827f8f668d6090683f98b3373a8b83d214da45737f7486cb7de554cc07b54e61cfe683836040516105a9929190611c11565b60405180910390a2505050565b60065460609060008184116105cb57836105cd565b815b905080851115610609576040517fa22caccc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006106158683611ca8565b67ffffffffffffffff81111561062d5761062d6117ee565b604051908082528060200260200182016040528015610656578160200160208202803683370190505b5090506000865b838110156107335760006006828154811061067a5761067a611cbb565b600091825260208083209091015480835260048252604080842073ffffffffffffffffffffffffffffffffffffffff8f16855290925291205490915015610722576000818152600260209081526040808320546003835281842073ffffffffffffffffffffffffffffffffffffffff8f168552909252909120548114610720578185858060010196508151811061071357610713611cbb565b6020026020010181815250505b505b5061072c81611cea565b905061065d565b5090979650505050505050565b610748611125565b73ffffffffffffffffffffffffffffffffffffffff8116610795576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fe45f5e140399b0a7e12971ab020724b828fbed8ac408c420884dc7d1bbe506b49060200160405180910390a150565b610816611125565b60408051600180825281830190925260009160208083019080368337019050509050838160008151811061084c5761084c611cbb565b6020026020010181815250506000805b8381101561090957600085858381811061087857610878611cbb565b61088e9260206040909202019081019150611ad8565b600088815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff851684529091529020549091506108f28787858181106108d6576108d6611cbb565b6108ec9260206040909202019081019150611ad8565b86610d81565b5092909201915061090281611cea565b905061085c565b5061091685858584610f4e565b847f8f668d6090683f98b3373a8b83d214da45737f7486cb7de554cc07b54e61cfe68585604051610948929190611c11565b60405180910390a25050505050565b8261097760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156109c957506000818152600460209081526040808320338452909152902054155b15610a00576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001808252818301909252600091602080830190803683370190505090508481600081518110610a3657610a36611cbb565b60200260200101818152505060005b83811015610a8e57610a7d858583818110610a6257610a62611cbb565b9050602002016020810190610a779190611ad8565b83610d81565b50610a8781611cea565b9050610a45565b505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60075473ffffffffffffffffffffffffffffffffffffffff163314610be9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b83811015610cc857848482818110610c0757610c07611cbb565b9050604002016020016020810190610c1f9190611d4a565b77ffffffffffffffffffffffffffffffffffffffffffffffff1660026000878785818110610c4f57610c4f611cbb565b6040908102929092013583525060208201929092520160002080549091019055848482818110610c8157610c81611cbb565b9050604002016020016020810190610c999190611d4a565b77ffffffffffffffffffffffffffffffffffffffffffffffff168201915080610cc190611cea565b9050610bed565b50610d0b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168330846111a8565b7fa1cc025ea76bacce5d740ee4bc331899375dc2c5f2ab33933aaacbd9ba001b66848484604051610d3e93929190611d65565b60405180910390a150505050565b60068181548110610d5c57600080fd5b600091825260209091200154905081565b610d75611125565b610d7e8161128a565b50565b60008060005b8351811015610efd576000848281518110610da457610da4611cbb565b6020026020010151905060006002600083815260200190815260200160002054905080600003610dd5575050610eed565b600082815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b16808552908352818420548685526004845282852091855292528220549083039190670de0b6b3a764000090830204905080600003610e3e5750505050610eed565b600084815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d168085529252909120849055885196820196899087908110610e8957610e89611cbb565b60200260200101517f989969655bc1d593922527fe85d71347bb8e12fa423cc71f362dd8ef7cb10ef283604051610ee0919077ffffffffffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405180910390a3505050505b610ef681611cea565b9050610d87565b508015610f4557610f4573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016858361137f565b90505b92915050565b610fa98383808060200260200160405190810160405280939291908181526020016000905b82821015610f9f57610f9060408302860136819003810190611dec565b81526020019060010190610f73565b50505050506113da565b15610fe0576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b838110156110e457600085858381811061100057611000611cbb565b90506040020160200160208101906110189190611e47565b67ffffffffffffffff169050600086868481811061103857611038611cbb565b61104e9260206040909202019081019150611ad8565b905073ffffffffffffffffffffffffffffffffffffffff811661109d576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522081905591909101906110dd81611cea565b9050610fe4565b5081811461111e576040517f84677ce800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b13565b565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526112849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611491565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff821603611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b13565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113d59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611202565b505050565b6000805b82518110156114885760006113f4826001611e62565b90505b835181101561147f5783818151811061141257611412611cbb565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1684838151811061144657611446611cbb565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1603611477575060019392505050565b6001016113f7565b506001016113de565b50600092915050565b60006114f3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661159d9092919063ffffffff16565b8051909150156113d557808060200190518101906115119190611e75565b6113d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b13565b60606115ac84846000856115b4565b949350505050565b606082471015611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b13565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161166f9190611e97565b60006040518083038185875af1925050503d80600081146116ac576040519150601f19603f3d011682016040523d82523d6000602084013e6116b1565b606091505b50915091506116c2878383876116cd565b979650505050505050565b6060831561176357825160000361175c5773ffffffffffffffffffffffffffffffffffffffff85163b61175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b13565b50816115ac565b6115ac83838151156117785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1391906119ce565b6000602082840312156117be57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f4557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611864576118646117ee565b604052919050565b6000602080838503121561187f57600080fd5b823567ffffffffffffffff8082111561189757600080fd5b818501915085601f8301126118ab57600080fd5b8135818111156118bd576118bd6117ee565b8060051b91506118ce84830161181d565b81815291830184019184810190888411156118e857600080fd5b938501935b83851015611906578435825293850193908501906118ed565b98975050505050505050565b60008083601f84011261192457600080fd5b50813567ffffffffffffffff81111561193c57600080fd5b6020830191508360208260061b850101111561195757600080fd5b9250929050565b60008060006040848603121561197357600080fd5b83359250602084013567ffffffffffffffff81111561199157600080fd5b61199d86828701611912565b9497909650939450505050565b60005b838110156119c55781810151838201526020016119ad565b50506000910152565b60208152600082518060208401526119ed8160408501602087016119aa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600060208284031215611a3157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a5c57600080fd5b919050565b600080600060608486031215611a7657600080fd5b611a7f84611a38565b95602085013595506040909401359392505050565b6020808252825182820181905260009190848201906040850190845b81811015611acc57835183529284019291840191600101611ab0565b50909695505050505050565b600060208284031215611aea57600080fd5b611af382611a38565b9392505050565b600080600060408486031215611b0f57600080fd5b83359250602084013567ffffffffffffffff80821115611b2e57600080fd5b818601915086601f830112611b4257600080fd5b813581811115611b5157600080fd5b8760208260051b8501011115611b6657600080fd5b6020830194508093505050509250925092565b60008060408385031215611b8c57600080fd5b82359150611b9c60208401611a38565b90509250929050565b600080600060408486031215611bba57600080fd5b833567ffffffffffffffff811115611bd157600080fd5b611bdd86828701611912565b9094509250611bf0905060208501611a38565b90509250925092565b803567ffffffffffffffff81168114611a5c57600080fd5b6020808252818101839052600090604080840186845b878110156107335773ffffffffffffffffffffffffffffffffffffffff611c4d83611a38565b16835267ffffffffffffffff611c64868401611bf9565b16838601529183019190830190600101611c27565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610f4857610f48611c79565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d1b57611d1b611c79565b5060010190565b803577ffffffffffffffffffffffffffffffffffffffffffffffff81168114611a5c57600080fd5b600060208284031215611d5c57600080fd5b611af382611d22565b60408082528181018490526000908560608401835b87811015611dc15782358252602077ffffffffffffffffffffffffffffffffffffffffffffffff611dac828601611d22565b16908301529183019190830190600101611d7a565b5080935050505073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b600060408284031215611dfe57600080fd5b6040516040810181811067ffffffffffffffff82111715611e2157611e216117ee565b604052611e2d83611a38565b8152611e3b60208401611bf9565b60208201529392505050565b600060208284031215611e5957600080fd5b611af382611bf9565b80820180821115610f4857610f48611c79565b600060208284031215611e8757600080fd5b81518015158114610f4557600080fd5b60008251611ea98184602087016119aa565b919091019291505056fea164736f6c6343000810000a",
+ Bin: "0x60a06040523480156200001157600080fd5b50604051620020c2380380620020c28339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e95760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b608051611ec062000202600039600081816103bd01528181610ce30152610f1e0152611ec06000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c80634d322084116100cd5780638da5cb5b11610081578063cd5f729211610066578063cd5f7292146103a5578063ea4b861b146103b8578063f2fde38b146103df57600080fd5b80638da5cb5b14610374578063b0d9fa191461039257600080fd5b806360122608116100b2578063601226081461031657806379ba5097146103415780638ac85a5c1461034957600080fd5b80634d322084146102e057806359256201146102f357600080fd5b8063276e7660116101245780634722647511610109578063472264751461029a578063472d35b9146102ba5780634944832f146102cd57600080fd5b8063276e76601461022757806339ee81e11461026c57600080fd5b806301ffc9a7146101565780630f3c34d1146101c057806314060f23146101d5578063181f5a77146101e8575b600080fd5b6101ab6101643660046117ac565b7fffffffff00000000000000000000000000000000000000000000000000000000167fb0d9fa19000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b6101d36101ce36600461186c565b6103f2565b005b6101d36101e336600461195e565b610400565b604080518082018252601381527f5265776172644d616e6167657220312e312e3000000000000000000000000000602082015290516101b791906119ce565b6007546102479073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101b7565b61028c61027a366004611a1f565b60026020526000908152604090205481565b6040519081526020016101b7565b6102ad6102a8366004611a61565b6105b6565b6040516101b79190611a94565b6101d36102c8366004611ad8565b610740565b6101d36102db36600461195e565b61080e565b6101d36102ee366004611afa565b610957565b6101ab610301366004611a1f565b60056020526000908152604090205460ff1681565b61028c610324366004611b79565b600360209081526000928352604080842090915290825290205481565b6101d3610a96565b61028c610357366004611b79565b600460209081526000928352604080842090915290825290205481565b60005473ffffffffffffffffffffffffffffffffffffffff16610247565b6101d36103a0366004611ba5565b610b98565b61028c6103b3366004611a1f565b610d4c565b6102477f000000000000000000000000000000000000000000000000000000000000000081565b6101d36103ed366004611ad8565b610d6d565b6103fc3382610d81565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314801590610440575060075473ffffffffffffffffffffffffffffffffffffffff163314155b15610477576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008190036104b2576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526005602052604090205460ff16156104fb576040517f0afa7ee800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006805460018181019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01849055600084815260056020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055610577838383670de0b6b3a7640000610f4e565b827f8f668d6090683f98b3373a8b83d214da45737f7486cb7de554cc07b54e61cfe683836040516105a9929190611c11565b60405180910390a2505050565b60065460609060008184116105cb57836105cd565b815b905080851115610609576040517fa22caccc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006106158683611ca8565b67ffffffffffffffff81111561062d5761062d6117ee565b604051908082528060200260200182016040528015610656578160200160208202803683370190505b5090506000865b838110156107335760006006828154811061067a5761067a611cbb565b600091825260208083209091015480835260048252604080842073ffffffffffffffffffffffffffffffffffffffff8f16855290925291205490915015610722576000818152600260209081526040808320546003835281842073ffffffffffffffffffffffffffffffffffffffff8f168552909252909120548114610720578185858060010196508151811061071357610713611cbb565b6020026020010181815250505b505b5061072c81611cea565b905061065d565b5090979650505050505050565b610748611125565b73ffffffffffffffffffffffffffffffffffffffff8116610795576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fe45f5e140399b0a7e12971ab020724b828fbed8ac408c420884dc7d1bbe506b49060200160405180910390a150565b610816611125565b60408051600180825281830190925260009160208083019080368337019050509050838160008151811061084c5761084c611cbb565b6020026020010181815250506000805b8381101561090957600085858381811061087857610878611cbb565b61088e9260206040909202019081019150611ad8565b600088815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff851684529091529020549091506108f28787858181106108d6576108d6611cbb565b6108ec9260206040909202019081019150611ad8565b86610d81565b5092909201915061090281611cea565b905061085c565b5061091685858584610f4e565b847f8f668d6090683f98b3373a8b83d214da45737f7486cb7de554cc07b54e61cfe68585604051610948929190611c11565b60405180910390a25050505050565b8261097760005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156109c957506000818152600460209081526040808320338452909152902054155b15610a00576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516001808252818301909252600091602080830190803683370190505090508481600081518110610a3657610a36611cbb565b60200260200101818152505060005b83811015610a8e57610a7d858583818110610a6257610a62611cbb565b9050602002016020810190610a779190611ad8565b83610d81565b50610a8781611cea565b9050610a45565b505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b1c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60075473ffffffffffffffffffffffffffffffffffffffff163314610be9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b83811015610cc857848482818110610c0757610c07611cbb565b9050604002016020016020810190610c1f9190611d4a565b77ffffffffffffffffffffffffffffffffffffffffffffffff1660026000878785818110610c4f57610c4f611cbb565b6040908102929092013583525060208201929092520160002080549091019055848482818110610c8157610c81611cbb565b9050604002016020016020810190610c999190611d4a565b77ffffffffffffffffffffffffffffffffffffffffffffffff168201915080610cc190611cea565b9050610bed565b50610d0b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168330846111a8565b7fa1cc025ea76bacce5d740ee4bc331899375dc2c5f2ab33933aaacbd9ba001b66848484604051610d3e93929190611d65565b60405180910390a150505050565b60068181548110610d5c57600080fd5b600091825260209091200154905081565b610d75611125565b610d7e8161128a565b50565b60008060005b8351811015610efd576000848281518110610da457610da4611cbb565b6020026020010151905060006002600083815260200190815260200160002054905080600003610dd5575050610eed565b600082815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8b16808552908352818420548685526004845282852091855292528220549083039190670de0b6b3a764000090830204905080600003610e3e5750505050610eed565b600084815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8d168085529252909120849055885196820196899087908110610e8957610e89611cbb565b60200260200101517f989969655bc1d593922527fe85d71347bb8e12fa423cc71f362dd8ef7cb10ef283604051610ee0919077ffffffffffffffffffffffffffffffffffffffffffffffff91909116815260200190565b60405180910390a3505050505b610ef681611cea565b9050610d87565b508015610f4557610f4573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016858361137f565b90505b92915050565b610fa98383808060200260200160405190810160405280939291908181526020016000905b82821015610f9f57610f9060408302860136819003810190611dec565b81526020019060010190610f73565b50505050506113da565b15610fe0576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805b838110156110e457600085858381811061100057611000611cbb565b90506040020160200160208101906110189190611e47565b67ffffffffffffffff169050600086868481811061103857611038611cbb565b61104e9260206040909202019081019150611ad8565b905073ffffffffffffffffffffffffffffffffffffffff811661109d576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600088815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff90941683529290522081905591909101906110dd81611cea565b9050610fe4565b5081811461111e576040517f84677ce800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610b13565b565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526112849085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611491565b50505050565b3373ffffffffffffffffffffffffffffffffffffffff821603611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610b13565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113d59084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611202565b505050565b6000805b82518110156114885760006113f4826001611e62565b90505b835181101561147f5783818151811061141257611412611cbb565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1684838151811061144657611446611cbb565b60200260200101516000015173ffffffffffffffffffffffffffffffffffffffff1603611477575060019392505050565b6001016113f7565b506001016113de565b50600092915050565b60006114f3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661159d9092919063ffffffff16565b8051909150156113d557808060200190518101906115119190611e75565b6113d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b13565b60606115ac84846000856115b4565b949350505050565b606082471015611646576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b13565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161166f9190611e97565b60006040518083038185875af1925050503d80600081146116ac576040519150601f19603f3d011682016040523d82523d6000602084013e6116b1565b606091505b50915091506116c2878383876116cd565b979650505050505050565b6060831561176357825160000361175c5773ffffffffffffffffffffffffffffffffffffffff85163b61175c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b13565b50816115ac565b6115ac83838151156117785781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1391906119ce565b6000602082840312156117be57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f4557600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611864576118646117ee565b604052919050565b6000602080838503121561187f57600080fd5b823567ffffffffffffffff8082111561189757600080fd5b818501915085601f8301126118ab57600080fd5b8135818111156118bd576118bd6117ee565b8060051b91506118ce84830161181d565b81815291830184019184810190888411156118e857600080fd5b938501935b83851015611906578435825293850193908501906118ed565b98975050505050505050565b60008083601f84011261192457600080fd5b50813567ffffffffffffffff81111561193c57600080fd5b6020830191508360208260061b850101111561195757600080fd5b9250929050565b60008060006040848603121561197357600080fd5b83359250602084013567ffffffffffffffff81111561199157600080fd5b61199d86828701611912565b9497909650939450505050565b60005b838110156119c55781810151838201526020016119ad565b50506000910152565b60208152600082518060208401526119ed8160408501602087016119aa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b600060208284031215611a3157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a5c57600080fd5b919050565b600080600060608486031215611a7657600080fd5b611a7f84611a38565b95602085013595506040909401359392505050565b6020808252825182820181905260009190848201906040850190845b81811015611acc57835183529284019291840191600101611ab0565b50909695505050505050565b600060208284031215611aea57600080fd5b611af382611a38565b9392505050565b600080600060408486031215611b0f57600080fd5b83359250602084013567ffffffffffffffff80821115611b2e57600080fd5b818601915086601f830112611b4257600080fd5b813581811115611b5157600080fd5b8760208260051b8501011115611b6657600080fd5b6020830194508093505050509250925092565b60008060408385031215611b8c57600080fd5b82359150611b9c60208401611a38565b90509250929050565b600080600060408486031215611bba57600080fd5b833567ffffffffffffffff811115611bd157600080fd5b611bdd86828701611912565b9094509250611bf0905060208501611a38565b90509250925092565b803567ffffffffffffffff81168114611a5c57600080fd5b6020808252818101839052600090604080840186845b878110156107335773ffffffffffffffffffffffffffffffffffffffff611c4d83611a38565b16835267ffffffffffffffff611c64868401611bf9565b16838601529183019190830190600101611c27565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610f4857610f48611c79565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d1b57611d1b611c79565b5060010190565b803577ffffffffffffffffffffffffffffffffffffffffffffffff81168114611a5c57600080fd5b600060208284031215611d5c57600080fd5b611af382611d22565b60408082528181018490526000908560608401835b87811015611dc15782358252602077ffffffffffffffffffffffffffffffffffffffffffffffff611dac828601611d22565b16908301529183019190830190600101611d7a565b5080935050505073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b600060408284031215611dfe57600080fd5b6040516040810181811067ffffffffffffffff82111715611e2157611e216117ee565b604052611e2d83611a38565b8152611e3b60208401611bf9565b60208201529392505050565b600060208284031215611e5957600080fd5b611af382611bf9565b80820180821115610f4857610f48611c79565b600060208284031215611e8757600080fd5b81518015158114610f4557600080fd5b60008251611ea98184602087016119aa565b919091019291505056fea164736f6c6343000813000a",
}
var RewardManagerABI = RewardManagerMetaData.ABI
diff --git a/core/gethwrappers/llo-feeds/generated/verifier/verifier.go b/core/gethwrappers/llo-feeds/generated/verifier/verifier.go
index 09bf78b23b5..f9ea852dc62 100644
--- a/core/gethwrappers/llo-feeds/generated/verifier/verifier.go
+++ b/core/gethwrappers/llo-feeds/generated/verifier/verifier.go
@@ -37,7 +37,7 @@ type CommonAddressAndWeight struct {
var VerifierMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifierProxyAddr\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadVerification\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"CannotDeactivateLatestConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DigestEmpty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"DigestInactive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"DigestNotSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxSigners\",\"type\":\"uint256\"}],\"name\":\"ExcessSigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FaultToleranceMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeedIdEmpty\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"InactiveFeed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"expectedNumSigners\",\"type\":\"uint256\"}],\"name\":\"IncorrectSignatureCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"numSigners\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minSigners\",\"type\":\"uint256\"}],\"name\":\"InsufficientSigners\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"InvalidFeed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"rsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"ssLength\",\"type\":\"uint256\"}],\"name\":\"MismatchedSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"ConfigDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint32\",\"name\":\"previousConfigBlockNumber\",\"type\":\"uint32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"bytes32[]\",\"name\":\"offchainTransmitters\",\"type\":\"bytes32[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"FeedActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"FeedDeactivated\",\"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\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"requester\",\"type\":\"address\"}],\"name\":\"ReportVerified\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"activateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"activateFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"deactivateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"deactivateFeed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"configCount\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"blockNumber\",\"type\":\"uint32\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"}],\"name\":\"latestConfigDigestAndEpoch\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"scanLogs\",\"type\":\"bool\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"epoch\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"offchainTransmitters\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"recipientAddressesAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"sourceChainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"sourceAddress\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"newConfigCount\",\"type\":\"uint32\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"offchainTransmitters\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"f\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"recipientAddressesAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setConfigFromSource\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isVerifier\",\"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\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"signedReport\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"verifierResponse\",\"type\":\"bytes\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b50604051620023fb380380620023fb8339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e95760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b608051612200620001fb6000396000818161033b015261131501526122006000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806394d959801161008c578063e7db9c2a11610066578063e7db9c2a1461028b578063e84f128e1461029e578063f0107221146102fb578063f2fde38b1461030e57600080fd5b806394d9598014610206578063b70d929d14610219578063ded6307c1461027857600080fd5b80633dd86430116100c85780633dd86430146101ae578063564a0a7a146101c357806379ba5097146101d65780638da5cb5b146101de57600080fd5b806301ffc9a7146100ef578063181f5a77146101595780633d3ac1b51461019b575b600080fd5b6101446100fd3660046115da565b7fffffffff00000000000000000000000000000000000000000000000000000000167f3d3ac1b5000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b60408051808201909152600e81527f566572696669657220312e322e3000000000000000000000000000000000000060208201525b6040516101509190611687565b61018e6101a93660046116c3565b610321565b6101c16101bc366004611744565b6104bb565b005b6101c16101d1366004611744565b61056d565b6101c161062e565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610150565b6101c161021436600461175d565b61072b565b610255610227366004611744565b6000908152600260205260408120600181015490549192909168010000000000000000900463ffffffff1690565b604080519315158452602084019290925263ffffffff1690820152606001610150565b6101c161028636600461175d565b61088c565b6101c1610299366004611a92565b61099d565b6102d86102ac366004611744565b6000908152600260205260409020805460019091015463ffffffff808316936401000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610150565b6101c1610309366004611bc5565b610aaf565b6101c161031c366004611cc2565b610b79565b60603373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610392576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080806103a4888a018a611cdd565b945094509450945094506000846103ba90611db8565b60008181526002602052604090208054919250906c01000000000000000000000000900460ff1615610420576040517f36dbe748000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b86516000818152600283016020526040902061043f8483898985610b8d565b6104498984610c89565b8751602089012061045e818b8a8a8a87610cf1565b60405173ffffffffffffffffffffffffffffffffffffffff8d16815285907f58ca9502e98a536e06e72d680fcc251e5d10b72291a281665a2c2dc0ac30fcc59060200160405180910390a250969c9b505050505050505050505050565b6104c3610f6d565b60008181526002602052604081208054909163ffffffff9091169003610518576040517fa25b0b9600000000000000000000000000000000000000000000000000000000815260048101839052602401610417565b80547fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff16815560405182907ff438564f793525caa89c6e3a26d41e16aa39d1e589747595751e3f3df75cb2b490600090a25050565b610575610f6d565b60008181526002602052604081208054909163ffffffff90911690036105ca576040517fa25b0b9600000000000000000000000000000000000000000000000000000000815260048101839052602401610417565b80547fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff166c0100000000000000000000000017815560405182907ffc4f79b8c65b6be1773063461984c0974400d1e99654c79477a092ace83fd06190600090a25050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146106af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610417565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610733610f6d565b600082815260026020526040902081610778576040517fe332262700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260028201602052604081205460ff1690036107ce576040517f8bca63110000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610417565b80600101548203610815576040517fa403c0160000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610417565b60008281526002820160205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555183907f0e173bea63a8c59ec70bf87043f2a729693790183f16a1a54b705de9e989cc4c9061087f9085815260200190565b60405180910390a2505050565b610894610f6d565b6000828152600260205260409020816108d9576040517fe332262700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260028201602052604081205460ff16900361092f576040517f8bca63110000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610417565b60008281526002820160205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555183907f54f8872b9b94ebea6577f33576d55847bd8ea22641ccc886b965f6e50bfe77469061087f9085815260200190565b86518560ff16806000036109dd576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f821115610a22576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101839052601f6024820152604401610417565b610a2d816003611e5b565b8211610a855781610a3f826003611e5b565b610a4a906001611e98565b6040517f9dd9e6d800000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610417565b610a8d610f6d565b610aa08d8d8d8d8d8d8d8d8d8d8d610ff0565b50505050505050505050505050565b86518560ff1680600003610aef576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f821115610b34576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101839052601f6024820152604401610417565b610b3f816003611e5b565b8211610b515781610a3f826003611e5b565b610b59610f6d565b610b6d8a463060008d8d8d8d8d8d8d610ff0565b50505050505050505050565b610b81610f6d565b610b8a81611437565b50565b8054600090610ba09060ff166001611eb1565b8254909150610100900460ff16610bed576040517ffc10a2830000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610417565b8060ff16845114610c395783516040517f5348a282000000000000000000000000000000000000000000000000000000008152600481019190915260ff82166024820152604401610417565b8251845114610c8157835183516040517ff0d3140800000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610417565b505050505050565b6020820151815463ffffffff600883901c81169168010000000000000000900416811115610ceb5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff166801000000000000000063ffffffff8316021783555b50505050565b60008686604051602001610d06929190611eca565b6040516020818303038152906040528051906020012090506000610d3a604080518082019091526000808252602082015290565b8651600090815b81811015610f0557600186898360208110610d5e57610d5e611dfd565b610d6b91901a601b611eb1565b8c8481518110610d7d57610d7d611dfd565b60200260200101518c8581518110610d9757610d97611dfd565b602002602001015160405160008152602001604052604051610dd5949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610df7573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526001808d01602090815291859020848601909552845460ff808216865293995093955090850192610100900490911690811115610e7c57610e7c611f06565b6001811115610e8d57610e8d611f06565b9052509350600184602001516001811115610eaa57610eaa611f06565b14610ee1576040517f4df18f0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000015160080260ff166001901b8501945080610efe90611f35565b9050610d41565b50837e01010101010101010101010101010101010101010101010101010101010101851614610f60576040517f4df18f0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610417565b565b60008b815260026020526040902063ffffffff89161561103d5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8a16178155611071565b805463ffffffff1681600061105183611f6d565b91906101000a81548163ffffffff021916908363ffffffff160217905550505b8054600090611091908e908e908e9063ffffffff168d8d8d8d8d8d61152c565b6000818152600284016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8b16176101001790559091505b89518160ff1610156112d25760008a8260ff16815181106110f7576110f7611dfd565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611167576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000858152600287016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452600190810190925290912054610100900460ff16908111156111ba576111ba611f06565b14801591506111f5576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8416815260208101600190526000858152600287016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684526001908101835292208351815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681178355928501519193919284927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090921617906101009084908111156112b7576112b7611f06565b02179055509050505050806112cb90611f90565b90506110d4565b5060018201546040517fb011b24700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163b011b2479161134d919085908890600401611faf565b600060405180830381600087803b15801561136757600080fd5b505af115801561137b573d6000803e3d6000fd5b505050508c7fa23a88453230b183877098801ff5a8f771a120e2573eea559ce6c4c2e305a4da8360000160049054906101000a900463ffffffff16838560000160009054906101000a900463ffffffff168d8d8d8d8d8d6040516113e7999897969594939291906120b0565b60405180910390a281547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff1664010000000063ffffffff4316021782556001909101555050505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036114b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610417565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000808b8b8b8b8b8b8b8b8b8b6040516020016115529a99989796959493929190612146565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e06000000000000000000000000000000000000000000000000000000000000179150509a9950505050505050505050565b6000602082840312156115ec57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461161c57600080fd5b9392505050565b6000815180845260005b818110156116495760208185018101518683018201520161162d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061161c6020830184611623565b803573ffffffffffffffffffffffffffffffffffffffff811681146116be57600080fd5b919050565b6000806000604084860312156116d857600080fd5b833567ffffffffffffffff808211156116f057600080fd5b818601915086601f83011261170457600080fd5b81358181111561171357600080fd5b87602082850101111561172557600080fd5b60209283019550935061173b918601905061169a565b90509250925092565b60006020828403121561175657600080fd5b5035919050565b6000806040838503121561177057600080fd5b50508035926020909101359150565b803563ffffffff811681146116be57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156117e5576117e5611793565b60405290565b6040516060810167ffffffffffffffff811182821017156117e5576117e5611793565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561185557611855611793565b604052919050565b600067ffffffffffffffff82111561187757611877611793565b5060051b60200190565b600082601f83011261189257600080fd5b813560206118a76118a28361185d565b61180e565b82815260059290921b840181019181810190868411156118c657600080fd5b8286015b848110156118e8576118db8161169a565b83529183019183016118ca565b509695505050505050565b600082601f83011261190457600080fd5b813560206119146118a28361185d565b82815260059290921b8401810191818101908684111561193357600080fd5b8286015b848110156118e85780358352918301918301611937565b803560ff811681146116be57600080fd5b600082601f83011261197057600080fd5b813567ffffffffffffffff81111561198a5761198a611793565b6119bb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161180e565b8181528460208386010111156119d057600080fd5b816020850160208301376000918101602001919091529392505050565b803567ffffffffffffffff811681146116be57600080fd5b600082601f830112611a1657600080fd5b81356020611a266118a28361185d565b82815260069290921b84018101918181019086841115611a4557600080fd5b8286015b848110156118e85760408189031215611a625760008081fd5b611a6a6117c2565b611a738261169a565b8152611a808583016119ed565b81860152835291830191604001611a49565b60008060008060008060008060008060006101608c8e031215611ab457600080fd5b8b359a5060208c01359950611acb60408d0161169a565b9850611ad960608d0161177f565b975067ffffffffffffffff8060808e01351115611af557600080fd5b611b058e60808f01358f01611881565b97508060a08e01351115611b1857600080fd5b611b288e60a08f01358f016118f3565b9650611b3660c08e0161194e565b95508060e08e01351115611b4957600080fd5b611b598e60e08f01358f0161195f565b9450611b686101008e016119ed565b9350806101208e01351115611b7c57600080fd5b611b8d8e6101208f01358f0161195f565b9250806101408e01351115611ba157600080fd5b50611bb38d6101408e01358e01611a05565b90509295989b509295989b9093969950565b600080600080600080600080610100898b031215611be257600080fd5b88359750602089013567ffffffffffffffff80821115611c0157600080fd5b611c0d8c838d01611881565b985060408b0135915080821115611c2357600080fd5b611c2f8c838d016118f3565b9750611c3d60608c0161194e565b965060808b0135915080821115611c5357600080fd5b611c5f8c838d0161195f565b9550611c6d60a08c016119ed565b945060c08b0135915080821115611c8357600080fd5b611c8f8c838d0161195f565b935060e08b0135915080821115611ca557600080fd5b50611cb28b828c01611a05565b9150509295985092959890939650565b600060208284031215611cd457600080fd5b61161c8261169a565b600080600080600060e08688031215611cf557600080fd5b86601f870112611d0457600080fd5b611d0c6117eb565b806060880189811115611d1e57600080fd5b885b81811015611d38578035845260209384019301611d20565b5090965035905067ffffffffffffffff80821115611d5557600080fd5b611d6189838a0161195f565b95506080880135915080821115611d7757600080fd5b611d8389838a016118f3565b945060a0880135915080821115611d9957600080fd5b50611da6888289016118f3565b9598949750929560c001359392505050565b80516020808301519190811015611df7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611e9357611e93611e2c565b500290565b80820180821115611eab57611eab611e2c565b92915050565b60ff8181168382160190811115611eab57611eab611e2c565b828152600060208083018460005b6003811015611ef557815183529183019190830190600101611ed8565b505050506080820190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f6657611f66611e2c565b5060010190565b600063ffffffff808316818103611f8657611f86611e2c565b6001019392505050565b600060ff821660ff8103611fa657611fa6611e2c565b60010192915050565b600060608201858352602085818501526040606081860152828651808552608087019150838801945060005b81811015612020578551805173ffffffffffffffffffffffffffffffffffffffff16845285015167ffffffffffffffff16858401529484019491830191600101611fdb565b50909998505050505050505050565b600081518084526020808501945080840160005b8381101561207557815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612043565b509495945050505050565b600081518084526020808501945080840160005b8381101561207557815187529582019590820190600101612094565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526120e08184018a61202f565b905082810360808401526120f48189612080565b905060ff871660a084015282810360c08401526121118187611623565b905067ffffffffffffffff851660e08401528281036101008401526121368185611623565b9c9b505050505050505050505050565b60006101408c83528b602084015273ffffffffffffffffffffffffffffffffffffffff8b16604084015267ffffffffffffffff808b1660608501528160808501526121938285018b61202f565b915083820360a08501526121a7828a612080565b915060ff881660c085015283820360e08501526121c48288611623565b90861661010085015283810361012085015290506121e28185611623565b9d9c5050505050505050505050505056fea164736f6c6343000810000a",
+ Bin: "0x60a06040523480156200001157600080fd5b50604051620023d5380380620023d58339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e95760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b6080516121da620001fb6000396000818161033b015261131501526121da6000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806394d959801161008c578063e7db9c2a11610066578063e7db9c2a1461028b578063e84f128e1461029e578063f0107221146102fb578063f2fde38b1461030e57600080fd5b806394d9598014610206578063b70d929d14610219578063ded6307c1461027857600080fd5b80633dd86430116100c85780633dd86430146101ae578063564a0a7a146101c357806379ba5097146101d65780638da5cb5b146101de57600080fd5b806301ffc9a7146100ef578063181f5a77146101595780633d3ac1b51461019b575b600080fd5b6101446100fd3660046115da565b7fffffffff00000000000000000000000000000000000000000000000000000000167f3d3ac1b5000000000000000000000000000000000000000000000000000000001490565b60405190151581526020015b60405180910390f35b60408051808201909152600e81527f566572696669657220312e322e3000000000000000000000000000000000000060208201525b6040516101509190611687565b61018e6101a93660046116c3565b610321565b6101c16101bc366004611744565b6104bb565b005b6101c16101d1366004611744565b61056d565b6101c161062e565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610150565b6101c161021436600461175d565b61072b565b610255610227366004611744565b6000908152600260205260408120600181015490549192909168010000000000000000900463ffffffff1690565b604080519315158452602084019290925263ffffffff1690820152606001610150565b6101c161028636600461175d565b61088c565b6101c1610299366004611a92565b61099d565b6102d86102ac366004611744565b6000908152600260205260409020805460019091015463ffffffff808316936401000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610150565b6101c1610309366004611bc5565b610aaf565b6101c161031c366004611cc2565b610b79565b60603373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610392576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000808080806103a4888a018a611cdd565b945094509450945094506000846103ba90611db8565b60008181526002602052604090208054919250906c01000000000000000000000000900460ff1615610420576040517f36dbe748000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b86516000818152600283016020526040902061043f8483898985610b8d565b6104498984610c89565b8751602089012061045e818b8a8a8a87610cf1565b60405173ffffffffffffffffffffffffffffffffffffffff8d16815285907f58ca9502e98a536e06e72d680fcc251e5d10b72291a281665a2c2dc0ac30fcc59060200160405180910390a250969c9b505050505050505050505050565b6104c3610f6d565b60008181526002602052604081208054909163ffffffff9091169003610518576040517fa25b0b9600000000000000000000000000000000000000000000000000000000815260048101839052602401610417565b80547fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff16815560405182907ff438564f793525caa89c6e3a26d41e16aa39d1e589747595751e3f3df75cb2b490600090a25050565b610575610f6d565b60008181526002602052604081208054909163ffffffff90911690036105ca576040517fa25b0b9600000000000000000000000000000000000000000000000000000000815260048101839052602401610417565b80547fffffffffffffffffffffffffffffffffffffff00ffffffffffffffffffffffff166c0100000000000000000000000017815560405182907ffc4f79b8c65b6be1773063461984c0974400d1e99654c79477a092ace83fd06190600090a25050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146106af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610417565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610733610f6d565b600082815260026020526040902081610778576040517fe332262700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260028201602052604081205460ff1690036107ce576040517f8bca63110000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610417565b80600101548203610815576040517fa403c0160000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610417565b60008281526002820160205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1690555183907f0e173bea63a8c59ec70bf87043f2a729693790183f16a1a54b705de9e989cc4c9061087f9085815260200190565b60405180910390a2505050565b610894610f6d565b6000828152600260205260409020816108d9576040517fe332262700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260028201602052604081205460ff16900361092f576040517f8bca63110000000000000000000000000000000000000000000000000000000081526004810184905260248101839052604401610417565b60008281526002820160205260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555183907f54f8872b9b94ebea6577f33576d55847bd8ea22641ccc886b965f6e50bfe77469061087f9085815260200190565b86518560ff16806000036109dd576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f821115610a22576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101839052601f6024820152604401610417565b610a2d816003611e5b565b8211610a855781610a3f826003611e5b565b610a4a906001611e78565b6040517f9dd9e6d800000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610417565b610a8d610f6d565b610aa08d8d8d8d8d8d8d8d8d8d8d610ff0565b50505050505050505050505050565b86518560ff1680600003610aef576040517f0743bae600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601f821115610b34576040517f61750f4000000000000000000000000000000000000000000000000000000000815260048101839052601f6024820152604401610417565b610b3f816003611e5b565b8211610b515781610a3f826003611e5b565b610b59610f6d565b610b6d8a463060008d8d8d8d8d8d8d610ff0565b50505050505050505050565b610b81610f6d565b610b8a81611437565b50565b8054600090610ba09060ff166001611e8b565b8254909150610100900460ff16610bed576040517ffc10a2830000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604401610417565b8060ff16845114610c395783516040517f5348a282000000000000000000000000000000000000000000000000000000008152600481019190915260ff82166024820152604401610417565b8251845114610c8157835183516040517ff0d3140800000000000000000000000000000000000000000000000000000000815260048101929092526024820152604401610417565b505050505050565b6020820151815463ffffffff600883901c81169168010000000000000000900416811115610ceb5782547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff166801000000000000000063ffffffff8316021783555b50505050565b60008686604051602001610d06929190611ea4565b6040516020818303038152906040528051906020012090506000610d3a604080518082019091526000808252602082015290565b8651600090815b81811015610f0557600186898360208110610d5e57610d5e611dfd565b610d6b91901a601b611e8b565b8c8481518110610d7d57610d7d611dfd565b60200260200101518c8581518110610d9757610d97611dfd565b602002602001015160405160008152602001604052604051610dd5949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015610df7573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff811660009081526001808d01602090815291859020848601909552845460ff808216865293995093955090850192610100900490911690811115610e7c57610e7c611ee0565b6001811115610e8d57610e8d611ee0565b9052509350600184602001516001811115610eaa57610eaa611ee0565b14610ee1576040517f4df18f0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b836000015160080260ff166001901b8501945080610efe90611f0f565b9050610d41565b50837e01010101010101010101010101010101010101010101010101010101010101851614610f60576040517f4df18f0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610417565b565b60008b815260026020526040902063ffffffff89161561103d5780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8a16178155611071565b805463ffffffff1681600061105183611f47565b91906101000a81548163ffffffff021916908363ffffffff160217905550505b8054600090611091908e908e908e9063ffffffff168d8d8d8d8d8d61152c565b6000818152600284016020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8b16176101001790559091505b89518160ff1610156112d25760008a8260ff16815181106110f7576110f7611dfd565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611167576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000858152600287016020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452600190810190925290912054610100900460ff16908111156111ba576111ba611ee0565b14801591506111f5576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8416815260208101600190526000858152600287016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684526001908101835292208351815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00821681178355928501519193919284927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090921617906101009084908111156112b7576112b7611ee0565b02179055509050505050806112cb90611f6a565b90506110d4565b5060018201546040517fb011b24700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169163b011b2479161134d919085908890600401611f89565b600060405180830381600087803b15801561136757600080fd5b505af115801561137b573d6000803e3d6000fd5b505050508c7fa23a88453230b183877098801ff5a8f771a120e2573eea559ce6c4c2e305a4da8360000160049054906101000a900463ffffffff16838560000160009054906101000a900463ffffffff168d8d8d8d8d8d6040516113e79998979695949392919061208a565b60405180910390a281547fffffffffffffffffffffffffffffffffffffffff0000000000000000ffffffff1664010000000063ffffffff4316021782556001909101555050505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036114b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610417565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000808b8b8b8b8b8b8b8b8b8b6040516020016115529a99989796959493929190612120565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e06000000000000000000000000000000000000000000000000000000000000179150509a9950505050505050505050565b6000602082840312156115ec57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461161c57600080fd5b9392505050565b6000815180845260005b818110156116495760208185018101518683018201520161162d565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061161c6020830184611623565b803573ffffffffffffffffffffffffffffffffffffffff811681146116be57600080fd5b919050565b6000806000604084860312156116d857600080fd5b833567ffffffffffffffff808211156116f057600080fd5b818601915086601f83011261170457600080fd5b81358181111561171357600080fd5b87602082850101111561172557600080fd5b60209283019550935061173b918601905061169a565b90509250925092565b60006020828403121561175657600080fd5b5035919050565b6000806040838503121561177057600080fd5b50508035926020909101359150565b803563ffffffff811681146116be57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156117e5576117e5611793565b60405290565b6040516060810167ffffffffffffffff811182821017156117e5576117e5611793565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561185557611855611793565b604052919050565b600067ffffffffffffffff82111561187757611877611793565b5060051b60200190565b600082601f83011261189257600080fd5b813560206118a76118a28361185d565b61180e565b82815260059290921b840181019181810190868411156118c657600080fd5b8286015b848110156118e8576118db8161169a565b83529183019183016118ca565b509695505050505050565b600082601f83011261190457600080fd5b813560206119146118a28361185d565b82815260059290921b8401810191818101908684111561193357600080fd5b8286015b848110156118e85780358352918301918301611937565b803560ff811681146116be57600080fd5b600082601f83011261197057600080fd5b813567ffffffffffffffff81111561198a5761198a611793565b6119bb60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161180e565b8181528460208386010111156119d057600080fd5b816020850160208301376000918101602001919091529392505050565b803567ffffffffffffffff811681146116be57600080fd5b600082601f830112611a1657600080fd5b81356020611a266118a28361185d565b82815260069290921b84018101918181019086841115611a4557600080fd5b8286015b848110156118e85760408189031215611a625760008081fd5b611a6a6117c2565b611a738261169a565b8152611a808583016119ed565b81860152835291830191604001611a49565b60008060008060008060008060008060006101608c8e031215611ab457600080fd5b8b359a5060208c01359950611acb60408d0161169a565b9850611ad960608d0161177f565b975067ffffffffffffffff8060808e01351115611af557600080fd5b611b058e60808f01358f01611881565b97508060a08e01351115611b1857600080fd5b611b288e60a08f01358f016118f3565b9650611b3660c08e0161194e565b95508060e08e01351115611b4957600080fd5b611b598e60e08f01358f0161195f565b9450611b686101008e016119ed565b9350806101208e01351115611b7c57600080fd5b611b8d8e6101208f01358f0161195f565b9250806101408e01351115611ba157600080fd5b50611bb38d6101408e01358e01611a05565b90509295989b509295989b9093969950565b600080600080600080600080610100898b031215611be257600080fd5b88359750602089013567ffffffffffffffff80821115611c0157600080fd5b611c0d8c838d01611881565b985060408b0135915080821115611c2357600080fd5b611c2f8c838d016118f3565b9750611c3d60608c0161194e565b965060808b0135915080821115611c5357600080fd5b611c5f8c838d0161195f565b9550611c6d60a08c016119ed565b945060c08b0135915080821115611c8357600080fd5b611c8f8c838d0161195f565b935060e08b0135915080821115611ca557600080fd5b50611cb28b828c01611a05565b9150509295985092959890939650565b600060208284031215611cd457600080fd5b61161c8261169a565b600080600080600060e08688031215611cf557600080fd5b86601f870112611d0457600080fd5b611d0c6117eb565b806060880189811115611d1e57600080fd5b885b81811015611d38578035845260209384019301611d20565b5090965035905067ffffffffffffffff80821115611d5557600080fd5b611d6189838a0161195f565b95506080880135915080821115611d7757600080fd5b611d8389838a016118f3565b945060a0880135915080821115611d9957600080fd5b50611da6888289016118f3565b9598949750929560c001359392505050565b80516020808301519190811015611df7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417611e7257611e72611e2c565b92915050565b80820180821115611e7257611e72611e2c565b60ff8181168382160190811115611e7257611e72611e2c565b828152600060208083018460005b6003811015611ecf57815183529183019190830190600101611eb2565b505050506080820190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611f4057611f40611e2c565b5060010190565b600063ffffffff808316818103611f6057611f60611e2c565b6001019392505050565b600060ff821660ff8103611f8057611f80611e2c565b60010192915050565b600060608201858352602085818501526040606081860152828651808552608087019150838801945060005b81811015611ffa578551805173ffffffffffffffffffffffffffffffffffffffff16845285015167ffffffffffffffff16858401529484019491830191600101611fb5565b50909998505050505050505050565b600081518084526020808501945080840160005b8381101561204f57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161201d565b509495945050505050565b600081518084526020808501945080840160005b8381101561204f5781518752958201959082019060010161206e565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526120ba8184018a612009565b905082810360808401526120ce818961205a565b905060ff871660a084015282810360c08401526120eb8187611623565b905067ffffffffffffffff851660e08401528281036101008401526121108185611623565b9c9b505050505050505050505050565b60006101408c83528b602084015273ffffffffffffffffffffffffffffffffffffffff8b16604084015267ffffffffffffffff808b16606085015281608085015261216d8285018b612009565b915083820360a0850152612181828a61205a565b915060ff881660c085015283820360e085015261219e8288611623565b90861661010085015283810361012085015290506121bc8185611623565b9d9c5050505050505050505050505056fea164736f6c6343000813000a",
}
var VerifierABI = VerifierMetaData.ABI
diff --git a/core/gethwrappers/llo-feeds/generated/verifier_proxy/verifier_proxy.go b/core/gethwrappers/llo-feeds/generated/verifier_proxy/verifier_proxy.go
index fc7f10b6415..a3f22d3725e 100644
--- a/core/gethwrappers/llo-feeds/generated/verifier_proxy/verifier_proxy.go
+++ b/core/gethwrappers/llo-feeds/generated/verifier_proxy/verifier_proxy.go
@@ -37,7 +37,7 @@ type CommonAddressAndWeight struct {
var VerifierProxyMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"internalType\":\"contractAccessControllerInterface\",\"name\":\"accessController\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"AccessForbidden\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BadVerification\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"ConfigDigestAlreadySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FeeManagerInvalid\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"VerifierAlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"VerifierInvalid\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"VerifierNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldAccessController\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAccessController\",\"type\":\"address\"}],\"name\":\"AccessControllerSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldFeeManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newFeeManager\",\"type\":\"address\"}],\"name\":\"FeeManagerSet\",\"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\":\"verifierAddress\",\"type\":\"address\"}],\"name\":\"VerifierInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"oldConfigDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"newConfigDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifierAddress\",\"type\":\"address\"}],\"name\":\"VerifierSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifierAddress\",\"type\":\"address\"}],\"name\":\"VerifierUnset\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"getVerifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"verifierAddress\",\"type\":\"address\"}],\"name\":\"initializeVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_accessController\",\"outputs\":[{\"internalType\":\"contractAccessControllerInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_feeManager\",\"outputs\":[{\"internalType\":\"contractIVerifierFeeManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractAccessControllerInterface\",\"name\":\"accessController\",\"type\":\"address\"}],\"name\":\"setAccessController\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIVerifierFeeManager\",\"name\":\"feeManager\",\"type\":\"address\"}],\"name\":\"setFeeManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"currentConfigDigest\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"newConfigDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"addressesAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setVerifier\",\"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\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"unsetVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"parameterPayload\",\"type\":\"bytes\"}],\"name\":\"verify\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"parameterPayload\",\"type\":\"bytes\"}],\"name\":\"verifyBulk\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"verifiedReports\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}]",
- Bin: "0x60806040523480156200001157600080fd5b5060405162001d3638038062001d36833981016040819052620000349162000193565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000e8565b5050600480546001600160a01b0319166001600160a01b03939093169290921790915550620001c5565b336001600160a01b03821603620001425760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001a657600080fd5b81516001600160a01b0381168114620001be57600080fd5b9392505050565b611b6180620001d56000396000f3fe6080604052600436106100dd5760003560e01c806394ba28461161007f578063f08391d811610059578063f08391d8146102be578063f2fde38b146102de578063f7e83aee146102fe578063f873a61c1461031157600080fd5b806394ba28461461022e578063b011b2471461025b578063eeb7b2481461027b57600080fd5b80636e914094116100bb5780636e914094146101ae57806379ba5097146101ce5780638c2a4d53146101e35780638da5cb5b1461020357600080fd5b8063181f5a77146100e257806338416b5b1461013a578063472d35b91461018c575b600080fd5b3480156100ee57600080fd5b5060408051808201909152601381527f566572696669657250726f787920322e302e300000000000000000000000000060208201525b60405161013191906113c3565b60405180910390f35b34801561014657600080fd5b506005546101679073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610131565b34801561019857600080fd5b506101ac6101a73660046113ff565b610331565b005b3480156101ba57600080fd5b506101ac6101c936600461141c565b6105a9565b3480156101da57600080fd5b506101ac61069a565b3480156101ef57600080fd5b506101ac6101fe3660046113ff565b610797565b34801561020f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610167565b34801561023a57600080fd5b506004546101679073ffffffffffffffffffffffffffffffffffffffff1681565b34801561026757600080fd5b506101ac610276366004611435565b6109c8565b34801561028757600080fd5b5061016761029636600461141c565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b3480156102ca57600080fd5b506101ac6102d93660046113ff565b610bee565b3480156102ea57600080fd5b506101ac6102f93660046113ff565b610c75565b61012461030c366004611501565b610c89565b61032461031f36600461156d565b610e43565b60405161013191906115ee565b6103396110a7565b73ffffffffffffffffffffffffffffffffffffffff8116610386576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fdba45fe000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015610410573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610434919061166e565b15806104eb57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f6c2f1a1700000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa1580156104c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e9919061166e565b155b15610522576040517f8238941900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f0391015b60405180910390a15050565b6105b16110a7565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610615576040517fb151802b000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6000828152600360205260409081902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055517f11dc15c4b8ac2b183166cc8427e5385a5ece8308217a4217338c6a7614845c4c9061059d908490849091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60015473ffffffffffffffffffffffffffffffffffffffff16331461071b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161060c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61079f6110a7565b8073ffffffffffffffffffffffffffffffffffffffff81166107ed576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f3d3ac1b500000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015610877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089b919061166e565b6108d1576040517f75b0527a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090205460ff1615610949576040517f4e01ccfd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260240161060c565b73ffffffffffffffffffffffffffffffffffffffff821660008181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f1f2cd7c97f4d801b5efe26cc409617c1fd6c5ef786e79aacb90af40923e4e8e9910161059d565b600083815260036020526040902054839073ffffffffffffffffffffffffffffffffffffffff168015610a46576040517f375d1fe60000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8216602482015260440161060c565b3360009081526002602052604090205460ff16610a8f576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260036020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558215610ba75760055473ffffffffffffffffffffffffffffffffffffffff16610b1a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546040517ff65df96200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063f65df96290610b7490889088908890600401611690565b600060405180830381600087803b158015610b8e57600080fd5b505af1158015610ba2573d6000803e3d6000fd5b505050505b6040805187815260208101879052338183015290517fbeb513e532542a562ac35699e7cd9ae7d198dcd3eee15bada6c857d28ceaddcf9181900360600190a1505050505050565b610bf66110a7565b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f953e92b1a6442e9c3242531154a3f6f6eb00b4e9c719ba8118fa6235e4ce89b6910161059d565b610c7d6110a7565b610c868161112a565b50565b60045460609073ffffffffffffffffffffffffffffffffffffffff168015801590610d4957506040517f6b14daf800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636b14daf890610d069033906000903690600401611762565b602060405180830381865afa158015610d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d47919061166e565b155b15610d80576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055473ffffffffffffffffffffffffffffffffffffffff168015610e2e576040517fdba45fe000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063dba45fe0903490610dfb908b908b908b908b90339060040161179b565b6000604051808303818588803b158015610e1457600080fd5b505af1158015610e28573d6000803e3d6000fd5b50505050505b610e38878761121f565b979650505050505050565b60045460609073ffffffffffffffffffffffffffffffffffffffff168015801590610f0357506040517f6b14daf800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636b14daf890610ec09033906000903690600401611762565b602060405180830381865afa158015610edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f01919061166e565b155b15610f3a576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055473ffffffffffffffffffffffffffffffffffffffff168015610fe8576040517f6c2f1a1700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636c2f1a17903490610fb5908b908b908b908b9033906004016117eb565b6000604051808303818588803b158015610fce57600080fd5b505af1158015610fe2573d6000803e3d6000fd5b50505050505b8567ffffffffffffffff811115611001576110016118fc565b60405190808252806020026020018201604052801561103457816020015b606081526020019060019003908161101f5790505b50925060005b8681101561109c5761106e8888838181106110575761105761192b565b9050602002810190611069919061195a565b61121f565b8482815181106110805761108061192b565b602002602001018190525080611095906119bf565b905061103a565b505050949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161060c565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036111a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161060c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6060600061122d8385611a1e565b60008181526003602052604090205490915073ffffffffffffffffffffffffffffffffffffffff168061128f576040517fb151802b0000000000000000000000000000000000000000000000000000000081526004810183905260240161060c565b6040517f3d3ac1b500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690633d3ac1b5906112e590889088903390600401611a5a565b6000604051808303816000875af1158015611304573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261134a9190810190611a94565b925050505b92915050565b60005b83811015611370578181015183820152602001611358565b50506000910152565b60008151808452611391816020860160208601611355565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006113d66020830184611379565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c8657600080fd5b60006020828403121561141157600080fd5b81356113d6816113dd565b60006020828403121561142e57600080fd5b5035919050565b6000806000806060858703121561144b57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561147157600080fd5b818701915087601f83011261148557600080fd5b81358181111561149457600080fd5b8860208260061b85010111156114a957600080fd5b95989497505060200194505050565b60008083601f8401126114ca57600080fd5b50813567ffffffffffffffff8111156114e257600080fd5b6020830191508360208285010111156114fa57600080fd5b9250929050565b6000806000806040858703121561151757600080fd5b843567ffffffffffffffff8082111561152f57600080fd5b61153b888389016114b8565b9096509450602087013591508082111561155457600080fd5b50611561878288016114b8565b95989497509550505050565b6000806000806040858703121561158357600080fd5b843567ffffffffffffffff8082111561159b57600080fd5b818701915087601f8301126115af57600080fd5b8135818111156115be57600080fd5b8860208260051b85010111156115d357600080fd5b60209283019650945090860135908082111561155457600080fd5b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611661577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261164f858351611379565b94509285019290850190600101611615565b5092979650505050505050565b60006020828403121561168057600080fd5b815180151581146113d657600080fd5b838152604060208083018290528282018490526000919085906060850184805b8881101561170a5784356116c3816113dd565b73ffffffffffffffffffffffffffffffffffffffff1683528484013567ffffffffffffffff81168082146116f5578384fd5b848601525093850193918501916001016116b0565b50909998505050505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff84168152604060208201526000611792604083018486611719565b95945050505050565b6060815260006117af606083018789611719565b82810360208401526117c2818688611719565b91505073ffffffffffffffffffffffffffffffffffffffff831660408301529695505050505050565b6060808252810185905260006080600587901b8301810190830188835b898110156118b7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8086850301835281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c360301811261186957600080fd5b8b01602081810191359067ffffffffffffffff82111561188857600080fd5b81360383131561189757600080fd5b6118a2878385611719565b96509485019493909301925050600101611808565b50505082810360208401526118cd818688611719565b9150506118f2604083018473ffffffffffffffffffffffffffffffffffffffff169052565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261198f57600080fd5b83018035915067ffffffffffffffff8211156119aa57600080fd5b6020019150368190038213156114fa57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a17577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b8035602083101561134f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b604081526000611a6e604083018587611719565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b600060208284031215611aa657600080fd5b815167ffffffffffffffff80821115611abe57600080fd5b818401915084601f830112611ad257600080fd5b815181811115611ae457611ae46118fc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b2a57611b2a6118fc565b81604052828152876020848701011115611b4357600080fd5b610e3883602083016020880161135556fea164736f6c6343000810000a",
+ Bin: "0x60806040523480156200001157600080fd5b5060405162001d3638038062001d36833981016040819052620000349162000193565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000e8565b5050600480546001600160a01b0319166001600160a01b03939093169290921790915550620001c5565b336001600160a01b03821603620001425760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001a657600080fd5b81516001600160a01b0381168114620001be57600080fd5b9392505050565b611b6180620001d56000396000f3fe6080604052600436106100dd5760003560e01c806394ba28461161007f578063f08391d811610059578063f08391d8146102be578063f2fde38b146102de578063f7e83aee146102fe578063f873a61c1461031157600080fd5b806394ba28461461022e578063b011b2471461025b578063eeb7b2481461027b57600080fd5b80636e914094116100bb5780636e914094146101ae57806379ba5097146101ce5780638c2a4d53146101e35780638da5cb5b1461020357600080fd5b8063181f5a77146100e257806338416b5b1461013a578063472d35b91461018c575b600080fd5b3480156100ee57600080fd5b5060408051808201909152601381527f566572696669657250726f787920322e302e300000000000000000000000000060208201525b60405161013191906113c3565b60405180910390f35b34801561014657600080fd5b506005546101679073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610131565b34801561019857600080fd5b506101ac6101a73660046113ff565b610331565b005b3480156101ba57600080fd5b506101ac6101c936600461141c565b6105a9565b3480156101da57600080fd5b506101ac61069a565b3480156101ef57600080fd5b506101ac6101fe3660046113ff565b610797565b34801561020f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610167565b34801561023a57600080fd5b506004546101679073ffffffffffffffffffffffffffffffffffffffff1681565b34801561026757600080fd5b506101ac610276366004611435565b6109c8565b34801561028757600080fd5b5061016761029636600461141c565b60009081526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b3480156102ca57600080fd5b506101ac6102d93660046113ff565b610bee565b3480156102ea57600080fd5b506101ac6102f93660046113ff565b610c75565b61012461030c366004611501565b610c89565b61032461031f36600461156d565b610e43565b60405161013191906115ee565b6103396110a7565b73ffffffffffffffffffffffffffffffffffffffff8116610386576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527fdba45fe000000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015610410573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610434919061166e565b15806104eb57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f6c2f1a1700000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa1580156104c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104e9919061166e565b155b15610522576040517f8238941900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f04628abcaa6b1674651352125cb94b65b289145bc2bc4d67720bb7d966372f0391015b60405180910390a15050565b6105b16110a7565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff1680610615576040517fb151802b000000000000000000000000000000000000000000000000000000008152600481018390526024015b60405180910390fd5b6000828152600360205260409081902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055517f11dc15c4b8ac2b183166cc8427e5385a5ece8308217a4217338c6a7614845c4c9061059d908490849091825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60015473ffffffffffffffffffffffffffffffffffffffff16331461071b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161060c565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61079f6110a7565b8073ffffffffffffffffffffffffffffffffffffffff81166107ed576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f3d3ac1b500000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa158015610877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089b919061166e565b6108d1576040517f75b0527a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602052604090205460ff1615610949576040517f4e01ccfd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260240161060c565b73ffffffffffffffffffffffffffffffffffffffff821660008181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905590519182527f1f2cd7c97f4d801b5efe26cc409617c1fd6c5ef786e79aacb90af40923e4e8e9910161059d565b600083815260036020526040902054839073ffffffffffffffffffffffffffffffffffffffff168015610a46576040517f375d1fe60000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff8216602482015260440161060c565b3360009081526002602052604090205460ff16610a8f576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260036020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558215610ba75760055473ffffffffffffffffffffffffffffffffffffffff16610b1a576040517fd92e233d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546040517ff65df96200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063f65df96290610b7490889088908890600401611690565b600060405180830381600087803b158015610b8e57600080fd5b505af1158015610ba2573d6000803e3d6000fd5b505050505b6040805187815260208101879052338183015290517fbeb513e532542a562ac35699e7cd9ae7d198dcd3eee15bada6c857d28ceaddcf9181900360600190a1505050505050565b610bf66110a7565b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f953e92b1a6442e9c3242531154a3f6f6eb00b4e9c719ba8118fa6235e4ce89b6910161059d565b610c7d6110a7565b610c868161112a565b50565b60045460609073ffffffffffffffffffffffffffffffffffffffff168015801590610d4957506040517f6b14daf800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636b14daf890610d069033906000903690600401611762565b602060405180830381865afa158015610d23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d47919061166e565b155b15610d80576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055473ffffffffffffffffffffffffffffffffffffffff168015610e2e576040517fdba45fe000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063dba45fe0903490610dfb908b908b908b908b90339060040161179b565b6000604051808303818588803b158015610e1457600080fd5b505af1158015610e28573d6000803e3d6000fd5b50505050505b610e38878761121f565b979650505050505050565b60045460609073ffffffffffffffffffffffffffffffffffffffff168015801590610f0357506040517f6b14daf800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636b14daf890610ec09033906000903690600401611762565b602060405180830381865afa158015610edd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f01919061166e565b155b15610f3a576040517fef67f5d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60055473ffffffffffffffffffffffffffffffffffffffff168015610fe8576040517f6c2f1a1700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690636c2f1a17903490610fb5908b908b908b908b9033906004016117eb565b6000604051808303818588803b158015610fce57600080fd5b505af1158015610fe2573d6000803e3d6000fd5b50505050505b8567ffffffffffffffff811115611001576110016118fc565b60405190808252806020026020018201604052801561103457816020015b606081526020019060019003908161101f5790505b50925060005b8681101561109c5761106e8888838181106110575761105761192b565b9050602002810190611069919061195a565b61121f565b8482815181106110805761108061192b565b602002602001018190525080611095906119bf565b905061103a565b505050949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611128576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161060c565b565b3373ffffffffffffffffffffffffffffffffffffffff8216036111a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161060c565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6060600061122d8385611a1e565b60008181526003602052604090205490915073ffffffffffffffffffffffffffffffffffffffff168061128f576040517fb151802b0000000000000000000000000000000000000000000000000000000081526004810183905260240161060c565b6040517f3d3ac1b500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821690633d3ac1b5906112e590889088903390600401611a5a565b6000604051808303816000875af1158015611304573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261134a9190810190611a94565b925050505b92915050565b60005b83811015611370578181015183820152602001611358565b50506000910152565b60008151808452611391816020860160208601611355565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006113d66020830184611379565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610c8657600080fd5b60006020828403121561141157600080fd5b81356113d6816113dd565b60006020828403121561142e57600080fd5b5035919050565b6000806000806060858703121561144b57600080fd5b8435935060208501359250604085013567ffffffffffffffff8082111561147157600080fd5b818701915087601f83011261148557600080fd5b81358181111561149457600080fd5b8860208260061b85010111156114a957600080fd5b95989497505060200194505050565b60008083601f8401126114ca57600080fd5b50813567ffffffffffffffff8111156114e257600080fd5b6020830191508360208285010111156114fa57600080fd5b9250929050565b6000806000806040858703121561151757600080fd5b843567ffffffffffffffff8082111561152f57600080fd5b61153b888389016114b8565b9096509450602087013591508082111561155457600080fd5b50611561878288016114b8565b95989497509550505050565b6000806000806040858703121561158357600080fd5b843567ffffffffffffffff8082111561159b57600080fd5b818701915087601f8301126115af57600080fd5b8135818111156115be57600080fd5b8860208260051b85010111156115d357600080fd5b60209283019650945090860135908082111561155457600080fd5b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015611661577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc088860301845261164f858351611379565b94509285019290850190600101611615565b5092979650505050505050565b60006020828403121561168057600080fd5b815180151581146113d657600080fd5b838152604060208083018290528282018490526000919085906060850184805b8881101561170a5784356116c3816113dd565b73ffffffffffffffffffffffffffffffffffffffff1683528484013567ffffffffffffffff81168082146116f5578384fd5b848601525093850193918501916001016116b0565b50909998505050505050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b73ffffffffffffffffffffffffffffffffffffffff84168152604060208201526000611792604083018486611719565b95945050505050565b6060815260006117af606083018789611719565b82810360208401526117c2818688611719565b91505073ffffffffffffffffffffffffffffffffffffffff831660408301529695505050505050565b6060808252810185905260006080600587901b8301810190830188835b898110156118b7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8086850301835281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18c360301811261186957600080fd5b8b01602081810191359067ffffffffffffffff82111561188857600080fd5b81360383131561189757600080fd5b6118a2878385611719565b96509485019493909301925050600101611808565b50505082810360208401526118cd818688611719565b9150506118f2604083018473ffffffffffffffffffffffffffffffffffffffff169052565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261198f57600080fd5b83018035915067ffffffffffffffff8211156119aa57600080fd5b6020019150368190038213156114fa57600080fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611a17577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b8035602083101561134f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b604081526000611a6e604083018587611719565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152949350505050565b600060208284031215611aa657600080fd5b815167ffffffffffffffff80821115611abe57600080fd5b818401915084601f830112611ad257600080fd5b815181811115611ae457611ae46118fc565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908382118183101715611b2a57611b2a6118fc565b81604052828152876020848701011115611b4357600080fd5b610e3883602083016020880161135556fea164736f6c6343000813000a",
}
var VerifierProxyABI = VerifierProxyMetaData.ABI
diff --git a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index d54d3fb8cdf..31333e92ebf 100644
--- a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -1,10 +1,15 @@
GETH_VERSION: 1.13.8
-errored_verifier: ../../../contracts/solc/v0.8.16/ErroredVerifier/ErroredVerifier.abi ../../../contracts/solc/v0.8.16/ErroredVerifier/ErroredVerifier.bin 510d18a58bfda646be35e46491baf73041eb333a349615465b20e2b5b41c5f73
-exposed_verifier: ../../../contracts/solc/v0.8.16/ExposedVerifier/ExposedVerifier.abi ../../../contracts/solc/v0.8.16/ExposedVerifier/ExposedVerifier.bin 6932cea8f2738e874d3ec9e1a4231d2421704030c071d9e15dd2f7f08482c246
-fee_manager: ../../../contracts/solc/v0.8.16/FeeManager/FeeManager.abi ../../../contracts/solc/v0.8.16/FeeManager/FeeManager.bin 1b852df75bfabcc2b57539e84309cd57f9e693a2bb6b25a50e4a6101ccf32c49
-llo_feeds: ../../../contracts/solc/v0.8.16/FeeManager.abi ../../../contracts/solc/v0.8.16/FeeManager.bin cb71e018f67e49d7bc0e194c822204dfd59f79ff42e4fc8fd8ab63f3acd71361
-llo_feeds_test: ../../../contracts/solc/v0.8.16/ExposedVerifier.abi ../../../contracts/solc/v0.8.16/ExposedVerifier.bin 6932cea8f2738e874d3ec9e1a4231d2421704030c071d9e15dd2f7f08482c246
-reward_manager: ../../../contracts/solc/v0.8.16/RewardManager/RewardManager.abi ../../../contracts/solc/v0.8.16/RewardManager/RewardManager.bin db73e9062b17a1d5aa14c06881fe2be49bd95b00b7f1a8943910c5e4ded5b221
-verifier: ../../../contracts/solc/v0.8.16/Verifier/Verifier.abi ../../../contracts/solc/v0.8.16/Verifier/Verifier.bin df12786bbeccf3a8f3389479cf93c055b4efd5904b9f99a4835f81af43fe62bf
-verifier_proxy: ../../../contracts/solc/v0.8.16/VerifierProxy/VerifierProxy.abi ../../../contracts/solc/v0.8.16/VerifierProxy/VerifierProxy.bin 6393443d0a323f2dbe9687dc30fd77f8dfa918944b61c651759746ff2d76e4e5
+channel_config_store: ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin 4ae3e6ca866fdf48850d67c0c7a4bdaf4905c81a4e3ce5efb9ef9613a55d8454
+channel_config_verifier_proxy: ../../../contracts/solc/v0.8.19/ChannelVerifierProxy/ChannelVerifierProxy.abi ../../../contracts/solc/v0.8.19/ChannelVerifierProxy/ChannelVerifierProxy.bin 655658e5f61dfadfe3268de04f948b7e690ad03ca45676e645d6cd6018154661
+channel_verifier: ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.abi ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.bin e6020553bd8e3e6b250fcaffe7efd22aea955c8c1a0eb05d282fdeb0ab6550b7
+errored_verifier: ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.abi ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.bin a3e5a77262e13ee30fe8d35551b32a3452d71929e43fd780bbfefeaf4aa62e43
+exposed_channel_verifier: ../../../contracts/solc/v0.8.19/ExposedChannelVerifier/ExposedChannelVerifier.abi ../../../contracts/solc/v0.8.19/ExposedChannelVerifier/ExposedChannelVerifier.bin c21cde078900241c06de69e2bc5d906c5ef558b52db66caa68bed065940a2253
+exposed_verifier: ../../../contracts/solc/v0.8.19/ExposedVerifier/ExposedVerifier.abi ../../../contracts/solc/v0.8.19/ExposedVerifier/ExposedVerifier.bin 00816ab345f768e522c79abadeadf9155c2c688067e18f8f73e5d6ab71037663
+fee_manager: ../../../contracts/solc/v0.8.19/FeeManager/FeeManager.abi ../../../contracts/solc/v0.8.19/FeeManager/FeeManager.bin edc85f34294ae7c90d45c4c71eb5c105c60a4842dfbbf700c692870ffcc403a1
+llo_feeds: ../../../contracts/solc/v0.8.19/FeeManager.abi ../../../contracts/solc/v0.8.19/FeeManager.bin cb71e018f67e49d7bc0e194c822204dfd59f79ff42e4fc8fd8ab63f3acd71361
+llo_feeds_test: ../../../contracts/solc/v0.8.19/ExposedVerifier.abi ../../../contracts/solc/v0.8.19/ExposedVerifier.bin 6932cea8f2738e874d3ec9e1a4231d2421704030c071d9e15dd2f7f08482c246
+reward_manager: ../../../contracts/solc/v0.8.19/RewardManager/RewardManager.abi ../../../contracts/solc/v0.8.19/RewardManager/RewardManager.bin 7996cbc89a7f9af85b1ca4079ecf782d7138626b3f4bdb3bfa996248c9ccb9f4
+stream_config_store: ../../../contracts/solc/v0.8.19/StreamConfigStore/StreamConfigStore.abi ../../../contracts/solc/v0.8.19/StreamConfigStore/StreamConfigStore.bin 45ae1b0a45a90b3dee076023052aef73c212c8ef8825b829397f751f6b0a1598
+verifier: ../../../contracts/solc/v0.8.19/Verifier/Verifier.abi ../../../contracts/solc/v0.8.19/Verifier/Verifier.bin 413406be1578e9fb73e664ceb1967e6aedf5cf7c4701a2b81fe7c42b03f13573
+verifier_proxy: ../../../contracts/solc/v0.8.19/VerifierProxy/VerifierProxy.abi ../../../contracts/solc/v0.8.19/VerifierProxy/VerifierProxy.bin aca18e93b0129114f20c4c0fbaeb61c86bc0ca0724bc438ec7ae11c158038ea7
werc20_mock: ../../../contracts/solc/v0.8.19/WERC20Mock.abi ../../../contracts/solc/v0.8.19/WERC20Mock.bin ff2ca3928b2aa9c412c892cb8226c4d754c73eeb291bb7481c32c48791b2aa94
diff --git a/core/gethwrappers/llo-feeds/go_generate.go b/core/gethwrappers/llo-feeds/go_generate.go
index 5b2088f43a0..5e5b841b72d 100644
--- a/core/gethwrappers/llo-feeds/go_generate.go
+++ b/core/gethwrappers/llo-feeds/go_generate.go
@@ -3,9 +3,12 @@
package gethwrappers
// Chainlink LLO
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.16/Verifier/Verifier.abi ../../../contracts/solc/v0.8.16/Verifier/Verifier.bin Verifier verifier
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.16/VerifierProxy/VerifierProxy.abi ../../../contracts/solc/v0.8.16/VerifierProxy/VerifierProxy.bin VerifierProxy verifier_proxy
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.16/ErroredVerifier/ErroredVerifier.abi ../../../contracts/solc/v0.8.16/ErroredVerifier/ErroredVerifier.bin ErroredVerifier errored_verifier
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.16/ExposedVerifier/ExposedVerifier.abi ../../../contracts/solc/v0.8.16/ExposedVerifier/ExposedVerifier.bin ExposedVerifier exposed_verifier
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.16/RewardManager/RewardManager.abi ../../../contracts/solc/v0.8.16/RewardManager/RewardManager.bin RewardManager reward_manager
-//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.16/FeeManager/FeeManager.abi ../../../contracts/solc/v0.8.16/FeeManager/FeeManager.bin FeeManager fee_manager
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/Verifier/Verifier.abi ../../../contracts/solc/v0.8.19/Verifier/Verifier.bin Verifier verifier
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/VerifierProxy/VerifierProxy.abi ../../../contracts/solc/v0.8.19/VerifierProxy/VerifierProxy.bin VerifierProxy verifier_proxy
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.abi ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifier.bin ErroredVerifier errored_verifier
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ExposedVerifier/ExposedVerifier.abi ../../../contracts/solc/v0.8.19/ExposedVerifier/ExposedVerifier.bin ExposedVerifier exposed_verifier
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/RewardManager/RewardManager.abi ../../../contracts/solc/v0.8.19/RewardManager/RewardManager.bin RewardManager reward_manager
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/FeeManager/FeeManager.abi ../../../contracts/solc/v0.8.19/FeeManager/FeeManager.bin FeeManager fee_manager
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin ChannelConfigStore channel_config_store
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.abi ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.bin ChannelVerifier channel_verifier
+//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ExposedChannelVerifier/ExposedChannelVerifier.abi ../../../contracts/solc/v0.8.19/ExposedChannelVerifier/ExposedChannelVerifier.bin ExposedChannelVerifier exposed_channel_verifier
diff --git a/core/gethwrappers/utils.go b/core/gethwrappers/utils.go
index c9b61c9441a..277ebf8aaae 100644
--- a/core/gethwrappers/utils.go
+++ b/core/gethwrappers/utils.go
@@ -44,11 +44,10 @@ func GetProjectRoot() (rootPath string) {
err)
}
for root != "/" { // Walk up path to find dir containing go.mod
- if _, err := os.Stat(filepath.Join(root, "go.mod")); os.IsNotExist(err) {
- root = filepath.Dir(root)
- } else {
+ if _, err := os.Stat(filepath.Join(root, "go.mod")); !os.IsNotExist(err) {
return root
}
+ root = filepath.Dir(root)
}
Exit("could not find project root", nil)
panic("can't get here")
diff --git a/core/internal/cltest/cltest.go b/core/internal/cltest/cltest.go
index c7abfb31a2a..332513b28d4 100644
--- a/core/internal/cltest/cltest.go
+++ b/core/internal/cltest/cltest.go
@@ -165,6 +165,10 @@ func MustRandomBytes(t *testing.T, l int) (b []byte) {
return b
}
+func FormatWithPrefixedChainID(chainID, id string) string {
+ return fmt.Sprintf("%s/%s", chainID, id)
+}
+
type JobPipelineV2TestHelper struct {
Prm pipeline.ORM
Jrm job.ORM
diff --git a/core/internal/testutils/configtest/general_config.go b/core/internal/testutils/configtest/general_config.go
index d2851035855..c79b1c7c3cb 100644
--- a/core/internal/testutils/configtest/general_config.go
+++ b/core/internal/testutils/configtest/general_config.go
@@ -66,9 +66,13 @@ func overrides(c *chainlink.Config, s *chainlink.Secrets) {
c.WebServer.TLS.ListenIP = &testIP
chainID := big.NewI(evmclient.NullClientChainID)
+
+ chainCfg := evmcfg.Defaults(chainID)
+ chainCfg.LogPollInterval = commonconfig.MustNewDuration(1 * time.Second) // speed it up from the standard 15s for tests
+
c.EVM = append(c.EVM, &evmcfg.EVMConfig{
ChainID: chainID,
- Chain: evmcfg.Defaults(chainID),
+ Chain: chainCfg,
Nodes: evmcfg.EVMNodes{
&evmcfg.Node{
Name: ptr("test"),
diff --git a/core/internal/testutils/testutils.go b/core/internal/testutils/testutils.go
index 81c09b1c362..a38b4707179 100644
--- a/core/internal/testutils/testutils.go
+++ b/core/internal/testutils/testutils.go
@@ -446,3 +446,12 @@ func MustDecodeBase64(s string) (b []byte) {
func SkipFlakey(t *testing.T, ticketURL string) {
t.Skip("Flakey", ticketURL)
}
+
+func MustRandBytes(n int) (b []byte) {
+ b = make([]byte, n)
+ _, err := rand.Read(b)
+ if err != nil {
+ panic(err)
+ }
+ return
+}
diff --git a/core/scripts/chaincli/handler/keeper_verifiable_load.go b/core/scripts/chaincli/handler/keeper_verifiable_load.go
index aa62d820101..ee763e54f79 100644
--- a/core/scripts/chaincli/handler/keeper_verifiable_load.go
+++ b/core/scripts/chaincli/handler/keeper_verifiable_load.go
@@ -203,12 +203,11 @@ func (k *Keeper) fetchBucketData(v verifiableLoad, opts *bind.CallOpts, id *big.
var err error
for i := 0; i < retryNum; i++ {
bucketDelays, err = v.GetBucketedDelays(opts, id, bucketNum)
- if err != nil {
- log.Printf("failed to get bucketed delays for upkeep id %s bucket %d: %v, retrying...", id.String(), bucketNum, err)
- time.Sleep(retryDelay)
- } else {
+ if err == nil {
break
}
+ log.Printf("failed to get bucketed delays for upkeep id %s bucket %d: %v, retrying...", id.String(), bucketNum, err)
+ time.Sleep(retryDelay)
}
var floatBucketDelays []float64
diff --git a/core/scripts/common/polygonedge.go b/core/scripts/common/polygonedge.go
index e3cc7a52ad3..c91d76cce87 100644
--- a/core/scripts/common/polygonedge.go
+++ b/core/scripts/common/polygonedge.go
@@ -149,11 +149,10 @@ func GetIbftExtraClean(extra []byte) (cleanedExtra []byte, err error) {
hexExtra := hex.EncodeToString(extra)
prefix := ""
for _, s := range hexExtra {
- if s == '0' {
- prefix = prefix + "0"
- } else {
+ if s != '0' {
break
}
+ prefix = prefix + "0"
}
hexExtra = strings.TrimLeft(hexExtra, "0")
diff --git a/core/scripts/common/vrf/constants/constants.go b/core/scripts/common/vrf/constants/constants.go
index b21f6b0b323..2a064593986 100644
--- a/core/scripts/common/vrf/constants/constants.go
+++ b/core/scripts/common/vrf/constants/constants.go
@@ -29,6 +29,8 @@ var (
ReqsForTier5 = int64(0)
//vrfv2plus
- FlatFeeLinkPPM = int64(500)
- FlatFeeNativePPM = int64(500)
+ FlatFeeNativePPM = uint32(500)
+ FlatFeeLinkDiscountPPM = uint32(100)
+ NativePremiumPercentage = uint8(1)
+ LinkPremiumPercentage = uint8(1)
)
diff --git a/core/scripts/common/vrf/jobs/jobs.go b/core/scripts/common/vrf/jobs/jobs.go
index 7e304f431be..66bdf712e5c 100644
--- a/core/scripts/common/vrf/jobs/jobs.go
+++ b/core/scripts/common/vrf/jobs/jobs.go
@@ -27,7 +27,8 @@ vrf [type=vrfv2
estimate_gas [type=estimategaslimit
to="%s"
multiplier="%f"
- data="$(vrf.output)"]
+ data="$(vrf.output)"
+ block="%s"]
simulate [type=ethcall
from="%s"
to="%s"
@@ -35,7 +36,8 @@ simulate [type=ethcall
gasPrice="$(jobSpec.maxGasPrice)"
extractRevertReason=true
contract="%s"
- data="$(vrf.output)"]
+ data="$(vrf.output)"
+ block="%s"]
decode_log->vrf->estimate_gas->simulate
"""`
@@ -66,7 +68,8 @@ generate_proof [type=vrfv2plus
estimate_gas [type=estimategaslimit
to="%s"
multiplier="%f"
- data="$(generate_proof.output)"]
+ data="$(generate_proof.output)"
+ block="%s"]
simulate_fulfillment [type=ethcall
from="%s"
to="%s"
@@ -74,7 +77,8 @@ simulate_fulfillment [type=ethcall
gasPrice="$(jobSpec.maxGasPrice)"
extractRevertReason=true
contract="%s"
- data="$(generate_proof.output)"]
+ data="$(generate_proof.output)"
+ block="%s"]
decode_log->generate_proof->estimate_gas->simulate_fulfillment
"""
`
diff --git a/core/scripts/common/vrf/setup-envs/main.go b/core/scripts/common/vrf/setup-envs/main.go
index 57e4817d804..6d0f73c0f18 100644
--- a/core/scripts/common/vrf/setup-envs/main.go
+++ b/core/scripts/common/vrf/setup-envs/main.go
@@ -21,7 +21,6 @@ import (
"github.com/smartcontractkit/chainlink/core/scripts/vrfv2plus/testnet/v2plusscripts"
clcmd "github.com/smartcontractkit/chainlink/v2/core/cmd"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2_5"
"github.com/smartcontractkit/chainlink/v2/core/web/presenters"
)
@@ -68,7 +67,7 @@ func main() {
bhfCredsFile := flag.String("bhf-creds-file", "", "Creds to authenticate to the node")
numEthKeys := flag.Int("num-eth-keys", 5, "Number of eth keys to create")
- maxGasPriceGwei := flag.Int("max-gas-price-gwei", -1, "Max gas price gwei of the eth keys")
+ maxGasPriceGwei := flag.Int("max-gas-price-gwei", 1e12, "Max gas price gwei of the eth keys")
numVRFKeys := flag.Int("num-vrf-keys", 1, "Number of vrf keys to create")
batchFulfillmentEnabled := flag.Bool("batch-fulfillment-enabled", constants.BatchFulfillmentEnabled, "whether send randomness fulfillments in batches inside one tx from CL node")
batchFulfillmentGasMultiplier := flag.Float64("batch-fulfillment-gas-multiplier", 1.1, "")
@@ -84,6 +83,7 @@ func main() {
subscriptionBalanceNativeWeiString := flag.String("subscription-balance-native", constants.SubscriptionBalanceNativeWei, "amount to fund subscription with native token (Wei)")
minConfs := flag.Int("min-confs", constants.MinConfs, "minimum confirmations")
+ nativeOnly := flag.Bool("native-only", false, "if true, link and link feed are not set up. Only used in v2 plus")
linkAddress := flag.String("link-address", "", "address of link token")
linkEthAddress := flag.String("link-eth-feed", "", "address of link eth feed")
bhsContractAddressString := flag.String("bhs-address", "", "address of BHS contract")
@@ -94,6 +94,7 @@ func main() {
"from this address you can perform `coordinator.oracleWithdraw` to withdraw earned funds from rand request fulfilments")
deployVRFOwner := flag.Bool("deploy-vrfv2-owner", true, "whether to deploy VRF owner contracts")
useTestCoordinator := flag.Bool("use-test-coordinator", true, "whether to use test coordinator contract or use the normal one")
+ simulationBlock := flag.String("simulation-block", "pending", "simulation block can be 'pending' or 'latest'")
e := helpers.SetupEnv(false)
flag.Parse()
@@ -104,6 +105,10 @@ func main() {
}
fmt.Println("Using VRF Version:", *vrfVersion)
+ if *simulationBlock != "pending" && *simulationBlock != "latest" {
+ helpers.PanicErr(fmt.Errorf("simulation block must be 'pending' or 'latest'"))
+ }
+
fundingAmount := decimal.RequireFromString(*nodeSendingKeyFundingAmount).BigInt()
subscriptionBalanceJuels := decimal.RequireFromString(*subscriptionBalanceJuelsString).BigInt()
subscriptionBalanceNativeWei := decimal.RequireFromString(*subscriptionBalanceNativeWeiString).BigInt()
@@ -229,19 +234,19 @@ func main() {
*deployVRFOwner,
coordinatorJobSpecConfig,
*useTestCoordinator,
+ *simulationBlock,
)
case "v2plus":
- feeConfigV2Plus := vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig{
- FulfillmentFlatFeeLinkPPM: uint32(constants.FlatFeeLinkPPM),
- FulfillmentFlatFeeNativePPM: uint32(constants.FlatFeeNativePPM),
- }
coordinatorConfigV2Plus := v2plusscripts.CoordinatorConfigV2Plus{
- MinConfs: *minConfs,
- MaxGasLimit: constants.MaxGasLimit,
- StalenessSeconds: constants.StalenessSeconds,
- GasAfterPayment: constants.GasAfterPayment,
- FallbackWeiPerUnitLink: constants.FallbackWeiPerUnitLink,
- FeeConfig: feeConfigV2Plus,
+ MinConfs: *minConfs,
+ MaxGasLimit: constants.MaxGasLimit,
+ StalenessSeconds: constants.StalenessSeconds,
+ GasAfterPayment: constants.GasAfterPayment,
+ FallbackWeiPerUnitLink: constants.FallbackWeiPerUnitLink,
+ FulfillmentFlatFeeNativePPM: constants.FlatFeeNativePPM,
+ FulfillmentFlatFeeLinkDiscountPPM: constants.FlatFeeLinkDiscountPPM,
+ NativePremiumPercentage: constants.NativePremiumPercentage,
+ LinkPremiumPercentage: constants.LinkPremiumPercentage,
}
coordinatorJobSpecConfig := model.CoordinatorJobSpecConfig{
@@ -259,8 +264,12 @@ func main() {
vrfKeyRegistrationConfig,
contractAddresses,
coordinatorConfigV2Plus,
+ *batchFulfillmentEnabled,
+ *nativeOnly,
nodesMap,
+ uint64(*maxGasPriceGwei),
coordinatorJobSpecConfig,
+ *simulationBlock,
)
}
diff --git a/core/scripts/gateway/connector/run_connector.go b/core/scripts/gateway/connector/run_connector.go
index c6ad187461c..8d74bb88aec 100644
--- a/core/scripts/gateway/connector/run_connector.go
+++ b/core/scripts/gateway/connector/run_connector.go
@@ -9,13 +9,13 @@ import (
"os/signal"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/jonboulle/clockwork"
"github.com/pelletier/go-toml/v2"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/api"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/common"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/connector"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
)
// Script to run Connector outside of the core node.
@@ -69,7 +69,7 @@ func main() {
sampleKey, _ := crypto.HexToECDSA("cd47d3fafdbd652dd2b66c6104fa79b372c13cb01f4a4fbfc36107cce913ac1d")
lggr, _ := logger.NewLogger()
client := &client{privateKey: sampleKey, lggr: lggr}
- connector, _ := connector.NewGatewayConnector(&cfg, client, client, utils.NewRealClock(), lggr)
+ connector, _ := connector.NewGatewayConnector(&cfg, client, client, clockwork.NewRealClock(), lggr)
client.connector = connector
ctx, _ := signal.NotifyContext(context.Background(), os.Interrupt)
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index 32dfd6a5818..b09e87a7624 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -13,13 +13,14 @@ require (
github.com/google/uuid v1.4.0
github.com/jmoiron/sqlx v1.3.5
github.com/joho/godotenv v1.4.0
+ github.com/jonboulle/clockwork v0.4.0
github.com/manyminds/api2go v0.0.0-20171030193247-e7b693844a6f
github.com/montanaflynn/stats v0.7.1
github.com/olekukonko/tablewriter v0.0.5
github.com/pelletier/go-toml/v2 v2.1.1
github.com/shopspring/decimal v1.3.1
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429
- github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa
+ github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
github.com/smartcontractkit/libocr v0.0.0-20240112202000-6359502d2ff1
@@ -170,10 +171,10 @@ require (
github.com/hashicorp/go-envparse v0.1.0 // indirect
github.com/hashicorp/go-hclog v1.5.0 // indirect
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
- github.com/hashicorp/go-plugin v1.5.2 // indirect
+ github.com/hashicorp/go-plugin v1.6.0 // indirect
github.com/hashicorp/golang-lru v0.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
- github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce // indirect
+ github.com/hashicorp/yamux v0.1.1 // indirect
github.com/hdevalence/ed25519consensus v0.1.0 // indirect
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
github.com/holiman/uint256 v1.2.4 // indirect
@@ -246,11 +247,11 @@ require (
github.com/shirou/gopsutil/v3 v3.23.11 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704 // indirect
- github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0 // indirect
- github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1 // indirect
+ github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8 // indirect
+ github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336 // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8 // indirect
- github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba // indirect
- github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007 // indirect
+ github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0 // indirect
+ github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0 // 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.7.2 // indirect
@@ -297,23 +298,23 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/ratelimit v0.2.0 // indirect
go.uber.org/zap v1.26.0 // indirect
- golang.org/x/arch v0.6.0 // indirect
- golang.org/x/crypto v0.17.0 // indirect
- golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect
- golang.org/x/mod v0.14.0 // indirect
- golang.org/x/net v0.19.0 // indirect
- golang.org/x/sync v0.5.0 // indirect
- golang.org/x/sys v0.15.0 // indirect
- golang.org/x/term v0.15.0 // indirect
+ golang.org/x/arch v0.7.0 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
+ golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect
+ golang.org/x/mod v0.15.0 // indirect
+ golang.org/x/net v0.21.0 // indirect
+ golang.org/x/sync v0.6.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
+ golang.org/x/term v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.16.0 // indirect
+ golang.org/x/tools v0.18.0 // indirect
gonum.org/v1/gonum v0.14.0 // indirect
google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
google.golang.org/grpc v1.59.0 // indirect
- google.golang.org/protobuf v1.31.0 // indirect
+ google.golang.org/protobuf v1.32.0 // indirect
gopkg.in/guregu/null.v2 v2.1.2 // indirect
gopkg.in/guregu/null.v4 v4.0.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
@@ -330,7 +331,7 @@ replace (
github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
// until merged upstream: https://github.com/hashicorp/go-plugin/pull/257
- github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306
+ github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16
// until merged upstream: https://github.com/mwitkow/grpc-proxy/pull/69
github.com/mwitkow/grpc-proxy => github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index 86c6bc84e53..68043ed7056 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -730,8 +730,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce h1:7UnVY3T/ZnHUrfviiAgIUjg2PXxsQfs5bphsG8F7Keo=
-github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
+github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
+github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU=
github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo=
github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw=
@@ -1169,22 +1169,22 @@ github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704 h1:T3lFWumv
github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704/go.mod h1:2QuJdEouTWjh5BDy5o/vgGXQtR4Gz8yH1IYB5eT7u4M=
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429 h1:xkejUBZhcBpBrTSfxc91Iwzadrb6SXw8ks69bHIQ9Ww=
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429/go.mod h1:wJmVvDf4XSjsahWtfUq3wvIAYEAuhr7oxmxYnEL/LGQ=
-github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa h1:9g7e1C3295ALDK8Gs42fIKSSJfI+H1RoBmivGWTvIZo=
-github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa/go.mod h1:05rRF84QKlIOF5LfTBPkHdw4UpBI2G3zxRcuZ65bPjk=
-github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0 h1:NALwENz6vQ972DuD9AZjqRjyNSxH9ptNapizQGLI+2s=
-github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0/go.mod h1:NcVAT/GETDBvIoAej5K6OYqAtDOkF6vO5pYw/hLuYVU=
-github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1 h1:xYqRgZO0nMSO8CBCMR0r3WA+LZ4kNL8a6bnbyk/oBtQ=
-github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1/go.mod h1:GuPvyXryvbiUZIHmPeLBz4L+yJKeyGUjrDfd1KNne+o=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4 h1:Yk0RK9WV59ISOZZMsdtxZBAKaBfdgb05oXyca/qSqcw=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4/go.mod h1:pRlQrvcizMmuHAUV4N96oO2e3XbA99JCQELLc6ES160=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8 h1:I326nw5GwHQHsLKHwtu5Sb9EBLylC8CfUd7BFAS0jtg=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8/go.mod h1:a65NtrK4xZb01mf0dDNghPkN2wXgcqFQ55ADthVBgMc=
+github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336 h1:j00D0/EqE9HRu+63v7KwUOe4ZxLc4AN5SOJFiinkkH0=
+github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336/go.mod h1:umLyYLRGqyIuFfGpEREZP3So6+O8iL35cCCqW+OxX5w=
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8 h1:1BcjXuviSAKttOX7BZoVHRZZGfxqoA2+AL8tykmkdoc=
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8/go.mod h1:vy1L7NybTy2F/Yv7BOh+oZBa1MACD6gzd1+DkcSkfp8=
-github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba h1:6rnQrD8NaLfLOPHszW1hbpviqpU8011gzdZk6wKP1xY=
-github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba/go.mod h1:OZfzyayUdwsVBqxvbEMqwUntQT8HbFbgyqoudvwfVN0=
-github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007 h1:KwB0H2P/gxJgt823Ku1fTcFLDKMj6zsP3wbQGlBOm4U=
-github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007/go.mod h1:EbZAlb/2K6mKr26u3+3cLBe/caJaqCHw786On94C43g=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0 h1:9IxmR+1NH1WxaX44+t553fOrrZRfxwMVvnDuBIy0tgs=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0/go.mod h1:JiykN+8W5TA4UD2ClrzQCVvcH3NcyLEVv7RwY0busrw=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0 h1:7m9PVtccb8/pvKTXMaGuyceFno1icRyC2SFH7KG7+70=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0/go.mod h1:SZ899lZYQ0maUulWbZg+SWqabHQ1wTbyk3jT8wJfyo8=
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868 h1:FFdvEzlYwcuVHkdZ8YnZR/XomeMGbz5E2F2HZI3I3w8=
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868/go.mod h1:Kn1Hape05UzFZ7bOUnm3GVsHzP0TNrVmpfXYNHdqGGs=
-github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 h1:ko88+ZznniNJZbZPWAvHQU8SwKAdHngdDZ+pvVgB5ss=
-github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4=
+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=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0=
github.com/smartcontractkit/libocr v0.0.0-20240112202000-6359502d2ff1 h1:3y9WsXkZ5lxFrmfH7DQHs/q308lylKId5l/3VC0QAdM=
@@ -1417,8 +1417,8 @@ go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=
-golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
+golang.org/x/arch v0.7.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=
@@ -1446,8 +1446,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1458,8 +1458,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-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=
-golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
+golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE=
+golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
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=
@@ -1487,8 +1487,8 @@ golang.org/x/mod v0.4.1/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.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
-golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
+golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -1546,8 +1546,8 @@ golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
-golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
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=
@@ -1558,8 +1558,8 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
-golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
+golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
+golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
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=
@@ -1573,8 +1573,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
-golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1661,8 +1661,9 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.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=
@@ -1670,8 +1671,8 @@ golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuX
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1758,8 +1759,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
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.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM=
-golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
+golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
+golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg=
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=
@@ -1893,8 +1894,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
-google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/core/scripts/install-protoc.sh b/core/scripts/install-protoc.sh
new file mode 100755
index 00000000000..8d9dc4085c6
--- /dev/null
+++ b/core/scripts/install-protoc.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+set -x
+
+
+VERSION=$1
+
+if [ "$VERSION" == "" ]; then
+ echo "version required"
+ exit 1
+fi
+
+os=$(uname)
+arch=$(uname -m)
+
+install_dir=$HOME/.local
+$install_dir/bin/protoc --version | grep $VERSION
+rc=$?
+if [ $rc -eq 0 ]; then
+ # we have the current VERSION
+ echo "protoc up-to-date @ $VERSION"
+ exit 0
+fi
+
+
+if [ "$os" == "Linux" ] ; then
+ os="linux"
+ if [$arch != "x86_64"]; then
+ echo "unsupported os $os-$arch update $0"
+ exit 1
+ fi
+elif [ "$os" == "Darwin" ] ; then
+ os="osx"
+ # make life simply and download the universal binary
+ arch="universal_binary"
+else
+ echo "unsupported os $os. update $0"
+ exit 1
+fi
+
+workdir=$(mktemp -d)
+pushd $workdir
+pb_url="https://github.com/protocolbuffers/protobuf/releases"
+artifact=protoc-$VERSION-$os-$arch.zip
+curl -LO $pb_url/download/v${VERSION}/$artifact
+if [[ ! -d $install_dir ]]; then
+ mkdir $install_dir
+fi
+unzip -uo $artifact -d $install_dir
+rm $artifact
+
+echo "protoc $VERSION installed in $install_dir"
+echo "Add $install_dir/bin to PATH"
+export PATH=$install_dir/bin:$PATH
+popd
diff --git a/core/scripts/vrfv2/testnet/v2scripts/super_scripts.go b/core/scripts/vrfv2/testnet/v2scripts/super_scripts.go
index 1397274656c..5cfc3f81ce1 100644
--- a/core/scripts/vrfv2/testnet/v2scripts/super_scripts.go
+++ b/core/scripts/vrfv2/testnet/v2scripts/super_scripts.go
@@ -60,6 +60,7 @@ func DeployUniverseViaCLI(e helpers.Environment) {
deployVRFOwner := deployCmd.Bool("deploy-vrf-owner", true, "whether to deploy VRF owner contracts")
useTestCoordinator := deployCmd.Bool("use-test-coordinator", true, "whether to use test coordinator")
+ simulationBlock := deployCmd.String("simulation-block", "pending", "simulation block can be 'pending' or 'latest'")
// optional flags
fallbackWeiPerUnitLinkString := deployCmd.String("fallback-wei-per-unit-link", constants.FallbackWeiPerUnitLink.String(), "fallback wei/link ratio")
@@ -83,6 +84,10 @@ func DeployUniverseViaCLI(e helpers.Environment) {
reqsForTier4 := deployCmd.Int64("reqs-for-tier-4", constants.ReqsForTier4, "requests for tier 4")
reqsForTier5 := deployCmd.Int64("reqs-for-tier-5", constants.ReqsForTier5, "requests for tier 5")
+ if *simulationBlock != "pending" && *simulationBlock != "latest" {
+ helpers.PanicErr(fmt.Errorf("simulation block must be 'pending' or 'latest'"))
+ }
+
helpers.ParseArgs(
deployCmd, os.Args[2:],
)
@@ -162,6 +167,7 @@ func DeployUniverseViaCLI(e helpers.Environment) {
*deployVRFOwner,
coordinatorJobSpecConfig,
*useTestCoordinator,
+ *simulationBlock,
)
vrfPrimaryNode := nodesMap[model.VRFPrimaryNodeName]
@@ -181,6 +187,7 @@ func VRFV2DeployUniverse(
deployVRFOwner bool,
coordinatorJobSpecConfig model.CoordinatorJobSpecConfig,
useTestCoordinator bool,
+ simulationBlock string,
) model.JobSpecs {
var compressedPkHex string
var keyHash common.Hash
@@ -347,6 +354,7 @@ func VRFV2DeployUniverse(
coordinatorJobSpecConfig.RequestTimeout, //requestTimeout
contractAddresses.CoordinatorAddress,
coordinatorJobSpecConfig.EstimateGasMultiplier, //estimateGasMultiplier
+ simulationBlock,
func() string {
if keys := nodesMap[model.VRFPrimaryNodeName].SendingKeys; len(keys) > 0 {
return keys[0].Address
@@ -355,6 +363,7 @@ func VRFV2DeployUniverse(
}(),
contractAddresses.CoordinatorAddress,
contractAddresses.CoordinatorAddress,
+ simulationBlock,
)
if deployVRFOwner {
formattedVrfPrimaryJobSpec = strings.Replace(formattedVrfPrimaryJobSpec,
@@ -378,6 +387,7 @@ func VRFV2DeployUniverse(
coordinatorJobSpecConfig.RequestTimeout, //requestTimeout
contractAddresses.CoordinatorAddress,
coordinatorJobSpecConfig.EstimateGasMultiplier, //estimateGasMultiplier
+ simulationBlock,
func() string {
if keys := nodesMap[model.VRFPrimaryNodeName].SendingKeys; len(keys) > 0 {
return keys[0].Address
@@ -386,6 +396,7 @@ func VRFV2DeployUniverse(
}(),
contractAddresses.CoordinatorAddress,
contractAddresses.CoordinatorAddress,
+ simulationBlock,
)
if deployVRFOwner {
formattedVrfBackupJobSpec = strings.Replace(formattedVrfBackupJobSpec,
diff --git a/core/scripts/vrfv2plus/testnet/main.go b/core/scripts/vrfv2plus/testnet/main.go
index 320576055b5..bed961eb275 100644
--- a/core/scripts/vrfv2plus/testnet/main.go
+++ b/core/scripts/vrfv2plus/testnet/main.go
@@ -271,7 +271,7 @@ func main() {
dbURL := cmd.String("db-url", "", "postgres database url")
keystorePassword := cmd.String("keystore-pw", "", "password to the keystore")
nativePayment := cmd.Bool("native-payment", false, "whether to use native payment or not")
-
+ onlyPremium := cmd.Bool("only-premium", false, "whether to bill only premium amount")
preSeed := cmd.String("preseed", "", "request preSeed")
blockHash := cmd.String("blockhash", "", "request blockhash")
blockNum := cmd.Uint64("blocknum", 0, "request blocknumber")
@@ -328,7 +328,7 @@ func main() {
fmt.Printf("Proof: %+v, commitment: %+v\nSending fulfillment!", onChainProof, rc)
- tx, err := coordinator.FulfillRandomWords(e.Owner, onChainProof, rc)
+ tx, err := coordinator.FulfillRandomWords(e.Owner, onChainProof, rc, *onlyPremium)
helpers.PanicErr(err)
fmt.Println("waiting for it to mine:", helpers.ExplorerLink(e.ChainID, tx.Hash()))
@@ -540,8 +540,10 @@ func main() {
stalenessSeconds := cmd.Int64("staleness-seconds", 86400, "staleness in seconds")
gasAfterPayment := cmd.Int64("gas-after-payment", 33285, "gas after payment calculation")
fallbackWeiPerUnitLink := cmd.String("fallback-wei-per-unit-link", "", "fallback wei per unit link")
- flatFeeLinkPPM := cmd.Int64("flat-fee-link-ppm", 500, "fulfillment flat fee LINK ppm")
flatFeeEthPPM := cmd.Int64("flat-fee-eth-ppm", 500, "fulfillment flat fee ETH ppm")
+ flatFeeLinkDiscountPPM := cmd.Int64("flat-fee-link-discount-ppm", 100, "fulfillment flat fee discount for LINK payment denominated in native ppm")
+ nativePremiumPercentage := cmd.Int64("native-premium-percentage", 1, "premium percentage for native payment")
+ linkPremiumPercentage := cmd.Int64("link-premium-percentage", 1, "premium percentage for LINK payment")
helpers.ParseArgs(cmd, os.Args[2:], "coordinator-address", "fallback-wei-per-unit-link")
coordinator, err := vrf_coordinator_v2_5.NewVRFCoordinatorV25(common.HexToAddress(*setConfigAddress), e.Ec)
@@ -555,16 +557,18 @@ func main() {
uint32(*stalenessSeconds),
uint32(*gasAfterPayment),
decimal.RequireFromString(*fallbackWeiPerUnitLink).BigInt(),
- vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig{
- FulfillmentFlatFeeLinkPPM: uint32(*flatFeeLinkPPM),
- FulfillmentFlatFeeNativePPM: uint32(*flatFeeEthPPM),
- },
+ uint32(*flatFeeEthPPM),
+ uint32(*flatFeeLinkDiscountPPM),
+ uint8(*nativePremiumPercentage),
+ uint8(*linkPremiumPercentage),
)
case "coordinator-register-key":
coordinatorRegisterKey := flag.NewFlagSet("coordinator-register-key", flag.ExitOnError)
registerKeyAddress := coordinatorRegisterKey.String("address", "", "coordinator address")
registerKeyUncompressedPubKey := coordinatorRegisterKey.String("pubkey", "", "uncompressed pubkey")
+ gasLaneMaxGas := coordinatorRegisterKey.Uint64("gas-lane-max-gas", 1e12, "gas lane max gas price")
helpers.ParseArgs(coordinatorRegisterKey, os.Args[2:], "address", "pubkey", "oracle-address")
+
coordinator, err := vrf_coordinator_v2_5.NewVRFCoordinatorV25(common.HexToAddress(*registerKeyAddress), e.Ec)
helpers.PanicErr(err)
@@ -573,7 +577,7 @@ func main() {
*registerKeyUncompressedPubKey = strings.Replace(*registerKeyUncompressedPubKey, "0x", "04", 1)
}
- v2plusscripts.RegisterCoordinatorProvingKey(e, *coordinator, *registerKeyUncompressedPubKey)
+ v2plusscripts.RegisterCoordinatorProvingKey(e, *coordinator, *registerKeyUncompressedPubKey, *gasLaneMaxGas)
case "coordinator-deregister-key":
coordinatorDeregisterKey := flag.NewFlagSet("coordinator-deregister-key", flag.ExitOnError)
deregisterKeyAddress := coordinatorDeregisterKey.String("address", "", "coordinator address")
@@ -1071,6 +1075,7 @@ func main() {
coordinatorAddress := coordinatorReregisterKey.String("coordinator-address", "", "coordinator address")
uncompressedPubKey := coordinatorReregisterKey.String("pubkey", "", "uncompressed pubkey")
skipDeregister := coordinatorReregisterKey.Bool("skip-deregister", false, "if true, key will not be deregistered")
+ gasLaneMaxGas := coordinatorReregisterKey.Uint64("gas-lane-max-gas", 1e12, "gas lane max gas")
helpers.ParseArgs(coordinatorReregisterKey, os.Args[2:], "coordinator-address", "pubkey", "new-oracle-address")
coordinator, err := vrf_coordinator_v2_5.NewVRFCoordinatorV25(common.HexToAddress(*coordinatorAddress), e.Ec)
@@ -1095,7 +1100,7 @@ func main() {
// Use a higher gas price for the register call
e.Owner.GasPrice.Mul(e.Owner.GasPrice, big.NewInt(2))
registerTx, err := coordinator.RegisterProvingKey(e.Owner,
- [2]*big.Int{pk.X, pk.Y})
+ [2]*big.Int{pk.X, pk.Y}, *gasLaneMaxGas)
helpers.PanicErr(err)
fmt.Println("Register transaction", helpers.ExplorerLink(e.ChainID, registerTx.Hash()))
diff --git a/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go b/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go
index 09c93ff879b..fcea01b71c8 100644
--- a/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go
+++ b/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go
@@ -39,12 +39,15 @@ import (
var coordinatorV2PlusABI = evmtypes.MustGetABI(vrf_coordinator_v2plus_interface.IVRFCoordinatorV2PlusInternalABI)
type CoordinatorConfigV2Plus struct {
- MinConfs int
- MaxGasLimit int64
- StalenessSeconds int64
- GasAfterPayment int64
- FallbackWeiPerUnitLink *big.Int
- FeeConfig vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig
+ MinConfs int
+ MaxGasLimit int64
+ StalenessSeconds int64
+ GasAfterPayment int64
+ FallbackWeiPerUnitLink *big.Int
+ FulfillmentFlatFeeNativePPM uint32
+ FulfillmentFlatFeeLinkDiscountPPM uint32
+ NativePremiumPercentage uint8
+ LinkPremiumPercentage uint8
}
func SmokeTestVRF(e helpers.Environment) {
@@ -66,8 +69,11 @@ func SmokeTestVRF(e helpers.Environment) {
maxGasLimit := smokeCmd.Int64("max-gas-limit", 2.5e6, "max gas limit")
stalenessSeconds := smokeCmd.Int64("staleness-seconds", 86400, "staleness in seconds")
gasAfterPayment := smokeCmd.Int64("gas-after-payment", 33285, "gas after payment calculation")
- flatFeeLinkPPM := smokeCmd.Int64("flat-fee-link-ppm", 500, "fulfillment flat fee LINK ppm")
flatFeeEthPPM := smokeCmd.Int64("flat-fee-eth-ppm", 500, "fulfillment flat fee ETH ppm")
+ flatFeeLinkDiscountPPM := smokeCmd.Int64("flat-fee-link-discount-ppm", 100, "fulfillment flat fee discount for LINK payment denominated in native ppm")
+ nativePremiumPercentage := smokeCmd.Int64("native-premium-percentage", 1, "premium percentage for native payment")
+ linkPremiumPercentage := smokeCmd.Int64("link-premium-percentage", 1, "premium percentage for LINK payment")
+ gasLaneMaxGas := smokeCmd.Int64("gas-lane-max-gas", 1e12, "gas lane max gas price")
helpers.ParseArgs(
smokeCmd, os.Args[2:],
@@ -140,10 +146,10 @@ func SmokeTestVRF(e helpers.Environment) {
uint32(*stalenessSeconds),
uint32(*gasAfterPayment),
fallbackWeiPerUnitLink,
- vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig{
- FulfillmentFlatFeeLinkPPM: uint32(*flatFeeLinkPPM),
- FulfillmentFlatFeeNativePPM: uint32(*flatFeeEthPPM),
- },
+ uint32(*flatFeeEthPPM),
+ uint32(*flatFeeLinkDiscountPPM),
+ uint8(*nativePremiumPercentage),
+ uint8(*linkPremiumPercentage),
)
}
@@ -196,7 +202,7 @@ func SmokeTestVRF(e helpers.Environment) {
x, y := secp256k1.Coordinates(point)
fmt.Println("proving key points x:", x, ", y:", y)
fmt.Println("proving key points from unmarshal:", pk.X, pk.Y)
- tx, err := coordinator.RegisterProvingKey(e.Owner, [2]*big.Int{x, y})
+ tx, err := coordinator.RegisterProvingKey(e.Owner, [2]*big.Int{x, y}, uint64(*gasLaneMaxGas))
helpers.PanicErr(err)
registerReceipt := helpers.ConfirmTXMined(context.Background(), e.Ec, tx, e.ChainID, "register proving key on", coordinatorAddress.String())
var provingKeyRegisteredLog *vrf_coordinator_v2_5.VRFCoordinatorV25ProvingKeyRegistered
@@ -218,12 +224,12 @@ func SmokeTestVRF(e helpers.Environment) {
fmt.Println("key hash registered:", hexutil.Encode(provingKeyRegisteredLog.KeyHash[:]))
fmt.Println("\nProving key registered, getting proving key hashes from deployed contract...")
- _, _, provingKeyHashes, configErr := coordinator.GetRequestConfig(nil)
- helpers.PanicErr(configErr)
- fmt.Println("Key hash registered:", hexutil.Encode(provingKeyHashes[len(provingKeyHashes)-1][:]))
+ registerdKeyHash, err := coordinator.SProvingKeyHashes(nil, big.NewInt(0))
+ helpers.PanicErr(err)
+ fmt.Printf("Key hash registered: %x\n", registerdKeyHash)
ourKeyHash := key.PublicKey.MustHash()
- if !bytes.Equal(provingKeyHashes[len(provingKeyHashes)-1][:], ourKeyHash[:]) {
- panic(fmt.Sprintf("unexpected key hash %s, expected %s", hexutil.Encode(provingKeyHashes[len(provingKeyHashes)-1][:]), hexutil.Encode(ourKeyHash[:])))
+ if !bytes.Equal(registerdKeyHash[:], ourKeyHash[:]) {
+ panic(fmt.Sprintf("unexpected key hash %s, expected %s", hexutil.Encode(registerdKeyHash[:]), hexutil.Encode(ourKeyHash[:])))
}
fmt.Println("\nDeploying consumer...")
@@ -466,6 +472,7 @@ func DeployUniverseViaCLI(e helpers.Environment) {
deployCmd := flag.NewFlagSet("deploy-universe", flag.ExitOnError)
// required flags
+ nativeOnly := deployCmd.Bool("native-only", false, "if true, link and link feed are not set up")
linkAddress := deployCmd.String("link-address", "", "address of link token")
linkEthAddress := deployCmd.String("link-eth-feed", "", "address of link eth feed")
bhsContractAddressString := deployCmd.String("bhs-address", "", "address of BHS contract")
@@ -480,6 +487,7 @@ func DeployUniverseViaCLI(e helpers.Environment) {
estimateGasMultiplier := deployCmd.Float64("estimate-gas-multiplier", 1.1, "")
pollPeriod := deployCmd.String("poll-period", "300ms", "")
requestTimeout := deployCmd.String("request-timeout", "30m0s", "")
+ simulationBlock := deployCmd.String("simulation-block", "pending", "simulation block can be 'pending' or 'latest'")
// optional flags
fallbackWeiPerUnitLinkString := deployCmd.String("fallback-wei-per-unit-link", "6e16", "fallback wei/link ratio")
@@ -491,21 +499,33 @@ func DeployUniverseViaCLI(e helpers.Environment) {
maxGasLimit := deployCmd.Int64("max-gas-limit", constants.MaxGasLimit, "max gas limit")
stalenessSeconds := deployCmd.Int64("staleness-seconds", constants.StalenessSeconds, "staleness in seconds")
gasAfterPayment := deployCmd.Int64("gas-after-payment", constants.GasAfterPayment, "gas after payment calculation")
- flatFeeLinkPPM := deployCmd.Int64("flat-fee-link-ppm", constants.FlatFeeLinkPPM, "fulfillment flat fee LINK ppm")
- flatFeeEthPPM := deployCmd.Int64("flat-fee-eth-ppm", constants.FlatFeeNativePPM, "fulfillment flat fee ETH ppm")
+ flatFeeEthPPM := deployCmd.Int64("flat-fee-eth-ppm", 500, "fulfillment flat fee ETH ppm")
+ flatFeeLinkDiscountPPM := deployCmd.Int64("flat-fee-link-discount-ppm", 100, "fulfillment flat fee discount for LINK payment denominated in native ppm")
+ nativePremiumPercentage := deployCmd.Int64("native-premium-percentage", 1, "premium percentage for native payment")
+ linkPremiumPercentage := deployCmd.Int64("link-premium-percentage", 1, "premium percentage for LINK payment")
+ gasLaneMaxGas := deployCmd.Int64("gas-lane-max-gas", 1e12, "gas lane max gas price")
helpers.ParseArgs(
deployCmd, os.Args[2:],
)
+ if *nativeOnly {
+ if *linkAddress != "" || *linkEthAddress != "" {
+ panic("native-only flag is set, but link address or link eth address is provided")
+ }
+ if *subscriptionBalanceJuelsString != "0" {
+ panic("native-only flag is set, but link subscription balance is provided")
+ }
+ }
+
+ if *simulationBlock != "pending" && *simulationBlock != "latest" {
+ helpers.PanicErr(fmt.Errorf("simulation block must be 'pending' or 'latest'"))
+ }
+
fallbackWeiPerUnitLink := decimal.RequireFromString(*fallbackWeiPerUnitLinkString).BigInt()
subscriptionBalanceJuels := decimal.RequireFromString(*subscriptionBalanceJuelsString).BigInt()
subscriptionBalanceNativeWei := decimal.RequireFromString(*subscriptionBalanceNativeWeiString).BigInt()
-
- feeConfig := vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig{
- FulfillmentFlatFeeLinkPPM: uint32(*flatFeeLinkPPM),
- FulfillmentFlatFeeNativePPM: uint32(*flatFeeEthPPM),
- }
+ fundingAmount := decimal.RequireFromString(*nodeSendingKeyFundingAmount).BigInt()
var vrfPrimaryNodeSendingKeys []string
if len(*vrfPrimaryNodeSendingKeysString) > 0 {
@@ -514,7 +534,6 @@ func DeployUniverseViaCLI(e helpers.Environment) {
nodesMap := make(map[string]model.Node)
- fundingAmount := decimal.RequireFromString(*nodeSendingKeyFundingAmount).BigInt()
nodesMap[model.VRFPrimaryNodeName] = model.Node{
SendingKeys: util.MapToSendingKeyArr(vrfPrimaryNodeSendingKeys),
SendingKeyFundingAmount: fundingAmount,
@@ -535,12 +554,15 @@ func DeployUniverseViaCLI(e helpers.Environment) {
}
coordinatorConfig := CoordinatorConfigV2Plus{
- MinConfs: *minConfs,
- MaxGasLimit: *maxGasLimit,
- StalenessSeconds: *stalenessSeconds,
- GasAfterPayment: *gasAfterPayment,
- FallbackWeiPerUnitLink: fallbackWeiPerUnitLink,
- FeeConfig: feeConfig,
+ MinConfs: *minConfs,
+ MaxGasLimit: *maxGasLimit,
+ StalenessSeconds: *stalenessSeconds,
+ GasAfterPayment: *gasAfterPayment,
+ FallbackWeiPerUnitLink: fallbackWeiPerUnitLink,
+ FulfillmentFlatFeeNativePPM: uint32(*flatFeeEthPPM),
+ FulfillmentFlatFeeLinkDiscountPPM: uint32(*flatFeeLinkDiscountPPM),
+ NativePremiumPercentage: uint8(*nativePremiumPercentage),
+ LinkPremiumPercentage: uint8(*linkPremiumPercentage),
}
vrfKeyRegistrationConfig := model.VRFKeyRegistrationConfig{
@@ -562,8 +584,12 @@ func DeployUniverseViaCLI(e helpers.Environment) {
vrfKeyRegistrationConfig,
contractAddresses,
coordinatorConfig,
+ *batchFulfillmentEnabled,
+ *nativeOnly,
nodesMap,
+ uint64(*gasLaneMaxGas),
coordinatorJobSpecConfig,
+ *simulationBlock,
)
vrfPrimaryNode := nodesMap[model.VRFPrimaryNodeName]
@@ -579,8 +605,12 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
vrfKeyRegistrationConfig model.VRFKeyRegistrationConfig,
contractAddresses model.ContractAddresses,
coordinatorConfig CoordinatorConfigV2Plus,
+ batchFulfillmentEnabled bool,
+ nativeOnly bool,
nodesMap map[string]model.Node,
+ gasLaneMaxGas uint64,
coordinatorJobSpecConfig model.CoordinatorJobSpecConfig,
+ simulationBlock string,
) model.JobSpecs {
var compressedPkHex string
var keyHash common.Hash
@@ -609,12 +639,12 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
helpers.PanicErr(err)
}
- if len(contractAddresses.LinkAddress) == 0 {
+ if !nativeOnly && len(contractAddresses.LinkAddress) == 0 {
fmt.Println("\nDeploying LINK Token...")
contractAddresses.LinkAddress = helpers.DeployLinkToken(e).String()
}
- if len(contractAddresses.LinkEthAddress) == 0 {
+ if !nativeOnly && len(contractAddresses.LinkEthAddress) == 0 {
fmt.Println("\nDeploying LINK/ETH Feed...")
contractAddresses.LinkEthAddress = helpers.DeployLinkEthFeed(e, contractAddresses.LinkAddress, coordinatorConfig.FallbackWeiPerUnitLink).String()
}
@@ -651,7 +681,10 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
uint32(coordinatorConfig.StalenessSeconds),
uint32(coordinatorConfig.GasAfterPayment),
coordinatorConfig.FallbackWeiPerUnitLink,
- coordinatorConfig.FeeConfig,
+ coordinatorConfig.FulfillmentFlatFeeNativePPM,
+ coordinatorConfig.FulfillmentFlatFeeLinkDiscountPPM,
+ coordinatorConfig.NativePremiumPercentage,
+ coordinatorConfig.LinkPremiumPercentage,
)
fmt.Println("\nConfig set, getting current config from deployed contract...")
@@ -662,12 +695,12 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
//NOTE - register proving key against EOA account, and not against Oracle's sending address in other to be able
// easily withdraw funds from Coordinator contract back to EOA account
- RegisterCoordinatorProvingKey(e, *coordinator, vrfKeyRegistrationConfig.VRFKeyUncompressedPubKey)
+ RegisterCoordinatorProvingKey(e, *coordinator, vrfKeyRegistrationConfig.VRFKeyUncompressedPubKey, gasLaneMaxGas)
fmt.Println("\nProving key registered, getting proving key hashes from deployed contract...")
- _, _, provingKeyHashes, configErr := coordinator.GetRequestConfig(nil)
- helpers.PanicErr(configErr)
- fmt.Println("Key hash registered:", hex.EncodeToString(provingKeyHashes[0][:]))
+ registerdKeyHash, err2 := coordinator.SProvingKeyHashes(nil, big.NewInt(0))
+ helpers.PanicErr(err2)
+ fmt.Println("Key hash registered:", hex.EncodeToString(registerdKeyHash[:]))
} else {
fmt.Println("NOT registering proving key - you must do this eventually in order to fully deploy VRF!")
}
@@ -679,7 +712,6 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
EoaCreateSub(e, *coordinator)
subID := FindSubscriptionID(e, coordinator)
- helpers.PanicErr(err)
fmt.Println("\nAdding consumer to subscription...")
EoaAddConsumerToSub(e, *coordinator, subID, consumerAddress.String())
@@ -704,11 +736,10 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
formattedVrfV2PlusPrimaryJobSpec := fmt.Sprintf(
jobs.VRFV2PlusJobFormatted,
- contractAddresses.CoordinatorAddress, //coordinatorAddress
- contractAddresses.BatchCoordinatorAddress, //batchCoordinatorAddress
- coordinatorJobSpecConfig.BatchFulfillmentEnabled, //batchFulfillmentEnabled
- coordinatorJobSpecConfig.BatchFulfillmentGasMultiplier, //batchFulfillmentGasMultiplier
- strings.Join(util.MapToAddressArr(nodesMap[model.VRFPrimaryNodeName].SendingKeys), "\",\""), //fromAddresses
+ contractAddresses.CoordinatorAddress, //coordinatorAddress
+ contractAddresses.BatchCoordinatorAddress, //batchCoordinatorAddress
+ coordinatorJobSpecConfig.BatchFulfillmentEnabled, //batchFulfillmentEnabled
+ coordinatorJobSpecConfig.BatchFulfillmentGasMultiplier, //batchFulfillmentGasMultiplier
compressedPkHex, //publicKey
coordinatorConfig.MinConfs, //minIncomingConfirmations
e.ChainID, //evmChainID
@@ -717,6 +748,7 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
coordinatorJobSpecConfig.RequestTimeout, //requestTimeout
contractAddresses.CoordinatorAddress,
coordinatorJobSpecConfig.EstimateGasMultiplier, //estimateGasMultiplier
+ simulationBlock,
func() string {
if keys := nodesMap[model.VRFPrimaryNodeName].SendingKeys; len(keys) > 0 {
return keys[0].Address
@@ -725,6 +757,7 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
}(),
contractAddresses.CoordinatorAddress,
contractAddresses.CoordinatorAddress,
+ simulationBlock,
)
formattedVrfV2PlusBackupJobSpec := fmt.Sprintf(
@@ -741,6 +774,7 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
coordinatorJobSpecConfig.RequestTimeout, //requestTimeout
contractAddresses.CoordinatorAddress,
coordinatorJobSpecConfig.EstimateGasMultiplier, //estimateGasMultiplier
+ simulationBlock,
func() string {
if keys := nodesMap[model.VRFPrimaryNodeName].SendingKeys; len(keys) > 0 {
return keys[0].Address
@@ -749,6 +783,7 @@ func VRFV2PlusDeployUniverse(e helpers.Environment,
}(),
contractAddresses.CoordinatorAddress,
contractAddresses.CoordinatorAddress,
+ simulationBlock,
)
formattedBHSJobSpec := fmt.Sprintf(
diff --git a/core/scripts/vrfv2plus/testnet/v2plusscripts/util.go b/core/scripts/vrfv2plus/testnet/v2plusscripts/util.go
index 7b38dc7b391..716e0058ff4 100644
--- a/core/scripts/vrfv2plus/testnet/v2plusscripts/util.go
+++ b/core/scripts/vrfv2plus/testnet/v2plusscripts/util.go
@@ -53,10 +53,12 @@ func DeployCoordinator(
coordinator, err := vrf_coordinator_v2_5.NewVRFCoordinatorV25(coordinatorAddress, e.Ec)
helpers.PanicErr(err)
- linkTx, err := coordinator.SetLINKAndLINKNativeFeed(e.Owner,
- common.HexToAddress(linkAddress), common.HexToAddress(linkEthAddress))
- helpers.PanicErr(err)
- helpers.ConfirmTXMined(context.Background(), e.Ec, linkTx, e.ChainID)
+ if linkAddress != "" && linkEthAddress != "" {
+ linkTx, err := coordinator.SetLINKAndLINKNativeFeed(e.Owner,
+ common.HexToAddress(linkAddress), common.HexToAddress(linkEthAddress))
+ helpers.PanicErr(err)
+ helpers.ConfirmTXMined(context.Background(), e.Ec, linkTx, e.ChainID)
+ }
return coordinatorAddress
}
@@ -145,11 +147,7 @@ func PrintCoordinatorConfig(coordinator *vrf_coordinator_v2_5.VRFCoordinatorV25)
cfg, err := coordinator.SConfig(nil)
helpers.PanicErr(err)
- feeConfig, err := coordinator.SFeeConfig(nil)
- helpers.PanicErr(err)
-
fmt.Printf("Coordinator config: %+v\n", cfg)
- fmt.Printf("Coordinator fee config: %+v\n", feeConfig)
}
func SetCoordinatorConfig(
@@ -160,7 +158,10 @@ func SetCoordinatorConfig(
stalenessSeconds uint32,
gasAfterPayment uint32,
fallbackWeiPerUnitLink *big.Int,
- feeConfig vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig,
+ fulfillmentFlatFeeNativePPM uint32,
+ fulfillmentFlatFeeLinkDiscountPPM uint32,
+ nativePremiumPercentage uint8,
+ linkPremiumPercentage uint8,
) {
tx, err := coordinator.SetConfig(
e.Owner,
@@ -169,20 +170,23 @@ func SetCoordinatorConfig(
stalenessSeconds, // stalenessSeconds
gasAfterPayment, // gasAfterPaymentCalculation
fallbackWeiPerUnitLink, // 0.01 eth per link fallbackLinkPrice
- feeConfig,
+ fulfillmentFlatFeeNativePPM,
+ fulfillmentFlatFeeLinkDiscountPPM,
+ nativePremiumPercentage,
+ linkPremiumPercentage,
)
helpers.PanicErr(err)
helpers.ConfirmTXMined(context.Background(), e.Ec, tx, e.ChainID)
}
func RegisterCoordinatorProvingKey(e helpers.Environment,
- coordinator vrf_coordinator_v2_5.VRFCoordinatorV25, uncompressed string) {
+ coordinator vrf_coordinator_v2_5.VRFCoordinatorV25, uncompressed string, gasLaneMaxGas uint64) {
pubBytes, err := hex.DecodeString(uncompressed)
helpers.PanicErr(err)
pk, err := crypto.UnmarshalPubkey(pubBytes)
helpers.PanicErr(err)
tx, err := coordinator.RegisterProvingKey(e.Owner,
- [2]*big.Int{pk.X, pk.Y})
+ [2]*big.Int{pk.X, pk.Y}, gasLaneMaxGas)
helpers.PanicErr(err)
helpers.ConfirmTXMined(
context.Background(),
@@ -190,6 +194,7 @@ func RegisterCoordinatorProvingKey(e helpers.Environment,
tx,
e.ChainID,
fmt.Sprintf("Uncompressed public key: %s,", uncompressed),
+ fmt.Sprintf("Gas Lane Max Gas: %d,", gasLaneMaxGas),
)
}
diff --git a/core/services/blockhashstore/feeder_test.go b/core/services/blockhashstore/feeder_test.go
index ad039798408..3266b7d92ea 100644
--- a/core/services/blockhashstore/feeder_test.go
+++ b/core/services/blockhashstore/feeder_test.go
@@ -1076,6 +1076,7 @@ func newRandomnessFulfilledLogV2Plus(
e.OutputSeed,
e.Payment,
e.Success,
+ e.OnlyPremium,
)
require.NoError(t, err)
diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go
index a9f9c22df52..e7f867c54fb 100644
--- a/core/services/chainlink/application.go
+++ b/core/services/chainlink/application.go
@@ -22,6 +22,7 @@ import (
commonservices "github.com/smartcontractkit/chainlink-common/pkg/services"
"github.com/smartcontractkit/chainlink-common/pkg/utils"
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities"
"github.com/smartcontractkit/chainlink/v2/core/static"
"github.com/smartcontractkit/chainlink/v2/core/bridges"
@@ -57,6 +58,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/telemetry"
"github.com/smartcontractkit/chainlink/v2/core/services/vrf"
"github.com/smartcontractkit/chainlink/v2/core/services/webhook"
+ "github.com/smartcontractkit/chainlink/v2/core/services/workflows"
"github.com/smartcontractkit/chainlink/v2/core/sessions"
"github.com/smartcontractkit/chainlink/v2/core/sessions/ldapauth"
"github.com/smartcontractkit/chainlink/v2/core/sessions/localauth"
@@ -183,6 +185,7 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
keyStore := opts.KeyStore
restrictedHTTPClient := opts.RestrictedHTTPClient
unrestrictedHTTPClient := opts.UnrestrictedHTTPClient
+ registry := capabilities.NewRegistry()
// LOOPs can be created as options, in the case of LOOP relayers, or
// as OCR2 job implementations, in the case of Median today.
@@ -351,6 +354,10 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
streamRegistry,
pipelineRunner,
cfg.JobPipeline()),
+ job.Workflow: workflows.NewDelegate(
+ globalLogger,
+ registry,
+ ),
}
webhookJobRunner = delegates[job.Webhook].(*webhook.Delegate).WebhookJobRunner()
)
diff --git a/core/services/chainlink/mocks/relayer_chain_interoperators.go b/core/services/chainlink/mocks/relayer_chain_interoperators.go
index 74dc9dc1d45..4c552551008 100644
--- a/core/services/chainlink/mocks/relayer_chain_interoperators.go
+++ b/core/services/chainlink/mocks/relayer_chain_interoperators.go
@@ -19,6 +19,7 @@ import (
// FakeRelayerChainInteroperators is a fake chainlink.RelayerChainInteroperators.
// This exists because mockery generation doesn't understand how to produce an alias instead of the underlying type (which is not exported in this case).
type FakeRelayerChainInteroperators struct {
+ Relayers []loop.Relayer
EVMChains legacyevm.LegacyChainContainer
Nodes []types.NodeStatus
NodesErr error
@@ -45,7 +46,7 @@ func (f *FakeRelayerChainInteroperators) Get(id relay.ID) (loop.Relayer, error)
}
func (f *FakeRelayerChainInteroperators) Slice() []loop.Relayer {
- panic("unimplemented")
+ return f.Relayers
}
func (f *FakeRelayerChainInteroperators) LegacyCosmosChains() chainlink.LegacyCosmosContainer {
diff --git a/core/services/chainlink/testdata/config-multi-chain-effective.toml b/core/services/chainlink/testdata/config-multi-chain-effective.toml
index bd64ae04812..03990b02a50 100644
--- a/core/services/chainlink/testdata/config-multi-chain-effective.toml
+++ b/core/services/chainlink/testdata/config-multi-chain-effective.toml
@@ -305,7 +305,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'primary'
@@ -392,7 +392,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'foo'
@@ -413,7 +413,7 @@ MinIncomingConfirmations = 5
MinContractPayment = '0.00001 link'
NonceAutoSync = true
NoNewHeadsThreshold = '30s'
-RPCDefaultBatchSize = 250
+RPCDefaultBatchSize = 100
RPCBlockQueryDelay = 10
[EVM.Transactions]
@@ -473,7 +473,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'bar'
diff --git a/core/services/feeds/service.go b/core/services/feeds/service.go
index a1b4e9b2837..ddb683facfb 100644
--- a/core/services/feeds/service.go
+++ b/core/services/feeds/service.go
@@ -439,6 +439,10 @@ func (s *service) DeleteJob(ctx context.Context, args *DeleteJobArgs) (int64, er
return 0, errors.Wrap(err, "GetJobProposalByRemoteUUID did not find any proposals to delete")
}
+ logger := s.lggr.With(
+ "job_proposal_id", proposal.ID,
+ )
+
// Ensure that if the job proposal exists, that it belongs to the feeds
// manager which previously proposed a job using the remote UUID.
if args.FeedsManagerID != proposal.FeedsManagerID {
@@ -453,7 +457,7 @@ func (s *service) DeleteJob(ctx context.Context, args *DeleteJobArgs) (int64, er
}
if err = s.observeJobProposalCounts(); err != nil {
- return 0, err
+ logger.Errorw("Failed to push metrics for job proposal deletion", err)
}
return proposal.ID, nil
@@ -500,8 +504,13 @@ func (s *service) RevokeJob(ctx context.Context, args *RevokeJobArgs) (int64, er
return 0, errors.Wrap(err, "RevokeSpec failed")
}
+ logger := s.lggr.With(
+ "job_proposal_id", proposal.ID,
+ "job_proposal_spec_id", latest.ID,
+ )
+
if err = s.observeJobProposalCounts(); err != nil {
- return 0, err
+ logger.Errorw("Failed to push metrics for revoke job", err)
}
return proposal.ID, nil
@@ -556,6 +565,10 @@ func (s *service) ProposeJob(ctx context.Context, args *ProposeJobArgs) (int64,
}
}
+ logger := s.lggr.With(
+ "job_proposal_remote_uuid", args.RemoteUUID,
+ )
+
var id int64
q := s.q.WithOpts(pg.WithParentCtx(ctx))
err = q.Transaction(func(tx pg.Queryer) error {
@@ -597,7 +610,7 @@ func (s *service) ProposeJob(ctx context.Context, args *ProposeJobArgs) (int64,
promJobProposalRequest.Inc()
if err = s.observeJobProposalCounts(); err != nil {
- return 0, err
+ logger.Errorw("Failed to push metrics for propose job", err)
}
return id, nil
@@ -637,6 +650,11 @@ func (s *service) RejectSpec(ctx context.Context, id int64) error {
return errors.Wrap(err, "fms rpc client is not connected")
}
+ logger := s.lggr.With(
+ "job_proposal_id", proposal.ID,
+ "job_proposal_spec_id", id,
+ )
+
q := s.q.WithOpts(pctx)
err = q.Transaction(func(tx pg.Queryer) error {
if err = s.orm.RejectSpec(id, pg.WithQueryer(tx)); err != nil {
@@ -656,9 +674,11 @@ func (s *service) RejectSpec(ctx context.Context, id int64) error {
return errors.Wrap(err, "could not reject job proposal")
}
- err = s.observeJobProposalCounts()
+ if err = s.observeJobProposalCounts(); err != nil {
+ logger.Errorw("Failed to push metrics for job rejection", err)
+ }
- return err
+ return nil
}
// IsJobManaged determines is a job is managed by the Feeds Manager.
@@ -859,6 +879,11 @@ func (s *service) CancelSpec(ctx context.Context, id int64) error {
return errors.Wrap(err, "fms rpc client")
}
+ logger := s.lggr.With(
+ "job_proposal_id", jp.ID,
+ "job_proposal_spec_id", id,
+ )
+
q := s.q.WithOpts(pctx)
err = q.Transaction(func(tx pg.Queryer) error {
var (
@@ -902,9 +927,11 @@ func (s *service) CancelSpec(ctx context.Context, id int64) error {
return err
}
- err = s.observeJobProposalCounts()
+ if err = s.observeJobProposalCounts(); err != nil {
+ logger.Errorw("Failed to push metrics for job cancellation", err)
+ }
- return err
+ return nil
}
// ListSpecsByJobProposalIDs gets the specs which belong to the job proposal ids.
@@ -964,9 +991,11 @@ func (s *service) Start(ctx context.Context) error {
mgr := mgrs[0]
s.connectFeedManager(ctx, mgr, privkey)
- err = s.observeJobProposalCounts()
+ if err = s.observeJobProposalCounts(); err != nil {
+ s.lggr.Error("failed to observe job proposal count when starting service", err)
+ }
- return err
+ return nil
})
}
diff --git a/core/services/functions/connector_handler.go b/core/services/functions/connector_handler.go
index c8c522e6a62..75a3dca24f1 100644
--- a/core/services/functions/connector_handler.go
+++ b/core/services/functions/connector_handler.go
@@ -271,7 +271,7 @@ func (h *functionsConnectorHandler) handleOffchainRequest(request *OffchainReque
defer cancel()
err := h.listener.HandleOffchainRequest(ctx, request)
if err != nil {
- h.lggr.Errorw("internal error while processing", "id", request.RequestId, "error", err)
+ h.lggr.Errorw("internal error while processing", "id", request.RequestId, "err", err)
h.mu.Lock()
defer h.mu.Unlock()
state, ok := h.heartbeatRequests[RequestID(request.RequestId)]
@@ -330,7 +330,7 @@ func (h *functionsConnectorHandler) cacheNewRequestLocked(requestId RequestID, r
func (h *functionsConnectorHandler) sendResponseAndLog(ctx context.Context, gatewayId string, requestBody *api.MessageBody, payload any) {
err := h.sendResponse(ctx, gatewayId, requestBody, payload)
if err != nil {
- h.lggr.Errorw("failed to send response to gateway", "id", gatewayId, "error", err)
+ h.lggr.Errorw("failed to send response to gateway", "id", gatewayId, "err", err)
} else {
h.lggr.Debugw("sent to gateway", "id", gatewayId, "messageId", requestBody.MessageId, "donId", requestBody.DonId, "method", requestBody.Method)
}
diff --git a/core/services/gateway/connectionmanager.go b/core/services/gateway/connectionmanager.go
index e5f7fb13afb..7438b0042d2 100644
--- a/core/services/gateway/connectionmanager.go
+++ b/core/services/gateway/connectionmanager.go
@@ -11,6 +11,7 @@ import (
"time"
"github.com/gorilla/websocket"
+ "github.com/jonboulle/clockwork"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
"go.uber.org/multierr"
@@ -24,12 +25,11 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/handlers"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/network"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
)
-var promHeartbeatsSent = promauto.NewGaugeVec(prometheus.GaugeOpts{
- Name: "gateway_heartbeats_sent",
- Help: "Metric to track the number of successful node heartbeates per DON",
+var promKeepalivesSent = promauto.NewGaugeVec(prometheus.GaugeOpts{
+ Name: "gateway_keepalives_sent",
+ Help: "Metric to track the number of successful keepalive ping messages per DON",
}, []string{"don_id"})
// ConnectionManager holds all connections between Gateway and Nodes.
@@ -47,7 +47,7 @@ type connectionManager struct {
config *config.ConnectionManagerConfig
dons map[string]*donConnectionManager
wsServer network.WebSocketServer
- clock utils.Clock
+ clock clockwork.Clock
connAttempts map[string]*connAttempt
connAttemptCounter uint64
connAttemptsMu sync.Mutex
@@ -77,6 +77,7 @@ type donConnectionManager struct {
}
type nodeState struct {
+ name string
conn network.WSConnectionWrapper
}
@@ -88,7 +89,7 @@ type connAttempt struct {
timestamp uint32
}
-func NewConnectionManager(gwConfig *config.GatewayConfig, clock utils.Clock, lggr logger.Logger) (ConnectionManager, error) {
+func NewConnectionManager(gwConfig *config.GatewayConfig, clock clockwork.Clock, lggr logger.Logger) (ConnectionManager, error) {
codec := &api.JsonRPCCodec{}
dons := make(map[string]*donConnectionManager)
for _, donConfig := range gwConfig.Dons {
@@ -107,10 +108,14 @@ func NewConnectionManager(gwConfig *config.GatewayConfig, clock utils.Clock, lgg
if ok {
return nil, fmt.Errorf("duplicate node address %s in DON %s", nodeAddress, donConfig.DonId)
}
- nodes[nodeAddress] = &nodeState{conn: network.NewWSConnectionWrapper(lggr)}
- if nodes[nodeAddress].conn == nil {
+ connWrapper := network.NewWSConnectionWrapper(lggr)
+ if connWrapper == nil {
return nil, fmt.Errorf("error creating WSConnectionWrapper for node %s", nodeAddress)
}
+ nodes[nodeAddress] = &nodeState{
+ name: nodeConfig.Name,
+ conn: connWrapper,
+ }
}
dons[donConfig.DonId] = &donConnectionManager{
donConfig: &donConfig,
@@ -148,7 +153,7 @@ func (m *connectionManager) Start(ctx context.Context) error {
go donConnMgr.readLoop(nodeAddress, nodeState)
}
donConnMgr.closeWait.Add(1)
- go donConnMgr.heartbeatLoop(m.config.HeartbeatIntervalSec)
+ go donConnMgr.keepaliveLoop(m.config.HeartbeatIntervalSec)
}
return m.wsServer.Start(ctx)
})
@@ -231,7 +236,7 @@ func (m *connectionManager) FinalizeHandshake(attemptId string, response []byte,
}
if conn != nil {
conn.SetPongHandler(func(data string) error {
- m.lggr.Debugw("received heartbeat pong from node", "nodeAddress", attempt.nodeAddress)
+ m.lggr.Debugw("received keepalive pong from node", "nodeAddress", attempt.nodeAddress)
return nil
})
}
@@ -299,34 +304,34 @@ func (m *donConnectionManager) readLoop(nodeAddress string, nodeState *nodeState
}
}
-func (m *donConnectionManager) heartbeatLoop(intervalSec uint32) {
+func (m *donConnectionManager) keepaliveLoop(intervalSec uint32) {
ctx, _ := m.shutdownCh.NewCtx()
defer m.closeWait.Done()
if intervalSec == 0 {
- m.lggr.Error("heartbeat interval is 0, heartbeat disabled")
+ m.lggr.Errorw("keepalive interval is 0, keepalive disabled", "donID", m.donConfig.DonId)
return
}
- m.lggr.Info("starting heartbeat loop")
+ m.lggr.Infow("starting keepalive loop", "donID", m.donConfig.DonId)
- ticker := time.NewTicker(time.Duration(intervalSec) * time.Second)
- defer ticker.Stop()
+ keepaliveTicker := time.NewTicker(time.Duration(intervalSec) * time.Second)
+ defer keepaliveTicker.Stop()
for {
select {
case <-m.shutdownCh:
return
- case <-ticker.C:
+ case <-keepaliveTicker.C:
errorCount := 0
for nodeAddress, nodeState := range m.nodes {
err := nodeState.conn.Write(ctx, websocket.PingMessage, []byte{})
if err != nil {
- m.lggr.Debugw("unable to send heartbeat to node", "nodeAddress", nodeAddress, "err", err)
+ m.lggr.Debugw("unable to send keepalive ping to node", "nodeAddress", nodeAddress, "name", nodeState.name, "donID", m.donConfig.DonId, "err", err)
errorCount++
}
}
- promHeartbeatsSent.WithLabelValues(m.donConfig.DonId).Set(float64(len(m.nodes) - errorCount))
- m.lggr.Infow("sent heartbeat to nodes", "donID", m.donConfig.DonId, "errCount", errorCount)
+ promKeepalivesSent.WithLabelValues(m.donConfig.DonId).Set(float64(len(m.nodes) - errorCount))
+ m.lggr.Infow("sent keepalive pings to nodes", "donID", m.donConfig.DonId, "errCount", errorCount)
}
}
}
diff --git a/core/services/gateway/connectionmanager_test.go b/core/services/gateway/connectionmanager_test.go
index d198ef67295..1750e975889 100644
--- a/core/services/gateway/connectionmanager_test.go
+++ b/core/services/gateway/connectionmanager_test.go
@@ -4,8 +4,8 @@ import (
"crypto/ecdsa"
"fmt"
"testing"
- "time"
+ "github.com/jonboulle/clockwork"
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
@@ -15,7 +15,6 @@ import (
gc "github.com/smartcontractkit/chainlink/v2/core/services/gateway/common"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/config"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/network"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
)
const defaultConfig = `
@@ -44,7 +43,7 @@ func TestConnectionManager_NewConnectionManager_ValidConfig(t *testing.T) {
tomlConfig := parseTOMLConfig(t, defaultConfig)
- _, err := gateway.NewConnectionManager(tomlConfig, utils.NewFixedClock(time.Now()), logger.TestLogger(t))
+ _, err := gateway.NewConnectionManager(tomlConfig, clockwork.NewFakeClock(), logger.TestLogger(t))
require.NoError(t, err)
}
@@ -86,7 +85,7 @@ Address = "0x68902D681c28119f9b2531473a417088bf008E59"
fullConfig := `
[nodeServerConfig]
Path = "/node"` + config
- _, err := gateway.NewConnectionManager(parseTOMLConfig(t, fullConfig), utils.NewFixedClock(time.Now()), logger.TestLogger(t))
+ _, err := gateway.NewConnectionManager(parseTOMLConfig(t, fullConfig), clockwork.NewFakeClock(), logger.TestLogger(t))
require.Error(t, err)
})
}
@@ -128,7 +127,7 @@ func TestConnectionManager_StartHandshake(t *testing.T) {
config, nodes := newTestConfig(t, 4)
unrelatedNode := gc.NewTestNodes(t, 1)[0]
- clock := utils.NewFixedClock(time.Now())
+ clock := clockwork.NewFakeClock()
mgr, err := gateway.NewConnectionManager(config, clock, logger.TestLogger(t))
require.NoError(t, err)
@@ -181,7 +180,7 @@ func TestConnectionManager_FinalizeHandshake(t *testing.T) {
t.Parallel()
config, nodes := newTestConfig(t, 4)
- clock := utils.NewFixedClock(time.Now())
+ clock := clockwork.NewFakeClock()
mgr, err := gateway.NewConnectionManager(config, clock, logger.TestLogger(t))
require.NoError(t, err)
@@ -215,7 +214,7 @@ func TestConnectionManager_SendToNode_Failures(t *testing.T) {
t.Parallel()
config, nodes := newTestConfig(t, 2)
- clock := utils.NewFixedClock(time.Now())
+ clock := clockwork.NewFakeClock()
mgr, err := gateway.NewConnectionManager(config, clock, logger.TestLogger(t))
require.NoError(t, err)
@@ -227,3 +226,19 @@ func TestConnectionManager_SendToNode_Failures(t *testing.T) {
err = donMgr.SendToNode(testutils.Context(t), "some_other_node", message)
require.Error(t, err)
}
+
+func TestConnectionManager_CleanStartClose(t *testing.T) {
+ t.Parallel()
+
+ config, _ := newTestConfig(t, 2)
+ config.ConnectionManagerConfig.HeartbeatIntervalSec = 1
+ clock := clockwork.NewFakeClock()
+ mgr, err := gateway.NewConnectionManager(config, clock, logger.TestLogger(t))
+ require.NoError(t, err)
+
+ err = mgr.Start(testutils.Context(t))
+ require.NoError(t, err)
+
+ err = mgr.Close()
+ require.NoError(t, err)
+}
diff --git a/core/services/gateway/connector/connector.go b/core/services/gateway/connector/connector.go
index 9f809a326c8..4e9de2df40e 100644
--- a/core/services/gateway/connector/connector.go
+++ b/core/services/gateway/connector/connector.go
@@ -9,6 +9,7 @@ import (
"time"
"github.com/gorilla/websocket"
+ "github.com/jonboulle/clockwork"
"github.com/smartcontractkit/chainlink-common/pkg/services"
"github.com/smartcontractkit/chainlink-common/pkg/utils/hex"
@@ -51,7 +52,7 @@ type gatewayConnector struct {
config *ConnectorConfig
codec api.Codec
- clock utils.Clock
+ clock clockwork.Clock
nodeAddress []byte
signer Signer
handler GatewayConnectorHandler
@@ -79,7 +80,7 @@ type gatewayState struct {
wsClient network.WebSocketClient
}
-func NewGatewayConnector(config *ConnectorConfig, signer Signer, handler GatewayConnectorHandler, clock utils.Clock, lggr logger.Logger) (GatewayConnector, error) {
+func NewGatewayConnector(config *ConnectorConfig, signer Signer, handler GatewayConnectorHandler, clock clockwork.Clock, lggr logger.Logger) (GatewayConnector, error) {
if config == nil || signer == nil || handler == nil || clock == nil || lggr == nil {
return nil, errors.New("nil dependency")
}
@@ -159,7 +160,7 @@ func (c *gatewayConnector) readLoop(gatewayState *gatewayState) {
break
}
if err = msg.Validate(); err != nil {
- c.lggr.Errorw("failed to validate message signature", "id", gatewayState.config.Id, "error", err)
+ c.lggr.Errorw("failed to validate message signature", "id", gatewayState.config.Id, "err", err)
break
}
c.handler.HandleGatewayMessage(ctx, gatewayState.config.Id, msg)
@@ -175,7 +176,7 @@ func (c *gatewayConnector) reconnectLoop(gatewayState *gatewayState) {
for {
conn, err := gatewayState.wsClient.Connect(ctx, gatewayState.url)
if err != nil {
- c.lggr.Errorw("connection error", "url", gatewayState.url, "error", err)
+ c.lggr.Errorw("connection error", "url", gatewayState.url, "err", err)
} else {
c.lggr.Infow("connected successfully", "url", gatewayState.url)
closeCh := gatewayState.conn.Reset(conn)
diff --git a/core/services/gateway/connector/connector_test.go b/core/services/gateway/connector/connector_test.go
index 1c2c6d26b10..3dd782c626a 100644
--- a/core/services/gateway/connector/connector_test.go
+++ b/core/services/gateway/connector/connector_test.go
@@ -6,6 +6,7 @@ import (
"testing"
"time"
+ "github.com/jonboulle/clockwork"
"github.com/pelletier/go-toml/v2"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
@@ -15,7 +16,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/connector"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/connector/mocks"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/network"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
)
const defaultConfig = `
@@ -43,7 +43,7 @@ func parseTOMLConfig(t *testing.T, tomlConfig string) *connector.ConnectorConfig
func newTestConnector(t *testing.T, config *connector.ConnectorConfig, now time.Time) (connector.GatewayConnector, *mocks.Signer, *mocks.GatewayConnectorHandler) {
signer := mocks.NewSigner(t)
handler := mocks.NewGatewayConnectorHandler(t)
- clock := utils.NewFixedClock(now)
+ clock := clockwork.NewFakeClock()
connector, err := connector.NewGatewayConnector(config, signer, handler, clock, logger.TestLogger(t))
require.NoError(t, err)
return connector, signer, handler
@@ -104,7 +104,7 @@ URL = "ws://localhost:8081/node"
signer := mocks.NewSigner(t)
handler := mocks.NewGatewayConnectorHandler(t)
- clock := utils.NewFixedClock(time.Now())
+ clock := clockwork.NewFakeClock()
for name, config := range invalidCases {
config := config
t.Run(name, func(t *testing.T) {
diff --git a/core/services/gateway/gateway.go b/core/services/gateway/gateway.go
index 79ddf0a5c69..93ecc474bec 100644
--- a/core/services/gateway/gateway.go
+++ b/core/services/gateway/gateway.go
@@ -9,6 +9,7 @@ import (
"go.uber.org/multierr"
"github.com/ethereum/go-ethereum/common"
+ "github.com/jonboulle/clockwork"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promauto"
@@ -20,7 +21,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/handlers"
gw_net "github.com/smartcontractkit/chainlink/v2/core/services/gateway/network"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
)
var promRequest = promauto.NewCounterVec(prometheus.CounterOpts{
@@ -55,7 +55,7 @@ type gateway struct {
func NewGatewayFromConfig(config *config.GatewayConfig, handlerFactory HandlerFactory, lggr logger.Logger) (Gateway, error) {
codec := &api.JsonRPCCodec{}
httpServer := gw_net.NewHttpServer(&config.UserServerConfig, lggr)
- connMgr, err := NewConnectionManager(config, utils.NewRealClock(), lggr)
+ connMgr, err := NewConnectionManager(config, clockwork.NewRealClock(), lggr)
if err != nil {
return nil, err
}
diff --git a/core/services/gateway/integration_tests/gateway_integration_test.go b/core/services/gateway/integration_tests/gateway_integration_test.go
index a2064b7a591..7f4a2ab58fa 100644
--- a/core/services/gateway/integration_tests/gateway_integration_test.go
+++ b/core/services/gateway/integration_tests/gateway_integration_test.go
@@ -11,6 +11,7 @@ import (
"sync/atomic"
"testing"
+ "github.com/jonboulle/clockwork"
"github.com/onsi/gomega"
"github.com/pelletier/go-toml/v2"
"github.com/stretchr/testify/require"
@@ -23,7 +24,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/common"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/config"
"github.com/smartcontractkit/chainlink/v2/core/services/gateway/connector"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
)
const gatewayConfigTemplate = `
@@ -152,7 +152,7 @@ func TestIntegration_Gateway_NoFullNodes_BasicConnectionAndMessage(t *testing.T)
// Launch Connector
client := &client{privateKey: nodeKeys.PrivateKey}
- connector, err := connector.NewGatewayConnector(parseConnectorConfig(t, nodeConfigTemplate, nodeKeys.Address, nodeUrl), client, client, utils.NewRealClock(), lggr)
+ connector, err := connector.NewGatewayConnector(parseConnectorConfig(t, nodeConfigTemplate, nodeKeys.Address, nodeUrl), client, client, clockwork.NewRealClock(), lggr)
require.NoError(t, err)
client.connector = connector
servicetest.Run(t, connector)
diff --git a/core/services/job/models.go b/core/services/job/models.go
index 17bac545be1..b769106d647 100644
--- a/core/services/job/models.go
+++ b/core/services/job/models.go
@@ -48,6 +48,7 @@ const (
Stream Type = (Type)(pipeline.StreamJobType)
VRF Type = (Type)(pipeline.VRFJobType)
Webhook Type = (Type)(pipeline.WebhookJobType)
+ Workflow Type = (Type)(pipeline.WorkflowJobType)
)
//revive:disable:redefines-builtin-id
@@ -126,6 +127,7 @@ var (
type Job struct {
ID int32 `toml:"-"`
ExternalJobID uuid.UUID `toml:"externalJobID"`
+ StreamID *uint32 `toml:"streamID"`
OCROracleSpecID *int32
OCROracleSpec *OCROracleSpec
OCR2OracleSpecID *int32
@@ -161,11 +163,11 @@ type Job struct {
PipelineSpecID int32
PipelineSpec *pipeline.Spec
JobSpecErrors []SpecError
- Type Type
- SchemaVersion uint32
+ Type Type `toml:"type"`
+ SchemaVersion uint32 `toml:"schemaVersion"`
GasLimit clnull.Uint32 `toml:"gasLimit"`
ForwardingAllowed bool `toml:"forwardingAllowed"`
- Name null.String
+ Name null.String `toml:"name"`
MaxTaskDuration models.Interval
Pipeline pipeline.Pipeline `toml:"observationSource"`
CreatedAt time.Time
diff --git a/core/services/job/orm.go b/core/services/job/orm.go
index 82c6be2963c..07b9cb95aae 100644
--- a/core/services/job/orm.go
+++ b/core/services/job/orm.go
@@ -442,6 +442,8 @@ func (o *orm) CreateJob(jb *Job, qopts ...pg.QOpt) error {
jb.GatewaySpecID = &specID
case Stream:
// 'stream' type has no associated spec, nothing to do here
+ case Workflow:
+ // 'workflow' type has no associated spec, nothing to do here
default:
o.lggr.Panicf("Unsupported jb.Type: %v", jb.Type)
}
@@ -530,18 +532,18 @@ func (o *orm) InsertJob(job *Job, qopts ...pg.QOpt) error {
// if job has id, emplace otherwise insert with a new id.
if job.ID == 0 {
- query = `INSERT INTO jobs (pipeline_spec_id, name, schema_version, type, max_task_duration, ocr_oracle_spec_id, ocr2_oracle_spec_id, direct_request_spec_id, flux_monitor_spec_id,
+ query = `INSERT INTO jobs (pipeline_spec_id, name, stream_id, schema_version, type, max_task_duration, ocr_oracle_spec_id, ocr2_oracle_spec_id, direct_request_spec_id, flux_monitor_spec_id,
keeper_spec_id, cron_spec_id, vrf_spec_id, webhook_spec_id, blockhash_store_spec_id, bootstrap_spec_id, block_header_feeder_spec_id, gateway_spec_id,
legacy_gas_station_server_spec_id, legacy_gas_station_sidecar_spec_id, external_job_id, gas_limit, forwarding_allowed, created_at)
- VALUES (:pipeline_spec_id, :name, :schema_version, :type, :max_task_duration, :ocr_oracle_spec_id, :ocr2_oracle_spec_id, :direct_request_spec_id, :flux_monitor_spec_id,
+ VALUES (:pipeline_spec_id, :name, :stream_id, :schema_version, :type, :max_task_duration, :ocr_oracle_spec_id, :ocr2_oracle_spec_id, :direct_request_spec_id, :flux_monitor_spec_id,
:keeper_spec_id, :cron_spec_id, :vrf_spec_id, :webhook_spec_id, :blockhash_store_spec_id, :bootstrap_spec_id, :block_header_feeder_spec_id, :gateway_spec_id,
:legacy_gas_station_server_spec_id, :legacy_gas_station_sidecar_spec_id, :external_job_id, :gas_limit, :forwarding_allowed, NOW())
RETURNING *;`
} else {
- query = `INSERT INTO jobs (id, pipeline_spec_id, name, schema_version, type, max_task_duration, ocr_oracle_spec_id, ocr2_oracle_spec_id, direct_request_spec_id, flux_monitor_spec_id,
+ query = `INSERT INTO jobs (id, pipeline_spec_id, name, stream_id, schema_version, type, max_task_duration, ocr_oracle_spec_id, ocr2_oracle_spec_id, direct_request_spec_id, flux_monitor_spec_id,
keeper_spec_id, cron_spec_id, vrf_spec_id, webhook_spec_id, blockhash_store_spec_id, bootstrap_spec_id, block_header_feeder_spec_id, gateway_spec_id,
legacy_gas_station_server_spec_id, legacy_gas_station_sidecar_spec_id, external_job_id, gas_limit, forwarding_allowed, created_at)
- VALUES (:id, :pipeline_spec_id, :name, :schema_version, :type, :max_task_duration, :ocr_oracle_spec_id, :ocr2_oracle_spec_id, :direct_request_spec_id, :flux_monitor_spec_id,
+ VALUES (:id, :pipeline_spec_id, :name, :stream_id, :schema_version, :type, :max_task_duration, :ocr_oracle_spec_id, :ocr2_oracle_spec_id, :direct_request_spec_id, :flux_monitor_spec_id,
:keeper_spec_id, :cron_spec_id, :vrf_spec_id, :webhook_spec_id, :blockhash_store_spec_id, :bootstrap_spec_id, :block_header_feeder_spec_id, :gateway_spec_id,
:legacy_gas_station_server_spec_id, :legacy_gas_station_sidecar_spec_id, :external_job_id, :gas_limit, :forwarding_allowed, NOW())
RETURNING *;`
diff --git a/core/services/job/spawner.go b/core/services/job/spawner.go
index 1d44cedaad9..a16466fbef1 100644
--- a/core/services/job/spawner.go
+++ b/core/services/job/spawner.go
@@ -65,20 +65,20 @@ type (
Delegate interface {
JobType() Type
// BeforeJobCreated is only called once on first time job create.
- BeforeJobCreated(spec Job)
+ BeforeJobCreated(Job)
// ServicesForSpec returns services to be started and stopped for this
// job. In case a given job type relies upon well-defined startup/shutdown
// ordering for services, they are started in the order they are given
// and stopped in reverse order.
- ServicesForSpec(spec Job) ([]ServiceCtx, error)
- AfterJobCreated(spec Job)
- BeforeJobDeleted(spec Job)
+ ServicesForSpec(Job) ([]ServiceCtx, error)
+ AfterJobCreated(Job)
+ BeforeJobDeleted(Job)
// OnDeleteJob will be called from within DELETE db transaction. Any db
// commands issued within OnDeleteJob() should be performed first, before any
// non-db side effects. This is required in order to guarantee mutual atomicity between
// all tasks intended to happen during job deletion. For the same reason, the job will
// not show up in the db within OnDeleteJob(), even though it is still actively running.
- OnDeleteJob(spec Job, q pg.Queryer) error
+ OnDeleteJob(jb Job, q pg.Queryer) error
}
activeJob struct {
diff --git a/core/services/keystore/keys/ocr2key/cosmos_keyring.go b/core/services/keystore/keys/ocr2key/cosmos_keyring.go
index 490fa0cbfcb..5f1b9b98198 100644
--- a/core/services/keystore/keys/ocr2key/cosmos_keyring.go
+++ b/core/services/keystore/keys/ocr2key/cosmos_keyring.go
@@ -7,6 +7,7 @@ import (
"github.com/hdevalence/ed25519consensus"
"github.com/pkg/errors"
+ "github.com/smartcontractkit/libocr/offchainreporting2/types"
"github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
"golang.org/x/crypto/blake2s"
@@ -29,11 +30,11 @@ func newCosmosKeyring(material io.Reader) (*cosmosKeyring, error) {
return &cosmosKeyring{pubKey: pubKey, privKey: privKey}, nil
}
-func (tk *cosmosKeyring) PublicKey() ocrtypes.OnchainPublicKey {
- return []byte(tk.pubKey)
+func (ckr *cosmosKeyring) PublicKey() ocrtypes.OnchainPublicKey {
+ return []byte(ckr.pubKey)
}
-func (tk *cosmosKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) {
+func (ckr *cosmosKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) {
rawReportContext := evmutil.RawReportContext(reportCtx)
h, err := blake2s.New256(nil)
if err != nil {
@@ -49,48 +50,64 @@ func (tk *cosmosKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, repor
return h.Sum(nil), nil
}
-func (tk *cosmosKeyring) Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) {
- sigData, err := tk.reportToSigData(reportCtx, report)
+func (ckr *cosmosKeyring) Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) {
+ sigData, err := ckr.reportToSigData(reportCtx, report)
if err != nil {
return nil, err
}
- signedMsg := ed25519.Sign(tk.privKey, sigData)
+ return ckr.signBlob(sigData)
+}
+
+func (ckr *cosmosKeyring) Sign3(digest types.ConfigDigest, seqNr uint64, r ocrtypes.Report) (signature []byte, err error) {
+ return nil, errors.New("not implemented")
+}
+
+func (ckr *cosmosKeyring) signBlob(b []byte) ([]byte, error) {
+ signedMsg := ed25519.Sign(ckr.privKey, b)
// match on-chain parsing (first 32 bytes are for pubkey, remaining are for signature)
- return utils.ConcatBytes(tk.PublicKey(), signedMsg), nil
+ return utils.ConcatBytes(ckr.PublicKey(), signedMsg), nil
+}
+
+func (ckr *cosmosKeyring) Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool {
+ hash, err := ckr.reportToSigData(reportCtx, report)
+ if err != nil {
+ return false
+ }
+ return ckr.verifyBlob(publicKey, hash, signature)
+}
+
+func (ckr *cosmosKeyring) Verify3(publicKey ocrtypes.OnchainPublicKey, cd ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report, signature []byte) bool {
+ return false
}
-func (tk *cosmosKeyring) Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool {
+func (ckr *cosmosKeyring) verifyBlob(pubkey ocrtypes.OnchainPublicKey, b, sig []byte) bool {
// Ed25519 signatures are always 64 bytes and the
// public key (always prefixed, see Sign above) is always,
// 32 bytes, so we always require the max signature length.
- if len(signature) != tk.MaxSignatureLength() {
+ if len(sig) != ckr.MaxSignatureLength() {
return false
}
- if len(publicKey) != ed25519.PublicKeySize {
- return false
- }
- hash, err := tk.reportToSigData(reportCtx, report)
- if err != nil {
+ if len(pubkey) != ed25519.PublicKeySize {
return false
}
- return ed25519consensus.Verify(ed25519.PublicKey(publicKey), hash, signature[32:])
+ return ed25519consensus.Verify(ed25519.PublicKey(pubkey), b, sig[32:])
}
-func (tk *cosmosKeyring) MaxSignatureLength() int {
+func (ckr *cosmosKeyring) MaxSignatureLength() int {
// Reference: https://pkg.go.dev/crypto/ed25519
return ed25519.PublicKeySize + ed25519.SignatureSize // 32 + 64
}
-func (tk *cosmosKeyring) Marshal() ([]byte, error) {
- return tk.privKey.Seed(), nil
+func (ckr *cosmosKeyring) Marshal() ([]byte, error) {
+ return ckr.privKey.Seed(), nil
}
-func (tk *cosmosKeyring) Unmarshal(in []byte) error {
+func (ckr *cosmosKeyring) Unmarshal(in []byte) error {
if len(in) != ed25519.SeedSize {
return errors.Errorf("unexpected seed size, got %d want %d", len(in), ed25519.SeedSize)
}
privKey := ed25519.NewKeyFromSeed(in)
- tk.privKey = privKey
- tk.pubKey = privKey.Public().(ed25519.PublicKey)
+ ckr.privKey = privKey
+ ckr.pubKey = privKey.Public().(ed25519.PublicKey)
return nil
}
diff --git a/core/services/keystore/keys/ocr2key/evm_keyring.go b/core/services/keystore/keys/ocr2key/evm_keyring.go
index cc4076391b4..5d937e36a6e 100644
--- a/core/services/keystore/keys/ocr2key/evm_keyring.go
+++ b/core/services/keystore/keys/ocr2key/evm_keyring.go
@@ -3,10 +3,12 @@ package ocr2key
import (
"bytes"
"crypto/ecdsa"
+ "encoding/binary"
"io"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/smartcontractkit/libocr/offchainreporting2/types"
"github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
)
@@ -26,12 +28,16 @@ func newEVMKeyring(material io.Reader) (*evmKeyring, error) {
}
// XXX: PublicKey returns the address of the public key not the public key itself
-func (ok *evmKeyring) PublicKey() ocrtypes.OnchainPublicKey {
- address := ok.signingAddress()
+func (ekr *evmKeyring) PublicKey() ocrtypes.OnchainPublicKey {
+ address := ekr.signingAddress()
return address[:]
}
-func (ok *evmKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) []byte {
+func (ekr *evmKeyring) Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) {
+ return ekr.signBlob(ekr.reportToSigData(reportCtx, report))
+}
+
+func (ekr *evmKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) []byte {
rawReportContext := evmutil.RawReportContext(reportCtx)
sigData := crypto.Keccak256(report)
sigData = append(sigData, rawReportContext[0][:]...)
@@ -40,38 +46,68 @@ func (ok *evmKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, report o
return crypto.Keccak256(sigData)
}
-func (ok *evmKeyring) Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) {
- return crypto.Sign(ok.reportToSigData(reportCtx, report), &ok.privateKey)
+func (ekr *evmKeyring) Sign3(digest types.ConfigDigest, seqNr uint64, r ocrtypes.Report) (signature []byte, err error) {
+ return ekr.signBlob(ekr.reportToSigData3(digest, seqNr, r))
+}
+
+func (ekr *evmKeyring) reportToSigData3(digest types.ConfigDigest, seqNr uint64, r ocrtypes.Report) []byte {
+ rawReportContext := RawReportContext3(digest, seqNr)
+ sigData := crypto.Keccak256(r)
+ sigData = append(sigData, rawReportContext[0][:]...)
+ sigData = append(sigData, rawReportContext[1][:]...)
+ return crypto.Keccak256(sigData)
+}
+
+func RawReportContext3(digest types.ConfigDigest, seqNr uint64) [2][32]byte {
+ seqNrBytes := [32]byte{}
+ binary.BigEndian.PutUint64(seqNrBytes[:], seqNr)
+ return [2][32]byte{
+ digest,
+ seqNrBytes,
+ }
+}
+
+func (ekr *evmKeyring) signBlob(b []byte) (sig []byte, err error) {
+ return crypto.Sign(b, &ekr.privateKey)
+}
+
+func (ekr *evmKeyring) Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool {
+ hash := ekr.reportToSigData(reportCtx, report)
+ return ekr.verifyBlob(publicKey, hash, signature)
+}
+func (ekr *evmKeyring) Verify3(publicKey ocrtypes.OnchainPublicKey, cd ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report, signature []byte) bool {
+ hash := ekr.reportToSigData3(cd, seqNr, r)
+ return ekr.verifyBlob(publicKey, hash, signature)
}
-func (ok *evmKeyring) Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool {
- hash := ok.reportToSigData(reportCtx, report)
- authorPubkey, err := crypto.SigToPub(hash, signature)
+func (ekr *evmKeyring) verifyBlob(pubkey types.OnchainPublicKey, b, sig []byte) bool {
+ authorPubkey, err := crypto.SigToPub(b, sig)
if err != nil {
return false
}
authorAddress := crypto.PubkeyToAddress(*authorPubkey)
- return bytes.Equal(publicKey[:], authorAddress[:])
+ // no need for constant time compare since neither arg is sensitive
+ return bytes.Equal(pubkey[:], authorAddress[:])
}
-func (ok *evmKeyring) MaxSignatureLength() int {
+func (ekr *evmKeyring) MaxSignatureLength() int {
return 65
}
-func (ok *evmKeyring) signingAddress() common.Address {
- return crypto.PubkeyToAddress(*(&ok.privateKey).Public().(*ecdsa.PublicKey))
+func (ekr *evmKeyring) signingAddress() common.Address {
+ return crypto.PubkeyToAddress(*(&ekr.privateKey).Public().(*ecdsa.PublicKey))
}
-func (ok *evmKeyring) Marshal() ([]byte, error) {
- return crypto.FromECDSA(&ok.privateKey), nil
+func (ekr *evmKeyring) Marshal() ([]byte, error) {
+ return crypto.FromECDSA(&ekr.privateKey), nil
}
-func (ok *evmKeyring) Unmarshal(in []byte) error {
+func (ekr *evmKeyring) Unmarshal(in []byte) error {
privateKey, err := crypto.ToECDSA(in)
if err != nil {
return err
}
- ok.privateKey = *privateKey
+ ekr.privateKey = *privateKey
return nil
}
diff --git a/core/services/keystore/keys/ocr2key/evm_keyring_test.go b/core/services/keystore/keys/ocr2key/evm_keyring_test.go
index 5400b0df6a0..20ac197159a 100644
--- a/core/services/keystore/keys/ocr2key/evm_keyring_test.go
+++ b/core/services/keystore/keys/ocr2key/evm_keyring_test.go
@@ -3,12 +3,16 @@ package ocr2key
import (
"bytes"
cryptorand "crypto/rand"
+ "math/rand"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/libocr/offchainreporting2/types"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
)
func TestEVMKeyring_SignVerify(t *testing.T) {
@@ -43,6 +47,38 @@ func TestEVMKeyring_SignVerify(t *testing.T) {
})
}
+func TestEVMKeyring_Sign3Verify3(t *testing.T) {
+ kr1, err := newEVMKeyring(cryptorand.Reader)
+ require.NoError(t, err)
+ kr2, err := newEVMKeyring(cryptorand.Reader)
+ require.NoError(t, err)
+
+ digest, err := types.BytesToConfigDigest(testutils.MustRandBytes(32))
+ require.NoError(t, err)
+ seqNr := rand.Uint64()
+ r := ocrtypes.Report(testutils.MustRandBytes(rand.Intn(1024)))
+
+ t.Run("can verify", func(t *testing.T) {
+ sig, err := kr1.Sign3(digest, seqNr, r)
+ require.NoError(t, err)
+ t.Log(len(sig))
+ result := kr2.Verify3(kr1.PublicKey(), digest, seqNr, r, sig)
+ assert.True(t, result)
+ })
+
+ t.Run("invalid sig", func(t *testing.T) {
+ result := kr2.Verify3(kr1.PublicKey(), digest, seqNr, r, []byte{0x01})
+ assert.False(t, result)
+ })
+
+ t.Run("invalid pubkey", func(t *testing.T) {
+ sig, err := kr1.Sign3(digest, seqNr, r)
+ require.NoError(t, err)
+ result := kr2.Verify3([]byte{0x01}, digest, seqNr, r, sig)
+ assert.False(t, result)
+ })
+}
+
func TestEVMKeyring_Marshalling(t *testing.T) {
kr1, err := newEVMKeyring(cryptorand.Reader)
require.NoError(t, err)
diff --git a/core/services/keystore/keys/ocr2key/generic_key_bundle.go b/core/services/keystore/keys/ocr2key/generic_key_bundle.go
index be401becfb3..2c5e4bd8559 100644
--- a/core/services/keystore/keys/ocr2key/generic_key_bundle.go
+++ b/core/services/keystore/keys/ocr2key/generic_key_bundle.go
@@ -18,6 +18,7 @@ import (
type (
keyring interface {
ocrtypes.OnchainKeyring
+ OCR3SignerVerifier
Marshal() ([]byte, error)
Unmarshal(in []byte) error
}
@@ -92,10 +93,18 @@ func (kb *keyBundle[K]) Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.R
return kb.keyring.Sign(reportCtx, report)
}
+func (kb *keyBundle[K]) Sign3(digest ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report) (signature []byte, err error) {
+ return kb.keyring.Sign3(digest, seqNr, r)
+}
+
func (kb *keyBundle[K]) Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool {
return kb.keyring.Verify(publicKey, reportCtx, report, signature)
}
+func (kb *keyBundle[K]) Verify3(publicKey ocrtypes.OnchainPublicKey, cd ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report, signature []byte) bool {
+ return kb.keyring.Verify3(publicKey, cd, seqNr, r, signature)
+}
+
// OnChainPublicKey returns public component of the keypair used on chain
func (kb *keyBundle[K]) OnChainPublicKey() string {
return hex.EncodeToString(kb.keyring.PublicKey())
diff --git a/core/services/keystore/keys/ocr2key/key_bundle.go b/core/services/keystore/keys/ocr2key/key_bundle.go
index 79d8ad70d52..2c3a4bebeb0 100644
--- a/core/services/keystore/keys/ocr2key/key_bundle.go
+++ b/core/services/keystore/keys/ocr2key/key_bundle.go
@@ -14,12 +14,20 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/store/models"
)
+type OCR3SignerVerifier interface {
+ Sign3(digest ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report) (signature []byte, err error)
+ Verify3(publicKey ocrtypes.OnchainPublicKey, cd ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report, signature []byte) bool
+}
+
// nolint
type KeyBundle interface {
// OnchainKeyring is used for signing reports (groups of observations, verified onchain)
ocrtypes.OnchainKeyring
// OffchainKeyring is used for signing observations
ocrtypes.OffchainKeyring
+
+ OCR3SignerVerifier
+
ID() string
ChainType() chaintype.ChainType
Marshal() ([]byte, error)
diff --git a/core/services/keystore/keys/ocr2key/solana_keyring.go b/core/services/keystore/keys/ocr2key/solana_keyring.go
index aebe33e1d19..a5fa2f77dc0 100644
--- a/core/services/keystore/keys/ocr2key/solana_keyring.go
+++ b/core/services/keystore/keys/ocr2key/solana_keyring.go
@@ -7,6 +7,8 @@ import (
"io"
"github.com/ethereum/go-ethereum/crypto"
+ "github.com/pkg/errors"
+ "github.com/smartcontractkit/libocr/offchainreporting2/types"
"github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
)
@@ -26,12 +28,12 @@ func newSolanaKeyring(material io.Reader) (*solanaKeyring, error) {
}
// XXX: PublicKey returns the evm-style address of the public key not the public key itself
-func (ok *solanaKeyring) PublicKey() ocrtypes.OnchainPublicKey {
- address := crypto.PubkeyToAddress(*(&ok.privateKey).Public().(*ecdsa.PublicKey))
+func (skr *solanaKeyring) PublicKey() ocrtypes.OnchainPublicKey {
+ address := crypto.PubkeyToAddress(*(&skr.privateKey).Public().(*ecdsa.PublicKey))
return address[:]
}
-func (ok *solanaKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) []byte {
+func (skr *solanaKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) []byte {
rawReportContext := evmutil.RawReportContext(reportCtx)
h := sha256.New()
h.Write([]byte{uint8(len(report))})
@@ -42,30 +44,47 @@ func (ok *solanaKeyring) reportToSigData(reportCtx ocrtypes.ReportContext, repor
return h.Sum(nil)
}
-func (ok *solanaKeyring) Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) {
- return crypto.Sign(ok.reportToSigData(reportCtx, report), &ok.privateKey)
+func (skr *solanaKeyring) Sign(reportCtx ocrtypes.ReportContext, report ocrtypes.Report) ([]byte, error) {
+ return skr.signBlob(skr.reportToSigData(reportCtx, report))
}
-func (ok *solanaKeyring) Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool {
- hash := ok.reportToSigData(reportCtx, report)
- authorPubkey, err := crypto.SigToPub(hash, signature)
+func (skr *solanaKeyring) Sign3(digest types.ConfigDigest, seqNr uint64, r ocrtypes.Report) (signature []byte, err error) {
+ return nil, errors.New("not implemented")
+}
+
+func (skr *solanaKeyring) signBlob(b []byte) (sig []byte, err error) {
+ return crypto.Sign(b, &skr.privateKey)
+}
+
+func (skr *solanaKeyring) Verify(publicKey ocrtypes.OnchainPublicKey, reportCtx ocrtypes.ReportContext, report ocrtypes.Report, signature []byte) bool {
+ hash := skr.reportToSigData(reportCtx, report)
+ return skr.verifyBlob(publicKey, hash, signature)
+}
+
+func (skr *solanaKeyring) Verify3(publicKey ocrtypes.OnchainPublicKey, cd ocrtypes.ConfigDigest, seqNr uint64, r ocrtypes.Report, signature []byte) bool {
+ return false
+}
+
+func (skr *solanaKeyring) verifyBlob(pubkey types.OnchainPublicKey, b, sig []byte) bool {
+ authorPubkey, err := crypto.SigToPub(b, sig)
if err != nil {
return false
}
authorAddress := crypto.PubkeyToAddress(*authorPubkey)
- return bytes.Equal(publicKey[:], authorAddress[:])
+ // no need for constant time compare since neither arg is sensitive
+ return bytes.Equal(pubkey[:], authorAddress[:])
}
-func (ok *solanaKeyring) MaxSignatureLength() int {
+func (skr *solanaKeyring) MaxSignatureLength() int {
return 65
}
-func (ok *solanaKeyring) Marshal() ([]byte, error) {
- return crypto.FromECDSA(&ok.privateKey), nil
+func (skr *solanaKeyring) Marshal() ([]byte, error) {
+ return crypto.FromECDSA(&skr.privateKey), nil
}
-func (ok *solanaKeyring) Unmarshal(in []byte) error {
+func (skr *solanaKeyring) Unmarshal(in []byte) error {
privateKey, err := crypto.ToECDSA(in)
- ok.privateKey = *privateKey
+ skr.privateKey = *privateKey
return err
}
diff --git a/core/services/keystore/keys/starkkey/ocr2key.go b/core/services/keystore/keys/starkkey/ocr2key.go
index 41ab3a4708d..417687b62a6 100644
--- a/core/services/keystore/keys/starkkey/ocr2key.go
+++ b/core/services/keystore/keys/starkkey/ocr2key.go
@@ -58,7 +58,6 @@ func (sk *OCR2Key) Sign(reportCtx types.ReportContext, report types.Report) ([]b
if err != nil {
return []byte{}, err
}
-
r, s, err := caigo.Curve.Sign(hash, sk.priv)
if err != nil {
return []byte{}, err
@@ -85,6 +84,10 @@ func (sk *OCR2Key) Sign(reportCtx types.ReportContext, report types.Report) ([]b
return out, nil
}
+func (sk *OCR2Key) Sign3(digest types.ConfigDigest, seqNr uint64, r types.Report) (signature []byte, err error) {
+ return nil, errors.New("not implemented")
+}
+
func (sk *OCR2Key) Verify(publicKey types.OnchainPublicKey, reportCtx types.ReportContext, report types.Report, signature []byte) bool {
// check valid signature length
if len(signature) != sk.MaxSignatureLength() {
@@ -120,6 +123,10 @@ func (sk *OCR2Key) Verify(publicKey types.OnchainPublicKey, reportCtx types.Repo
return caigo.Curve.Verify(hash, r, s, keys[0].X, keys[0].Y) || caigo.Curve.Verify(hash, r, s, keys[1].X, keys[1].Y)
}
+func (sk *OCR2Key) Verify3(publicKey types.OnchainPublicKey, cd types.ConfigDigest, seqNr uint64, r types.Report, signature []byte) bool {
+ return false
+}
+
func (sk *OCR2Key) MaxSignatureLength() int {
return 32 + 32 + 32 // publickey + r + s
}
diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go
index c838316b1cc..c185ec6ddbe 100644
--- a/core/services/ocr2/delegate.go
+++ b/core/services/ocr2/delegate.go
@@ -25,6 +25,7 @@ import (
ocr2keepers20runner "github.com/smartcontractkit/chainlink-automation/pkg/v2/runner"
ocr2keepers21config "github.com/smartcontractkit/chainlink-automation/pkg/v3/config"
ocr2keepers21 "github.com/smartcontractkit/chainlink-automation/pkg/v3/plugin"
+ "github.com/smartcontractkit/chainlink-common/pkg/loop/reportingplugins/ocr3"
"github.com/smartcontractkit/chainlink/v2/core/config/env"
"github.com/smartcontractkit/chainlink-vrf/altbn_128"
@@ -490,12 +491,11 @@ func GetEVMEffectiveTransmitterID(jb *job.Job, chain legacyevm.Chain, lggr logge
effectiveTransmitterID, err := chain.TxManager().GetForwarderForEOA(common.HexToAddress(spec.TransmitterID.String))
if err == nil {
return effectiveTransmitterID.String(), nil
- } else if spec.TransmitterID.Valid {
- lggr.Warnw("Skipping forwarding for job, will fallback to default behavior", "job", jb.Name, "err", err)
- // this shouldn't happen unless behaviour above was changed
- } else {
+ } else if !spec.TransmitterID.Valid {
return "", errors.New("failed to get forwarder address and transmitterID is not set")
}
+ lggr.Warnw("Skipping forwarding for job, will fallback to default behavior", "job", jb.Name, "err", err)
+ // this shouldn't happen unless behaviour above was changed
}
return spec.TransmitterID.String, nil
@@ -519,33 +519,33 @@ func (d *Delegate) newServicesGenericPlugin(
// NOTE: we don't need to validate this config, since that happens as part of creating the job.
// See: validate/validate.go's `validateSpec`.
- p := validate.OCR2GenericPluginConfig{}
- err = json.Unmarshal(spec.PluginConfig.Bytes(), &p)
+ pCfg := validate.OCR2GenericPluginConfig{}
+ err = json.Unmarshal(spec.PluginConfig.Bytes(), &pCfg)
if err != nil {
return nil, err
}
- plugEnv := env.NewPlugin(p.PluginName)
+ plugEnv := env.NewPlugin(pCfg.PluginName)
- command := p.Command
+ command := pCfg.Command
if command == "" {
command = plugEnv.Cmd.Get()
}
// Add the default pipeline to the pluginConfig
- p.Pipelines = append(
- p.Pipelines,
+ pCfg.Pipelines = append(
+ pCfg.Pipelines,
validate.PipelineSpec{Name: "__DEFAULT_PIPELINE__", Spec: jb.Pipeline.Source},
)
rid, err := spec.RelayID()
if err != nil {
- return nil, ErrJobSpecNoRelayer{PluginName: p.PluginName, Err: err}
+ return nil, ErrJobSpecNoRelayer{PluginName: pCfg.PluginName, Err: err}
}
relayer, err := d.RelayGetter.Get(rid)
if err != nil {
- return nil, ErrRelayNotEnabled{Err: err, Relay: spec.Relay, PluginName: p.PluginName}
+ return nil, ErrRelayNotEnabled{Err: err, Relay: spec.Relay, PluginName: pCfg.PluginName}
}
provider, err := relayer.NewPluginProvider(ctx, types.RelayArgs{
@@ -554,7 +554,7 @@ func (d *Delegate) newServicesGenericPlugin(
ContractID: spec.ContractID,
New: d.isNewlyCreatedJob,
RelayConfig: spec.RelayConfig.Bytes(),
- ProviderType: p.ProviderType,
+ ProviderType: pCfg.ProviderType,
}, types.PluginArgs{
TransmitterID: spec.TransmitterID.String,
PluginConfig: spec.PluginConfig.Bytes(),
@@ -564,39 +564,19 @@ func (d *Delegate) newServicesGenericPlugin(
}
srvs = append(srvs, provider)
- oracleEndpoint := d.monitoringEndpointGen.GenMonitoringEndpoint(
- rid.Network,
- rid.ChainID,
- spec.ContractID,
- synchronization.TelemetryType(p.TelemetryType),
- )
- oracleArgs := libocr2.OCR2OracleArgs{
- BinaryNetworkEndpointFactory: d.peerWrapper.Peer2,
- V2Bootstrappers: bootstrapPeers,
- Database: ocrDB,
- LocalConfig: lc,
- Logger: ocrLogger,
- MonitoringEndpoint: oracleEndpoint,
- OffchainKeyring: kb,
- OnchainKeyring: kb,
- ContractTransmitter: provider.ContractTransmitter(),
- ContractConfigTracker: provider.ContractConfigTracker(),
- OffchainConfigDigester: provider.OffchainConfigDigester(),
- }
-
envVars, err := plugins.ParseEnvFile(plugEnv.Env.Get())
if err != nil {
return nil, fmt.Errorf("failed to parse median env file: %w", err)
}
- if len(p.EnvVars) > 0 {
- for k, v := range p.EnvVars {
+ if len(pCfg.EnvVars) > 0 {
+ for k, v := range pCfg.EnvVars {
envVars = append(envVars, k+"="+v)
}
}
- pluginLggr := lggr.Named(p.PluginName).Named(spec.ContractID).Named(spec.GetID())
+ pluginLggr := lggr.Named(pCfg.PluginName).Named(spec.ContractID).Named(spec.GetID())
cmdFn, grpcOpts, err := d.cfg.RegisterLOOP(plugins.CmdConfig{
- ID: fmt.Sprintf("%s-%s-%s", p.PluginName, spec.ContractID, spec.GetID()),
+ ID: fmt.Sprintf("%s-%s-%s", pCfg.PluginName, spec.ContractID, spec.GetID()),
Cmd: command,
Env: envVars,
})
@@ -616,7 +596,7 @@ func (d *Delegate) newServicesGenericPlugin(
//TODO: remove this workaround when the EVM relayer is running inside of an LOOPP
d.lggr.Info("provider is not a LOOPP provider, switching to provider server")
- ps, err2 := relay.NewProviderServer(provider, types.OCR2PluginType(p.ProviderType), d.lggr)
+ ps, err2 := relay.NewProviderServer(provider, types.OCR2PluginType(pCfg.ProviderType), d.lggr)
if err2 != nil {
return nil, fmt.Errorf("cannot start EVM provider server: %s", err)
}
@@ -627,32 +607,82 @@ func (d *Delegate) newServicesGenericPlugin(
srvs = append(srvs, ps)
}
- pc, err := json.Marshal(p.Config)
+ pc, err := json.Marshal(pCfg.Config)
if err != nil {
return nil, fmt.Errorf("cannot dump plugin config to string before sending to plugin: %s", err)
}
pluginConfig := types.ReportingPluginServiceConfig{
- PluginName: p.PluginName,
+ PluginName: pCfg.PluginName,
Command: command,
- ProviderType: p.ProviderType,
- TelemetryType: p.TelemetryType,
+ ProviderType: pCfg.ProviderType,
+ TelemetryType: pCfg.TelemetryType,
PluginConfig: string(pc),
}
pr := generic.NewPipelineRunnerAdapter(pluginLggr, jb, d.pipelineRunner)
ta := generic.NewTelemetryAdapter(d.monitoringEndpointGen)
- plugin := reportingplugins.NewLOOPPService(pluginLggr, grpcOpts, cmdFn, pluginConfig, providerClientConn, pr, ta, errorLog)
- oracleArgs.ReportingPluginFactory = plugin
- srvs = append(srvs, plugin)
+ oracleEndpoint := d.monitoringEndpointGen.GenMonitoringEndpoint(
+ rid.Network,
+ rid.ChainID,
+ spec.ContractID,
+ synchronization.TelemetryType(pCfg.TelemetryType),
+ )
+
+ switch pCfg.OCRVersion {
+ case 2:
+ plugin := reportingplugins.NewLOOPPService(pluginLggr, grpcOpts, cmdFn, pluginConfig, providerClientConn, pr, ta, errorLog)
+ oracleArgs := libocr2.OCR2OracleArgs{
+ BinaryNetworkEndpointFactory: d.peerWrapper.Peer2,
+ V2Bootstrappers: bootstrapPeers,
+ Database: ocrDB,
+ LocalConfig: lc,
+ Logger: ocrLogger,
+ MonitoringEndpoint: oracleEndpoint,
+ OffchainKeyring: kb,
+ OnchainKeyring: kb,
+ ContractTransmitter: provider.ContractTransmitter(),
+ ContractConfigTracker: provider.ContractConfigTracker(),
+ OffchainConfigDigester: provider.OffchainConfigDigester(),
+ }
+ oracleArgs.ReportingPluginFactory = plugin
+ srvs = append(srvs, plugin)
+ oracle, err := libocr2.NewOracle(oracleArgs)
+ if err != nil {
+ return nil, err
+ }
+ srvs = append(srvs, job.NewServiceAdapter(oracle))
+
+ case 3:
+ //OCR3 with OCR2 OnchainKeyring and ContractTransmitter
+ plugin := ocr3.NewLOOPPService(pluginLggr, grpcOpts, cmdFn, pluginConfig, providerClientConn, pr, ta, errorLog)
+ contractTransmitter := ocrcommon.NewOCR3ContractTransmitterAdapter(provider.ContractTransmitter())
+ oracleArgs := libocr2.OCR3OracleArgs[any]{
+ BinaryNetworkEndpointFactory: d.peerWrapper.Peer2,
+ V2Bootstrappers: bootstrapPeers,
+ ContractConfigTracker: provider.ContractConfigTracker(),
+ ContractTransmitter: contractTransmitter,
+ Database: ocrDB,
+ LocalConfig: lc,
+ Logger: ocrLogger,
+ MonitoringEndpoint: oracleEndpoint,
+ OffchainConfigDigester: provider.OffchainConfigDigester(),
+ OffchainKeyring: kb,
+ OnchainKeyring: ocrcommon.NewOCR3OnchainKeyringAdapter(kb),
+ }
+ oracleArgs.ReportingPluginFactory = plugin
+ srvs = append(srvs, plugin)
+ oracle, err := libocr2.NewOracle(oracleArgs)
+ if err != nil {
+ return nil, err
+ }
+ srvs = append(srvs, job.NewServiceAdapter(oracle))
- oracle, err := libocr2.NewOracle(oracleArgs)
- if err != nil {
- return nil, err
+ default:
+ return nil, fmt.Errorf("unknown OCR version: %d", pCfg.OCRVersion)
}
- srvs = append(srvs, job.NewServiceAdapter(oracle))
return srvs, nil
}
@@ -727,7 +757,9 @@ func (d *Delegate) newServicesMercury(
chEnhancedTelem := make(chan ocrcommon.EnhancedTelemetryMercuryData, 100)
- mercuryServices, err2 := mercury.NewServices(jb, mercuryProvider, d.pipelineRunner, lggr, oracleArgsNoPlugin, d.cfg.JobPipeline(), chEnhancedTelem, d.mercuryORM, (mercuryutils.FeedID)(*spec.FeedID))
+ mCfg := mercury.NewMercuryConfig(d.cfg.JobPipeline().MaxSuccessfulRuns(), d.cfg.JobPipeline().ResultWriteQueueDepth(), d.cfg)
+
+ mercuryServices, err2 := mercury.NewServices(jb, mercuryProvider, d.pipelineRunner, lggr, oracleArgsNoPlugin, mCfg, chEnhancedTelem, d.mercuryORM, (mercuryutils.FeedID)(*spec.FeedID))
if ocrcommon.ShouldCollectEnhancedTelemetryMercury(jb) {
enhancedTelemService := ocrcommon.NewEnhancedTelemetryService(&jb, chEnhancedTelem, make(chan struct{}), d.monitoringEndpointGen.GenMonitoringEndpoint(rid.Network, rid.ChainID, spec.FeedID.String(), synchronization.EnhancedEAMercury), lggr.Named("EnhancedTelemetryMercury"))
diff --git a/core/services/ocr2/plugins/functions/plugin.go b/core/services/ocr2/plugins/functions/plugin.go
index 15e36f07b09..a49ce4be90a 100644
--- a/core/services/ocr2/plugins/functions/plugin.go
+++ b/core/services/ocr2/plugins/functions/plugin.go
@@ -8,6 +8,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/jmoiron/sqlx"
+ "github.com/jonboulle/clockwork"
"github.com/pkg/errors"
"github.com/smartcontractkit/libocr/commontypes"
@@ -32,7 +33,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/pg"
evmrelayTypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
"github.com/smartcontractkit/chainlink/v2/core/services/s4"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
)
type FunctionsServicesConfig struct {
@@ -100,7 +100,7 @@ func NewFunctionsServices(functionsOracleArgs, thresholdOracleArgs, s4OracleArgs
var s4Storage s4.Storage
if pluginConfig.S4Constraints != nil {
- s4Storage = s4.NewStorage(conf.Logger, *pluginConfig.S4Constraints, s4ORM, utils.NewRealClock())
+ s4Storage = s4.NewStorage(conf.Logger, *pluginConfig.S4Constraints, s4ORM, clockwork.NewRealClock())
}
offchainTransmitter := functions.NewOffchainTransmitter(DefaultOffchainTransmitterChannelSize)
@@ -202,7 +202,7 @@ func NewConnector(pluginConfig *config.PluginConfig, ethKeystore keystore.Eth, c
if err != nil {
return nil, err
}
- connector, err := connector.NewGatewayConnector(pluginConfig.GatewayConnectorConfig, handler, handler, utils.NewRealClock(), lggr)
+ connector, err := connector.NewGatewayConnector(pluginConfig.GatewayConnectorConfig, handler, handler, clockwork.NewRealClock(), lggr)
if err != nil {
return nil, err
}
diff --git a/core/services/ocr2/plugins/mercury/integration_plugin_test.go b/core/services/ocr2/plugins/mercury/integration_plugin_test.go
new file mode 100644
index 00000000000..74285f32dcb
--- /dev/null
+++ b/core/services/ocr2/plugins/mercury/integration_plugin_test.go
@@ -0,0 +1,27 @@
+//go:build integration
+
+package mercury_test
+
+import (
+ "testing"
+
+ "github.com/smartcontractkit/chainlink/v2/core/config/env"
+)
+
+func TestIntegration_MercuryV1_Plugin(t *testing.T) {
+ t.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")
+
+ integration_MercuryV1(t)
+}
+
+func TestIntegration_MercuryV2_Plugin(t *testing.T) {
+ t.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")
+
+ integration_MercuryV2(t)
+}
+
+func TestIntegration_MercuryV3_Plugin(t *testing.T) {
+ t.Setenv(string(env.MercuryPlugin.Cmd), "chainlink-mercury")
+
+ integration_MercuryV3(t)
+}
diff --git a/core/services/ocr2/plugins/mercury/integration_test.go b/core/services/ocr2/plugins/mercury/integration_test.go
index 6d847098f94..0ebc6a5e354 100644
--- a/core/services/ocr2/plugins/mercury/integration_test.go
+++ b/core/services/ocr2/plugins/mercury/integration_test.go
@@ -128,6 +128,10 @@ func setupBlockchain(t *testing.T) (*bind.TransactOpts, *backends.SimulatedBacke
func TestIntegration_MercuryV1(t *testing.T) {
t.Parallel()
+ integration_MercuryV1(t)
+}
+
+func integration_MercuryV1(t *testing.T) {
var logObservers []*observer.ObservedLogs
t.Cleanup(func() {
detectPanicLogs(t, logObservers)
@@ -466,6 +470,10 @@ func TestIntegration_MercuryV1(t *testing.T) {
func TestIntegration_MercuryV2(t *testing.T) {
t.Parallel()
+ integration_MercuryV2(t)
+}
+
+func integration_MercuryV2(t *testing.T) {
var logObservers []*observer.ObservedLogs
t.Cleanup(func() {
detectPanicLogs(t, logObservers)
@@ -736,6 +744,10 @@ func TestIntegration_MercuryV2(t *testing.T) {
func TestIntegration_MercuryV3(t *testing.T) {
t.Parallel()
+ integration_MercuryV3(t)
+}
+
+func integration_MercuryV3(t *testing.T) {
var logObservers []*observer.ObservedLogs
t.Cleanup(func() {
detectPanicLogs(t, logObservers)
diff --git a/core/services/ocr2/plugins/mercury/plugin.go b/core/services/ocr2/plugins/mercury/plugin.go
index b2767d6bcf5..c5eba78b0d8 100644
--- a/core/services/ocr2/plugins/mercury/plugin.go
+++ b/core/services/ocr2/plugins/mercury/plugin.go
@@ -2,17 +2,24 @@ package mercury
import (
"encoding/json"
+ "fmt"
+ "os/exec"
"github.com/pkg/errors"
libocr2 "github.com/smartcontractkit/libocr/offchainreporting2plus"
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
- commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
relaymercuryv1 "github.com/smartcontractkit/chainlink-data-streams/mercury/v1"
relaymercuryv2 "github.com/smartcontractkit/chainlink-data-streams/mercury/v2"
relaymercuryv3 "github.com/smartcontractkit/chainlink-data-streams/mercury/v3"
+ "github.com/smartcontractkit/chainlink-common/pkg/loop"
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+
+ "github.com/smartcontractkit/chainlink/v2/core/config/env"
"github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/mercury/config"
"github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon"
@@ -22,11 +29,36 @@ import (
mercuryv1 "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/v1"
mercuryv2 "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/v2"
mercuryv3 "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/v3"
+ "github.com/smartcontractkit/chainlink/v2/plugins"
)
type Config interface {
MaxSuccessfulRuns() uint64
ResultWriteQueueDepth() uint64
+ plugins.RegistrarConfig
+}
+
+// concrete implementation of MercuryConfig
+type mercuryConfig struct {
+ jobPipelineMaxSuccessfulRuns uint64
+ jobPipelineResultWriteQueueDepth uint64
+ plugins.RegistrarConfig
+}
+
+func NewMercuryConfig(jobPipelineMaxSuccessfulRuns uint64, jobPipelineResultWriteQueueDepth uint64, pluginProcessCfg plugins.RegistrarConfig) Config {
+ return &mercuryConfig{
+ jobPipelineMaxSuccessfulRuns: jobPipelineMaxSuccessfulRuns,
+ jobPipelineResultWriteQueueDepth: jobPipelineResultWriteQueueDepth,
+ RegistrarConfig: pluginProcessCfg,
+ }
+}
+
+func (m *mercuryConfig) MaxSuccessfulRuns() uint64 {
+ return m.jobPipelineMaxSuccessfulRuns
+}
+
+func (m *mercuryConfig) ResultWriteQueueDepth() uint64 {
+ return m.jobPipelineResultWriteQueueDepth
}
func NewServices(
@@ -55,76 +87,206 @@ func NewServices(
}
lggr = lggr.Named("MercuryPlugin").With("jobID", jb.ID, "jobName", jb.Name.ValueOrZero())
+ // encapsulate all the subservices and ensure we close them all if any fail to start
+ srvs := []job.ServiceCtx{ocr2Provider}
+ abort := func() {
+ if cerr := services.MultiCloser(srvs).Close(); err != nil {
+ lggr.Errorw("Error closing unused services", "err", cerr)
+ }
+ }
saver := ocrcommon.NewResultRunSaver(pipelineRunner, lggr, cfg.MaxSuccessfulRuns(), cfg.ResultWriteQueueDepth())
+ srvs = append(srvs, saver)
+ // this is the factory that will be used to create the mercury plugin
+ var (
+ factory ocr3types.MercuryPluginFactory
+ factoryServices []job.ServiceCtx
+ )
+ fCfg := factoryCfg{
+ orm: orm,
+ pipelineRunner: pipelineRunner,
+ jb: jb,
+ lggr: lggr,
+ saver: saver,
+ chEnhancedTelem: chEnhancedTelem,
+ ocr2Provider: ocr2Provider,
+ reportingPluginConfig: pluginConfig,
+ cfg: cfg,
+ feedID: feedID,
+ }
switch feedID.Version() {
case 1:
- ds := mercuryv1.NewDataSource(
- orm,
- pipelineRunner,
- jb,
- *jb.PipelineSpec,
- lggr,
- saver,
- chEnhancedTelem,
- ocr2Provider.MercuryChainReader(),
- ocr2Provider.MercuryServerFetcher(),
- pluginConfig.InitialBlockNumber.Ptr(),
- feedID,
- )
- argsNoPlugin.MercuryPluginFactory = relaymercuryv1.NewFactory(
- ds,
- lggr,
- ocr2Provider.OnchainConfigCodec(),
- ocr2Provider.ReportCodecV1(),
- )
+ factory, factoryServices, err = newv1factory(fCfg)
+ if err != nil {
+ abort()
+ return nil, fmt.Errorf("failed to create mercury v1 factory: %w", err)
+ }
+ srvs = append(srvs, factoryServices...)
case 2:
- ds := mercuryv2.NewDataSource(
- orm,
- pipelineRunner,
- jb,
- *jb.PipelineSpec,
- feedID,
- lggr,
- saver,
- chEnhancedTelem,
- ocr2Provider.MercuryServerFetcher(),
- *pluginConfig.LinkFeedID,
- *pluginConfig.NativeFeedID,
- )
- argsNoPlugin.MercuryPluginFactory = relaymercuryv2.NewFactory(
- ds,
- lggr,
- ocr2Provider.OnchainConfigCodec(),
- ocr2Provider.ReportCodecV2(),
- )
+ factory, factoryServices, err = newv2factory(fCfg)
+ if err != nil {
+ abort()
+ return nil, fmt.Errorf("failed to create mercury v2 factory: %w", err)
+ }
+ srvs = append(srvs, factoryServices...)
case 3:
- ds := mercuryv3.NewDataSource(
- orm,
- pipelineRunner,
- jb,
- *jb.PipelineSpec,
- feedID,
- lggr,
- saver,
- chEnhancedTelem,
- ocr2Provider.MercuryServerFetcher(),
- *pluginConfig.LinkFeedID,
- *pluginConfig.NativeFeedID,
- )
- argsNoPlugin.MercuryPluginFactory = relaymercuryv3.NewFactory(
- ds,
- lggr,
- ocr2Provider.OnchainConfigCodec(),
- ocr2Provider.ReportCodecV3(),
- )
+ factory, factoryServices, err = newv3factory(fCfg)
+ if err != nil {
+ abort()
+ return nil, fmt.Errorf("failed to create mercury v3 factory: %w", err)
+ }
+ srvs = append(srvs, factoryServices...)
default:
return nil, errors.Errorf("unknown Mercury report schema version: %d", feedID.Version())
}
-
+ argsNoPlugin.MercuryPluginFactory = factory
oracle, err := libocr2.NewOracle(argsNoPlugin)
if err != nil {
+ abort()
return nil, errors.WithStack(err)
}
- return []job.ServiceCtx{ocr2Provider, saver, job.NewServiceAdapter(oracle)}, nil
+ srvs = append(srvs, job.NewServiceAdapter(oracle))
+ return srvs, nil
+}
+
+type factoryCfg struct {
+ orm types.DataSourceORM
+ pipelineRunner pipeline.Runner
+ jb job.Job
+ lggr logger.Logger
+ saver *ocrcommon.RunResultSaver
+ chEnhancedTelem chan ocrcommon.EnhancedTelemetryMercuryData
+ ocr2Provider commontypes.MercuryProvider
+ reportingPluginConfig config.PluginConfig
+ cfg Config
+ feedID utils.FeedID
+}
+
+func newv3factory(factoryCfg factoryCfg) (ocr3types.MercuryPluginFactory, []job.ServiceCtx, error) {
+ var factory ocr3types.MercuryPluginFactory
+ srvs := make([]job.ServiceCtx, 0)
+
+ ds := mercuryv3.NewDataSource(
+ factoryCfg.orm,
+ factoryCfg.pipelineRunner,
+ factoryCfg.jb,
+ *factoryCfg.jb.PipelineSpec,
+ factoryCfg.feedID,
+ factoryCfg.lggr,
+ factoryCfg.saver,
+ factoryCfg.chEnhancedTelem,
+ factoryCfg.ocr2Provider.MercuryServerFetcher(),
+ *factoryCfg.reportingPluginConfig.LinkFeedID,
+ *factoryCfg.reportingPluginConfig.NativeFeedID,
+ )
+
+ loopCmd := env.MercuryPlugin.Cmd.Get()
+ loopEnabled := loopCmd != ""
+
+ if loopEnabled {
+ cmdFn, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
+ if err != nil {
+ return nil, nil, fmt.Errorf("failed to init loop for feed %s: %w", factoryCfg.feedID, err)
+ }
+ // in loopp mode, the factory is grpc server, and we need to handle the server lifecycle
+ factoryServer := loop.NewMercuryV3Service(mercuryLggr, opts, cmdFn, factoryCfg.ocr2Provider, ds)
+ srvs = append(srvs, factoryServer)
+ // adapt the grpc server to the vanilla mercury plugin factory interface used by the oracle
+ factory = factoryServer
+ } else {
+ factory = relaymercuryv3.NewFactory(ds, factoryCfg.lggr, factoryCfg.ocr2Provider.OnchainConfigCodec(), factoryCfg.ocr2Provider.ReportCodecV3())
+ }
+ return factory, srvs, nil
+}
+
+func newv2factory(factoryCfg factoryCfg) (ocr3types.MercuryPluginFactory, []job.ServiceCtx, error) {
+ var factory ocr3types.MercuryPluginFactory
+ srvs := make([]job.ServiceCtx, 0)
+
+ ds := mercuryv2.NewDataSource(
+ factoryCfg.orm,
+ factoryCfg.pipelineRunner,
+ factoryCfg.jb,
+ *factoryCfg.jb.PipelineSpec,
+ factoryCfg.feedID,
+ factoryCfg.lggr,
+ factoryCfg.saver,
+ factoryCfg.chEnhancedTelem,
+ factoryCfg.ocr2Provider.MercuryServerFetcher(),
+ *factoryCfg.reportingPluginConfig.LinkFeedID,
+ *factoryCfg.reportingPluginConfig.NativeFeedID,
+ )
+
+ loopCmd := env.MercuryPlugin.Cmd.Get()
+ loopEnabled := loopCmd != ""
+
+ if loopEnabled {
+ cmdFn, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
+ if err != nil {
+ return nil, nil, fmt.Errorf("failed to init loop for feed %s: %w", factoryCfg.feedID, err)
+ }
+ // in loopp mode, the factory is grpc server, and we need to handle the server lifecycle
+ factoryServer := loop.NewMercuryV2Service(mercuryLggr, opts, cmdFn, factoryCfg.ocr2Provider, ds)
+ srvs = append(srvs, factoryServer)
+ // adapt the grpc server to the vanilla mercury plugin factory interface used by the oracle
+ factory = factoryServer
+ } else {
+ factory = relaymercuryv2.NewFactory(ds, factoryCfg.lggr, factoryCfg.ocr2Provider.OnchainConfigCodec(), factoryCfg.ocr2Provider.ReportCodecV2())
+ }
+ return factory, srvs, nil
+}
+
+func newv1factory(factoryCfg factoryCfg) (ocr3types.MercuryPluginFactory, []job.ServiceCtx, error) {
+ var factory ocr3types.MercuryPluginFactory
+ srvs := make([]job.ServiceCtx, 0)
+
+ ds := mercuryv1.NewDataSource(
+ factoryCfg.orm,
+ factoryCfg.pipelineRunner,
+ factoryCfg.jb,
+ *factoryCfg.jb.PipelineSpec,
+ factoryCfg.lggr,
+ factoryCfg.saver,
+ factoryCfg.chEnhancedTelem,
+ factoryCfg.ocr2Provider.MercuryChainReader(),
+ factoryCfg.ocr2Provider.MercuryServerFetcher(),
+ factoryCfg.reportingPluginConfig.InitialBlockNumber.Ptr(),
+ factoryCfg.feedID,
+ )
+
+ loopCmd := env.MercuryPlugin.Cmd.Get()
+ loopEnabled := loopCmd != ""
+
+ if loopEnabled {
+ cmdFn, opts, mercuryLggr, err := initLoop(loopCmd, factoryCfg.cfg, factoryCfg.feedID, factoryCfg.lggr)
+ if err != nil {
+ return nil, nil, fmt.Errorf("failed to init loop for feed %s: %w", factoryCfg.feedID, err)
+ }
+ // in loopp mode, the factory is grpc server, and we need to handle the server lifecycle
+ factoryServer := loop.NewMercuryV1Service(mercuryLggr, opts, cmdFn, factoryCfg.ocr2Provider, ds)
+ srvs = append(srvs, factoryServer)
+ // adapt the grpc server to the vanilla mercury plugin factory interface used by the oracle
+ factory = factoryServer
+ } else {
+ factory = relaymercuryv1.NewFactory(ds, factoryCfg.lggr, factoryCfg.ocr2Provider.OnchainConfigCodec(), factoryCfg.ocr2Provider.ReportCodecV1())
+ }
+ return factory, srvs, nil
+}
+
+func initLoop(cmd string, cfg Config, feedID utils.FeedID, lggr logger.Logger) (func() *exec.Cmd, loop.GRPCOpts, logger.Logger, error) {
+ lggr.Debugw("Initializing Mercury loop", "command", cmd)
+ mercuryLggr := lggr.Named(fmt.Sprintf("MercuryV%d", feedID.Version())).Named(feedID.String())
+ envVars, err := plugins.ParseEnvFile(env.MercuryPlugin.Env.Get())
+ if err != nil {
+ return nil, loop.GRPCOpts{}, nil, fmt.Errorf("failed to parse mercury env file: %w", err)
+ }
+ cmdFn, opts, err := cfg.RegisterLOOP(plugins.CmdConfig{
+ ID: mercuryLggr.Name(),
+ Cmd: cmd,
+ Env: envVars,
+ })
+ if err != nil {
+ return nil, loop.GRPCOpts{}, nil, fmt.Errorf("failed to register loop: %w", err)
+ }
+ return cmdFn, opts, mercuryLggr, nil
}
diff --git a/core/services/ocr2/plugins/mercury/plugin_test.go b/core/services/ocr2/plugins/mercury/plugin_test.go
new file mode 100644
index 00000000000..4e6d4d82a7e
--- /dev/null
+++ b/core/services/ocr2/plugins/mercury/plugin_test.go
@@ -0,0 +1,284 @@
+package mercury_test
+
+import (
+ "context"
+ "os/exec"
+ "reflect"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/google/uuid"
+ "github.com/stretchr/testify/assert"
+
+ "github.com/smartcontractkit/chainlink/v2/core/config/env"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/job"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/loop"
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/mercury"
+ v1 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v1"
+ v2 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v2"
+ v3 "github.com/smartcontractkit/chainlink-common/pkg/types/mercury/v3"
+
+ mercuryocr2 "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/mercury"
+
+ libocr2 "github.com/smartcontractkit/libocr/offchainreporting2plus"
+ libocr2types "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+
+ "github.com/smartcontractkit/chainlink/v2/core/services/pg"
+ "github.com/smartcontractkit/chainlink/v2/core/services/pipeline"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/types"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/utils"
+ "github.com/smartcontractkit/chainlink/v2/plugins"
+)
+
+var (
+ v1FeedId = [32]uint8{00, 01, 107, 74, 167, 229, 124, 167, 182, 138, 225, 191, 69, 101, 63, 86, 182, 86, 253, 58, 163, 53, 239, 127, 174, 105, 107, 102, 63, 27, 132, 114}
+ v2FeedId = [32]uint8{00, 02, 107, 74, 167, 229, 124, 167, 182, 138, 225, 191, 69, 101, 63, 86, 182, 86, 253, 58, 163, 53, 239, 127, 174, 105, 107, 102, 63, 27, 132, 114}
+ v3FeedId = [32]uint8{00, 03, 107, 74, 167, 229, 124, 167, 182, 138, 225, 191, 69, 101, 63, 86, 182, 86, 253, 58, 163, 53, 239, 127, 174, 105, 107, 102, 63, 27, 132, 114}
+
+ testArgsNoPlugin = libocr2.MercuryOracleArgs{
+ LocalConfig: libocr2types.LocalConfig{
+ DevelopmentMode: libocr2types.EnableDangerousDevelopmentMode,
+ },
+ }
+
+ testCfg = mercuryocr2.NewMercuryConfig(1, 1, &testRegistrarConfig{})
+
+ v1jsonCfg = job.JSONConfig{
+ "serverURL": "example.com:80",
+ "serverPubKey": "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93",
+ "initialBlockNumber": 1234,
+ }
+
+ v2jsonCfg = job.JSONConfig{
+ "serverURL": "example.com:80",
+ "serverPubKey": "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93",
+ "linkFeedID": "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472",
+ "nativeFeedID": "0x00036b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472",
+ }
+
+ v3jsonCfg = job.JSONConfig{
+ "serverURL": "example.com:80",
+ "serverPubKey": "724ff6eae9e900270edfff233e16322a70ec06e1a6e62a81ef13921f398f6c93",
+ "linkFeedID": "0x00026b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472",
+ "nativeFeedID": "0x00036b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472",
+ }
+
+ testJob = job.Job{
+ ID: 1,
+ ExternalJobID: uuid.Must(uuid.NewRandom()),
+ OCR2OracleSpecID: ptr(int32(7)),
+ OCR2OracleSpec: &job.OCR2OracleSpec{
+ ID: 7,
+ ContractID: "phony",
+ FeedID: ptr(common.BytesToHash([]byte{1, 2, 3})),
+ Relay: relay.EVM,
+ ChainID: "1",
+ },
+ PipelineSpec: &pipeline.Spec{},
+ PipelineSpecID: int32(1),
+ }
+
+ // this is kind of gross, but it's the best way to test return values of the services
+ expectedEmbeddedServiceCnt = 3
+ expectedLoopServiceCnt = expectedEmbeddedServiceCnt + 1
+)
+
+func TestNewServices(t *testing.T) {
+ type args struct {
+ pluginConfig job.JSONConfig
+ feedID utils.FeedID
+ }
+ tests := []struct {
+ name string
+ args args
+ loopMode bool
+ wantLoopFactory any
+ wantServiceCnt int
+ wantErr bool
+ }{
+ {
+ name: "no plugin config error ",
+ args: args{
+ feedID: v1FeedId,
+ },
+ wantServiceCnt: 0,
+ wantErr: true,
+ },
+
+ {
+ name: "v1 legacy",
+ args: args{
+ pluginConfig: v1jsonCfg,
+ feedID: v1FeedId,
+ },
+ wantServiceCnt: expectedEmbeddedServiceCnt,
+ wantErr: false,
+ },
+ {
+ name: "v2 legacy",
+ args: args{
+ pluginConfig: v2jsonCfg,
+ feedID: v2FeedId,
+ },
+ wantServiceCnt: expectedEmbeddedServiceCnt,
+ wantErr: false,
+ },
+ {
+ name: "v3 legacy",
+ args: args{
+ pluginConfig: v3jsonCfg,
+ feedID: v3FeedId,
+ },
+ wantServiceCnt: expectedEmbeddedServiceCnt,
+ wantErr: false,
+ },
+ {
+ name: "v1 loop",
+ loopMode: true,
+ args: args{
+ pluginConfig: v1jsonCfg,
+ feedID: v1FeedId,
+ },
+ wantServiceCnt: expectedLoopServiceCnt,
+ wantErr: false,
+ wantLoopFactory: &loop.MercuryV1Service{},
+ },
+ {
+ name: "v2 loop",
+ loopMode: true,
+ args: args{
+ pluginConfig: v2jsonCfg,
+ feedID: v2FeedId,
+ },
+ wantServiceCnt: expectedLoopServiceCnt,
+ wantErr: false,
+ wantLoopFactory: &loop.MercuryV2Service{},
+ },
+ {
+ name: "v3 loop",
+ loopMode: true,
+ args: args{
+ pluginConfig: v3jsonCfg,
+ feedID: v3FeedId,
+ },
+ wantServiceCnt: expectedLoopServiceCnt,
+ wantErr: false,
+ wantLoopFactory: &loop.MercuryV3Service{},
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ if tt.loopMode {
+ t.Setenv(string(env.MercuryPlugin.Cmd), "fake_cmd")
+ assert.NotEmpty(t, env.MercuryPlugin.Cmd.Get())
+ }
+ got, err := newServicesTestWrapper(t, tt.args.pluginConfig, tt.args.feedID)
+ if (err != nil) != tt.wantErr {
+ t.Errorf("NewServices() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+ assert.Len(t, got, tt.wantServiceCnt)
+ if tt.loopMode {
+ foundLoopFactory := false
+ for i := 0; i < len(got); i++ {
+ if reflect.TypeOf(got[i]) == reflect.TypeOf(tt.wantLoopFactory) {
+ foundLoopFactory = true
+ break
+ }
+ }
+ assert.True(t, foundLoopFactory)
+ }
+ })
+ }
+}
+
+// we are only varying the version via feedID (and the plugin config)
+// this wrapper supplies dummy values for the rest of the arguments
+func newServicesTestWrapper(t *testing.T, pluginConfig job.JSONConfig, feedID utils.FeedID) ([]job.ServiceCtx, error) {
+ t.Helper()
+ jb := testJob
+ jb.OCR2OracleSpec.PluginConfig = pluginConfig
+ return mercuryocr2.NewServices(jb, &testProvider{}, nil, logger.TestLogger(t), testArgsNoPlugin, testCfg, nil, &testDataSourceORM{}, feedID)
+}
+
+type testProvider struct{}
+
+// ChainReader implements types.MercuryProvider.
+func (*testProvider) ChainReader() commontypes.ChainReader { panic("unimplemented") }
+
+// Close implements types.MercuryProvider.
+func (*testProvider) Close() error { return nil }
+
+// Codec implements types.MercuryProvider.
+func (*testProvider) Codec() commontypes.Codec { panic("unimplemented") }
+
+// ContractConfigTracker implements types.MercuryProvider.
+func (*testProvider) ContractConfigTracker() libocr2types.ContractConfigTracker {
+ panic("unimplemented")
+}
+
+// ContractTransmitter implements types.MercuryProvider.
+func (*testProvider) ContractTransmitter() libocr2types.ContractTransmitter {
+ panic("unimplemented")
+}
+
+// HealthReport implements types.MercuryProvider.
+func (*testProvider) HealthReport() map[string]error { panic("unimplemented") }
+
+// MercuryChainReader implements types.MercuryProvider.
+func (*testProvider) MercuryChainReader() mercury.ChainReader { return nil }
+
+// MercuryServerFetcher implements types.MercuryProvider.
+func (*testProvider) MercuryServerFetcher() mercury.ServerFetcher { return nil }
+
+// Name implements types.MercuryProvider.
+func (*testProvider) Name() string { panic("unimplemented") }
+
+// OffchainConfigDigester implements types.MercuryProvider.
+func (*testProvider) OffchainConfigDigester() libocr2types.OffchainConfigDigester {
+ panic("unimplemented")
+}
+
+// OnchainConfigCodec implements types.MercuryProvider.
+func (*testProvider) OnchainConfigCodec() mercury.OnchainConfigCodec {
+ return nil
+}
+
+// Ready implements types.MercuryProvider.
+func (*testProvider) Ready() error { panic("unimplemented") }
+
+// ReportCodecV1 implements types.MercuryProvider.
+func (*testProvider) ReportCodecV1() v1.ReportCodec { return nil }
+
+// ReportCodecV2 implements types.MercuryProvider.
+func (*testProvider) ReportCodecV2() v2.ReportCodec { return nil }
+
+// ReportCodecV3 implements types.MercuryProvider.
+func (*testProvider) ReportCodecV3() v3.ReportCodec { return nil }
+
+// Start implements types.MercuryProvider.
+func (*testProvider) Start(context.Context) error { panic("unimplemented") }
+
+var _ commontypes.MercuryProvider = (*testProvider)(nil)
+
+type testRegistrarConfig struct{}
+
+// RegisterLOOP implements plugins.RegistrarConfig.
+func (*testRegistrarConfig) RegisterLOOP(config plugins.CmdConfig) (func() *exec.Cmd, loop.GRPCOpts, error) {
+ return nil, loop.GRPCOpts{}, nil
+}
+
+var _ plugins.RegistrarConfig = (*testRegistrarConfig)(nil)
+
+type testDataSourceORM struct{}
+
+// LatestReport implements types.DataSourceORM.
+func (*testDataSourceORM) LatestReport(ctx context.Context, feedID [32]byte, qopts ...pg.QOpt) (report []byte, err error) {
+ return []byte{1, 2, 3}, nil
+}
+
+var _ types.DataSourceORM = (*testDataSourceORM)(nil)
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer.go
index b28ece9843f..13b8bb17245 100644
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer.go
+++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/logprovider/recoverer.go
@@ -542,7 +542,7 @@ func (r *logRecoverer) selectFilterBatch(filters []upkeepFilter) []upkeepFilter
for len(results) < batchSize && len(filters) != 0 {
i, err := r.randIntn(len(filters))
if err != nil {
- r.lggr.Debugw("error generating random number", "error", err.Error())
+ r.lggr.Debugw("error generating random number", "err", err.Error())
continue
}
results = append(results, filters[i])
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go
index 48ee0492f9e..6f0bf98f83d 100644
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go
+++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go
@@ -36,7 +36,7 @@ type latestBlockProvider interface {
LatestBlock() *ocr2keepers.BlockKey
}
-type streamsRegistry interface {
+type streamRegistry interface {
GetUpkeepPrivilegeConfig(opts *bind.CallOpts, upkeepId *big.Int) ([]byte, error)
CheckCallback(opts *bind.CallOpts, id *big.Int, values [][]byte, extraData []byte) (iregistry21.CheckCallback, error)
Address() common.Address
@@ -52,7 +52,7 @@ type streams struct {
mercuryConfig mercury.MercuryConfigProvider
abi abi.ABI
blockSubscriber latestBlockProvider
- registry streamsRegistry
+ registry streamRegistry
client contextCaller
lggr logger.Logger
threadCtrl utils.ThreadControl
@@ -70,7 +70,7 @@ func NewStreamsLookup(
mercuryConfig mercury.MercuryConfigProvider,
blockSubscriber latestBlockProvider,
client contextCaller,
- registry streamsRegistry,
+ registry streamRegistry,
lggr logger.Logger) *streams {
httpClient := http.DefaultClient
threadCtrl := utils.NewThreadControl()
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go
index c7bff2eac7a..531a97159f1 100644
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go
+++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams_test.go
@@ -139,7 +139,7 @@ func TestStreams_CheckCallback(t *testing.T) {
state encoding.PipelineExecutionState
retryable bool
- registry streamsRegistry
+ registry streamRegistry
}{
{
name: "success - empty extra data",
@@ -284,7 +284,7 @@ func TestStreams_AllowedToUseMercury(t *testing.T) {
err error
state encoding.PipelineExecutionState
reason encoding.UpkeepFailureReason
- registry streamsRegistry
+ registry streamRegistry
retryable bool
config []byte
}{
@@ -474,7 +474,7 @@ func TestStreams_StreamsLookup(t *testing.T) {
hasError bool
hasPermission bool
v3 bool
- registry streamsRegistry
+ registry streamRegistry
}{
{
name: "success - happy path no cache",
diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder.go
index 4854f517c46..7f29cb3b7ac 100644
--- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder.go
+++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/payload_builder.go
@@ -33,27 +33,26 @@ func (b *payloadBuilder) BuildPayloads(ctx context.Context, proposals ...ocr2kee
for i, proposal := range proposals {
var payload ocr2keepers.UpkeepPayload
- if b.upkeepList.IsActive(proposal.UpkeepID.BigInt()) {
- b.lggr.Debugf("building payload for coordinated block proposal %+v", proposal)
- var checkData []byte
- var err error
- switch core.GetUpkeepType(proposal.UpkeepID) {
- case types.LogTrigger:
- checkData, err = b.recoverer.GetProposalData(ctx, proposal)
- if err != nil {
- b.lggr.Warnw("failed to get log proposal data", "err", err, "upkeepID", proposal.UpkeepID, "trigger", proposal.Trigger)
- continue
- }
- case types.ConditionTrigger:
- // Empty checkData for conditionals
- }
- payload, err = core.NewUpkeepPayload(proposal.UpkeepID.BigInt(), proposal.Trigger, checkData)
+ if !b.upkeepList.IsActive(proposal.UpkeepID.BigInt()) {
+ b.lggr.Warnw("upkeep is not active, skipping", "upkeepID", proposal.UpkeepID)
+ continue
+ }
+ b.lggr.Debugf("building payload for coordinated block proposal %+v", proposal)
+ var checkData []byte
+ var err error
+ switch core.GetUpkeepType(proposal.UpkeepID) {
+ case types.LogTrigger:
+ checkData, err = b.recoverer.GetProposalData(ctx, proposal)
if err != nil {
- b.lggr.Warnw("error building upkeep payload", "err", err, "upkeepID", proposal.UpkeepID)
+ b.lggr.Warnw("failed to get log proposal data", "err", err, "upkeepID", proposal.UpkeepID, "trigger", proposal.Trigger)
continue
}
- } else {
- b.lggr.Warnw("upkeep is not active, skipping", "upkeepID", proposal.UpkeepID)
+ case types.ConditionTrigger:
+ // Empty checkData for conditionals
+ }
+ payload, err = core.NewUpkeepPayload(proposal.UpkeepID.BigInt(), proposal.Trigger, checkData)
+ if err != nil {
+ b.lggr.Warnw("error building upkeep payload", "err", err, "upkeepID", proposal.UpkeepID)
continue
}
diff --git a/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator.go b/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator.go
index 88d6544d8c4..803ed3450be 100644
--- a/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator.go
+++ b/core/services/ocr2/plugins/ocr2vrf/coordinator/coordinator.go
@@ -440,18 +440,17 @@ func (c *coordinator) ReportBlocks(
// Fill blocks slice with valid requested blocks.
blocks = []ocr2vrftypes.Block{}
for block := range blocksRequested {
- if c.coordinatorConfig.BatchGasLimit-currentBatchGasLimit >= c.coordinatorConfig.BlockGasOverhead {
- _, redeemRandomnessRequested := redeemRandomnessBlocksRequested[block]
- blocks = append(blocks, ocr2vrftypes.Block{
- Hash: blockhashesMapping[block.blockNumber],
- Height: block.blockNumber,
- ConfirmationDelay: block.confDelay,
- ShouldStore: redeemRandomnessRequested,
- })
- currentBatchGasLimit += c.coordinatorConfig.BlockGasOverhead
- } else {
+ if c.coordinatorConfig.BatchGasLimit-currentBatchGasLimit < c.coordinatorConfig.BlockGasOverhead {
break
}
+ _, redeemRandomnessRequested := redeemRandomnessBlocksRequested[block]
+ blocks = append(blocks, ocr2vrftypes.Block{
+ Hash: blockhashesMapping[block.blockNumber],
+ Height: block.blockNumber,
+ ConfirmationDelay: block.confDelay,
+ ShouldStore: redeemRandomnessRequested,
+ })
+ currentBatchGasLimit += c.coordinatorConfig.BlockGasOverhead
}
c.lggr.Tracew("got elligible blocks", "blocks", blocks)
diff --git a/core/services/ocr2/validate/validate.go b/core/services/ocr2/validate/validate.go
index ad54ba4fea2..9fe779b244f 100644
--- a/core/services/ocr2/validate/validate.go
+++ b/core/services/ocr2/validate/validate.go
@@ -9,7 +9,6 @@ import (
"github.com/lib/pq"
"github.com/pelletier/go-toml"
pkgerrors "github.com/pkg/errors"
-
libocr2 "github.com/smartcontractkit/libocr/offchainreporting2plus"
"github.com/smartcontractkit/chainlink-common/pkg/types"
@@ -141,6 +140,7 @@ type innerConfig struct {
ProviderType string `json:"providerType"`
PluginName string `json:"pluginName"`
TelemetryType string `json:"telemetryType"`
+ OCRVersion int `json:"OCRVersion"`
Config
}
diff --git a/core/services/ocrcommon/adapters.go b/core/services/ocrcommon/adapters.go
new file mode 100644
index 00000000000..ca7e84ccfa6
--- /dev/null
+++ b/core/services/ocrcommon/adapters.go
@@ -0,0 +1,73 @@
+package ocrcommon
+
+import (
+ "context"
+
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
+ ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+)
+
+var _ ocr3types.OnchainKeyring[any] = (*OCR3OnchainKeyringAdapter)(nil)
+
+type OCR3OnchainKeyringAdapter struct {
+ o ocrtypes.OnchainKeyring
+}
+
+func NewOCR3OnchainKeyringAdapter(o ocrtypes.OnchainKeyring) *OCR3OnchainKeyringAdapter {
+ return &OCR3OnchainKeyringAdapter{o}
+}
+
+func (k *OCR3OnchainKeyringAdapter) PublicKey() ocrtypes.OnchainPublicKey {
+ return k.o.PublicKey()
+}
+
+func (k *OCR3OnchainKeyringAdapter) Sign(digest ocrtypes.ConfigDigest, seqNr uint64, r ocr3types.ReportWithInfo[any]) (signature []byte, err error) {
+ return k.o.Sign(ocrtypes.ReportContext{
+ ReportTimestamp: ocrtypes.ReportTimestamp{
+ ConfigDigest: digest,
+ Epoch: uint32(seqNr),
+ Round: 0,
+ },
+ ExtraHash: [32]byte(make([]byte, 32)),
+ }, r.Report)
+}
+
+func (k *OCR3OnchainKeyringAdapter) Verify(opk ocrtypes.OnchainPublicKey, digest ocrtypes.ConfigDigest, seqNr uint64, ri ocr3types.ReportWithInfo[any], signature []byte) bool {
+ return k.o.Verify(opk, ocrtypes.ReportContext{
+ ReportTimestamp: ocrtypes.ReportTimestamp{
+ ConfigDigest: digest,
+ Epoch: uint32(seqNr),
+ Round: 0,
+ },
+ ExtraHash: [32]byte(make([]byte, 32)),
+ }, ri.Report, signature)
+}
+
+func (k *OCR3OnchainKeyringAdapter) MaxSignatureLength() int {
+ return k.o.MaxSignatureLength()
+}
+
+var _ ocr3types.ContractTransmitter[any] = (*OCR3ContractTransmitterAdapter)(nil)
+
+type OCR3ContractTransmitterAdapter struct {
+ ct ocrtypes.ContractTransmitter
+}
+
+func NewOCR3ContractTransmitterAdapter(ct ocrtypes.ContractTransmitter) *OCR3ContractTransmitterAdapter {
+ return &OCR3ContractTransmitterAdapter{ct}
+}
+
+func (c *OCR3ContractTransmitterAdapter) Transmit(ctx context.Context, digest ocrtypes.ConfigDigest, seqNr uint64, r ocr3types.ReportWithInfo[any], signatures []ocrtypes.AttributedOnchainSignature) error {
+ return c.ct.Transmit(ctx, ocrtypes.ReportContext{
+ ReportTimestamp: ocrtypes.ReportTimestamp{
+ ConfigDigest: digest,
+ Epoch: uint32(seqNr),
+ Round: 0,
+ },
+ ExtraHash: [32]byte(make([]byte, 32)),
+ }, r.Report, signatures)
+}
+
+func (c *OCR3ContractTransmitterAdapter) FromAccount() (ocrtypes.Account, error) {
+ return c.ct.FromAccount()
+}
diff --git a/core/services/ocrcommon/adapters_test.go b/core/services/ocrcommon/adapters_test.go
new file mode 100644
index 00000000000..a29cec27de7
--- /dev/null
+++ b/core/services/ocrcommon/adapters_test.go
@@ -0,0 +1,153 @@
+package ocrcommon_test
+
+import (
+ "context"
+ "fmt"
+ "reflect"
+ "testing"
+
+ "github.com/smartcontractkit/libocr/offchainreporting2/types"
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
+ ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon"
+)
+
+var _ ocrtypes.OnchainKeyring = (*fakeOnchainKeyring)(nil)
+
+var (
+ account ocrtypes.Account = "Test-Account"
+ configDigest = ocrtypes.ConfigDigest([]byte("kKfYauxXBMjuP5EuuyacN6BwCfKJnP6d"))
+ seqNr uint64 = 11
+ rwi = ocr3types.ReportWithInfo[any]{
+ Report: []byte("report"),
+ }
+ signatures = []types.AttributedOnchainSignature{{
+ Signature: []byte("signature1"),
+ Signer: 1,
+ }, {
+ Signature: []byte("signature2"),
+ Signer: 2,
+ }}
+ pubKey = ocrtypes.OnchainPublicKey("pub-key")
+ maxSignatureLength = 12
+ sigs = []byte("some-signatures")
+)
+
+type fakeOnchainKeyring struct {
+}
+
+func (f fakeOnchainKeyring) PublicKey() ocrtypes.OnchainPublicKey {
+ return pubKey
+}
+
+func (f fakeOnchainKeyring) Sign(rc ocrtypes.ReportContext, r ocrtypes.Report) (signature []byte, err error) {
+ if !reflect.DeepEqual(rc.ConfigDigest, configDigest) {
+ return nil, fmt.Errorf("expected configDigest %v but got %v", configDigest, rc.ReportTimestamp.ConfigDigest)
+ }
+
+ if rc.Epoch != uint32(seqNr) {
+ return nil, fmt.Errorf("expected Epoch %v but got %v", seqNr, rc.Epoch)
+ }
+
+ if rc.Round != 0 {
+ return nil, fmt.Errorf("expected Round %v but got %v", 0, rc.Round)
+ }
+
+ if !reflect.DeepEqual(r, rwi.Report) {
+ return nil, fmt.Errorf("expected Report %v but got %v", rwi.Report, r)
+ }
+ return nil, nil
+}
+
+func (f fakeOnchainKeyring) Verify(pk ocrtypes.OnchainPublicKey, rc ocrtypes.ReportContext, r ocrtypes.Report, signature []byte) bool {
+ if !reflect.DeepEqual(pk, pubKey) {
+ return false
+ }
+
+ if !reflect.DeepEqual(rc.ConfigDigest, configDigest) {
+ return false
+ }
+
+ if rc.Epoch != uint32(seqNr) {
+ return false
+ }
+
+ if rc.Round != 0 {
+ return false
+ }
+
+ if !reflect.DeepEqual(r, rwi.Report) {
+ return false
+ }
+
+ if !reflect.DeepEqual(signature, sigs) {
+ return false
+ }
+
+ return true
+}
+
+func (f fakeOnchainKeyring) MaxSignatureLength() int {
+ return maxSignatureLength
+}
+
+func TestOCR3OnchainKeyringAdapter(t *testing.T) {
+ kr := ocrcommon.NewOCR3OnchainKeyringAdapter(fakeOnchainKeyring{})
+
+ _, err := kr.Sign(configDigest, seqNr, rwi)
+ require.NoError(t, err)
+ require.True(t, kr.Verify(pubKey, configDigest, seqNr, rwi, sigs))
+
+ require.Equal(t, pubKey, kr.PublicKey())
+ require.Equal(t, maxSignatureLength, kr.MaxSignatureLength())
+}
+
+var _ ocrtypes.ContractTransmitter = (*fakeContractTransmitter)(nil)
+
+type fakeContractTransmitter struct {
+}
+
+func (f fakeContractTransmitter) Transmit(ctx context.Context, rc ocrtypes.ReportContext, report ocrtypes.Report, s []ocrtypes.AttributedOnchainSignature) error {
+
+ if !reflect.DeepEqual(report, rwi.Report) {
+ return fmt.Errorf("expected Report %v but got %v", rwi.Report, report)
+ }
+
+ if !reflect.DeepEqual(s, signatures) {
+ return fmt.Errorf("expected signatures %v but got %v", signatures, s)
+ }
+
+ if !reflect.DeepEqual(rc.ConfigDigest, configDigest) {
+ return fmt.Errorf("expected configDigest %v but got %v", configDigest, rc.ReportTimestamp.ConfigDigest)
+ }
+
+ if rc.Epoch != uint32(seqNr) {
+ return fmt.Errorf("expected Epoch %v but got %v", seqNr, rc.Epoch)
+ }
+
+ if rc.Round != 0 {
+ return fmt.Errorf("expected Round %v but got %v", 0, rc.Round)
+ }
+
+ return nil
+}
+
+func (f fakeContractTransmitter) LatestConfigDigestAndEpoch(ctx context.Context) (configDigest ocrtypes.ConfigDigest, epoch uint32, err error) {
+ panic("not implemented")
+}
+
+func (f fakeContractTransmitter) FromAccount() (ocrtypes.Account, error) {
+ return account, nil
+}
+
+func TestContractTransmitter(t *testing.T) {
+ ct := ocrcommon.NewOCR3ContractTransmitterAdapter(fakeContractTransmitter{})
+
+ require.NoError(t, ct.Transmit(context.Background(), configDigest, seqNr, rwi, signatures))
+
+ a, err := ct.FromAccount()
+ require.NoError(t, err)
+ require.Equal(t, a, account)
+}
diff --git a/core/services/pipeline/common.go b/core/services/pipeline/common.go
index 6efa7aa2148..6e7ad1e7e4e 100644
--- a/core/services/pipeline/common.go
+++ b/core/services/pipeline/common.go
@@ -44,6 +44,7 @@ const (
StreamJobType string = "stream"
VRFJobType string = "vrf"
WebhookJobType string = "webhook"
+ WorkflowJobType string = "workflow"
)
//go:generate mockery --quiet --name Config --output ./mocks/ --case=underscore
@@ -243,6 +244,16 @@ func (trrs TaskRunResults) FinalResult(l logger.Logger) FinalResult {
return fr
}
+// Terminals returns all terminal task run results
+func (trrs TaskRunResults) Terminals() (terminals []TaskRunResult) {
+ for _, trr := range trrs {
+ if trr.IsTerminal() {
+ terminals = append(terminals, trr)
+ }
+ }
+ return
+}
+
// GetNextTaskOf returns the task with the next id or nil if it does not exist
func (trrs *TaskRunResults) GetNextTaskOf(task TaskRunResult) *TaskRunResult {
nextID := task.Task.Base().id + 1
@@ -662,12 +673,22 @@ func getJsonNumberValue(value json.Number) (interface{}, error) {
}
} else {
f, err := value.Float64()
- if err == nil {
- result = f
- } else {
+ if err != nil {
return nil, pkgerrors.Errorf("failed to parse json.Value: %v", err)
}
+ result = f
}
return result, nil
}
+
+func selectBlock(block string) (string, error) {
+ if block == "" {
+ return "latest", nil
+ }
+ block = strings.ToLower(block)
+ if block == "pending" || block == "latest" {
+ return block, nil
+ }
+ return "", pkgerrors.Errorf("unsupported block param: %s", block)
+}
diff --git a/core/services/pipeline/runner.go b/core/services/pipeline/runner.go
index a432d9fec11..30a35598c3e 100644
--- a/core/services/pipeline/runner.go
+++ b/core/services/pipeline/runner.go
@@ -546,11 +546,10 @@ func (r *runner) Run(ctx context.Context, run *Run, l logger.Logger, saveSuccess
// retain old UUID values
for _, taskRun := range run.PipelineTaskRuns {
task := pipeline.ByDotID(taskRun.DotID)
- if task != nil && task.Base() != nil {
- task.Base().uuid = taskRun.ID
- } else {
+ if task == nil || task.Base() == nil {
return false, pkgerrors.Errorf("failed to match a pipeline task for dot ID: %v", taskRun.DotID)
}
+ task.Base().uuid = taskRun.ID
}
preinsert := pipeline.RequiresPreInsert()
diff --git a/core/services/pipeline/task.estimategas.go b/core/services/pipeline/task.estimategas.go
index 43c148b287f..8fccc5e8eac 100644
--- a/core/services/pipeline/task.estimategas.go
+++ b/core/services/pipeline/task.estimategas.go
@@ -8,6 +8,7 @@ import (
"github.com/ethereum/go-ethereum"
"github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/pkg/errors"
"github.com/shopspring/decimal"
"go.uber.org/multierr"
@@ -28,6 +29,7 @@ type EstimateGasLimitTask struct {
Multiplier string `json:"multiplier"`
Data string `json:"data"`
EVMChainID string `json:"evmChainID" mapstructure:"evmChainID"`
+ Block string `json:"block"`
specGasLimit *uint32
legacyChains legacyevm.LegacyChainContainer
@@ -61,6 +63,7 @@ func (t *EstimateGasLimitTask) Run(ctx context.Context, lggr logger.Logger, vars
data BytesParam
multiplier DecimalParam
chainID StringParam
+ block StringParam
)
err := multierr.Combine(
errors.Wrap(ResolveParam(&fromAddr, From(VarExpr(t.From, vars), utils.ZeroAddress)), "from"),
@@ -69,6 +72,7 @@ func (t *EstimateGasLimitTask) Run(ctx context.Context, lggr logger.Logger, vars
// Default to 1, i.e. exactly what estimateGas suggests
errors.Wrap(ResolveParam(&multiplier, From(VarExpr(t.Multiplier, vars), NonemptyString(t.Multiplier), decimal.New(1, 0))), "multiplier"),
errors.Wrap(ResolveParam(&chainID, From(VarExpr(t.getEvmChainID(), vars), NonemptyString(t.getEvmChainID()), "")), "evmChainID"),
+ errors.Wrap(ResolveParam(&block, From(VarExpr(t.Block, vars), t.Block)), "block"),
)
if err != nil {
return Result{Error: err}, runInfo
@@ -82,18 +86,32 @@ func (t *EstimateGasLimitTask) Run(ctx context.Context, lggr logger.Logger, vars
maximumGasLimit := SelectGasLimit(chain.Config().EVM().GasEstimator(), t.jobType, t.specGasLimit)
to := common.Address(toAddr)
- gasLimit, err := chain.Client().EstimateGas(ctx, ethereum.CallMsg{
- From: common.Address(fromAddr),
- To: &to,
- Data: data,
- })
+ var gasLimit hexutil.Uint64
+ args := map[string]interface{}{
+ "from": common.Address(fromAddr),
+ "to": &to,
+ "input": hexutil.Bytes([]byte(data)),
+ }
+
+ selectedBlock, err := selectBlock(string(block))
+ if err != nil {
+ return Result{Error: err}, runInfo
+ }
+ err = chain.Client().CallContext(ctx,
+ &gasLimit,
+ "eth_estimateGas",
+ args,
+ selectedBlock,
+ )
+
if err != nil {
// Fallback to the maximum conceivable gas limit
// if we're unable to call estimate gas for whatever reason.
lggr.Warnw("EstimateGas: unable to estimate, fallback to configured limit", "err", err, "fallback", maximumGasLimit)
return Result{Value: maximumGasLimit}, runInfo
}
- gasLimitDecimal, err := decimal.NewFromString(strconv.FormatUint(gasLimit, 10))
+
+ gasLimitDecimal, err := decimal.NewFromString(strconv.FormatUint(uint64(gasLimit), 10))
if err != nil {
return Result{Error: err}, retryableRunInfo()
}
diff --git a/core/services/pipeline/task.eth_call.go b/core/services/pipeline/task.eth_call.go
index 56b2df08c4e..f011cd7a9b6 100644
--- a/core/services/pipeline/task.eth_call.go
+++ b/core/services/pipeline/task.eth_call.go
@@ -3,6 +3,7 @@ package pipeline
import (
"context"
"fmt"
+ "strings"
"time"
"github.com/ethereum/go-ethereum"
@@ -33,6 +34,7 @@ type ETHCallTask struct {
GasUnlimited string `json:"gasUnlimited"`
ExtractRevertReason bool `json:"extractRevertReason"`
EVMChainID string `json:"evmChainID" mapstructure:"evmChainID"`
+ Block string `json:"block"`
specGasLimit *uint32
legacyChains legacyevm.LegacyChainContainer
@@ -78,6 +80,7 @@ func (t *ETHCallTask) Run(ctx context.Context, lggr logger.Logger, vars Vars, in
gasFeeCap MaybeBigIntParam
gasUnlimited BoolParam
chainID StringParam
+ block StringParam
)
err = multierr.Combine(
errors.Wrap(ResolveParam(&contractAddr, From(VarExpr(t.Contract, vars), NonemptyString(t.Contract))), "contract"),
@@ -89,6 +92,7 @@ func (t *ETHCallTask) Run(ctx context.Context, lggr logger.Logger, vars Vars, in
errors.Wrap(ResolveParam(&gasFeeCap, From(VarExpr(t.GasFeeCap, vars), t.GasFeeCap)), "gasFeeCap"),
errors.Wrap(ResolveParam(&chainID, From(VarExpr(t.getEvmChainID(), vars), NonemptyString(t.getEvmChainID()), "")), "evmChainID"),
errors.Wrap(ResolveParam(&gasUnlimited, From(VarExpr(t.GasUnlimited, vars), NonemptyString(t.GasUnlimited), false)), "gasUnlimited"),
+ errors.Wrap(ResolveParam(&block, From(VarExpr(t.Block, vars), t.Block)), "block"),
)
if err != nil {
return Result{Error: err}, runInfo
@@ -131,7 +135,15 @@ func (t *ETHCallTask) Run(ctx context.Context, lggr logger.Logger, vars Vars, in
With("gasFeeCap", call.GasFeeCap)
start := time.Now()
- resp, err := chain.Client().CallContract(ctx, call, nil)
+
+ var resp []byte
+ blockStr := block.String()
+ if blockStr == "" || strings.ToLower(blockStr) == "latest" {
+ resp, err = chain.Client().CallContract(ctx, call, nil)
+ } else if strings.ToLower(blockStr) == "pending" {
+ resp, err = chain.Client().PendingCallContract(ctx, call)
+ }
+
elapsed := time.Since(start)
if err != nil {
if t.ExtractRevertReason {
@@ -149,6 +161,5 @@ func (t *ETHCallTask) Run(ctx context.Context, lggr logger.Logger, vars Vars, in
}
promETHCallTime.WithLabelValues(t.DotID()).Set(float64(elapsed))
-
return Result{Value: resp}, runInfo
}
diff --git a/core/services/pipeline/task.eth_call_test.go b/core/services/pipeline/task.eth_call_test.go
index cb58a03a9df..28af94ba25c 100644
--- a/core/services/pipeline/task.eth_call_test.go
+++ b/core/services/pipeline/task.eth_call_test.go
@@ -43,6 +43,7 @@ func TestETHCallTask(t *testing.T) {
data string
evmChainID string
gas string
+ block string
specGasLimit *uint32
vars pipeline.Vars
inputs []pipeline.Result
@@ -58,6 +59,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte("foo bar"),
@@ -78,6 +80,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"$(gasLimit)",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte("foo bar"),
@@ -99,6 +102,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"",
+ "",
&specGasLimit,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte("foo bar"),
@@ -119,6 +123,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte("foo bar"),
@@ -140,6 +145,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte("foo bar"),
@@ -155,6 +161,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte("foo bar"),
@@ -170,6 +177,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"zork": []byte("foo bar"),
@@ -185,6 +193,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte(nil),
@@ -200,6 +209,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"0",
"",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte("foo bar"),
@@ -215,6 +225,7 @@ func TestETHCallTask(t *testing.T) {
"$(foo)",
"$(evmChainID)",
"",
+ "",
nil,
pipeline.NewVarsFrom(map[string]interface{}{
"foo": []byte("foo bar"),
@@ -229,6 +240,48 @@ func TestETHCallTask(t *testing.T) {
},
nil, nil, chains.ErrNoSuchChainID.Error(),
},
+ {
+ "simulate using latest block",
+ "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF",
+ "",
+ "$(foo)",
+ "0",
+ "",
+ "latest",
+ nil,
+ pipeline.NewVarsFrom(map[string]interface{}{
+ "foo": []byte("foo bar"),
+ }),
+ nil,
+ func(ethClient *evmclimocks.Client, config *pipelinemocks.Config) {
+ contractAddr := common.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")
+ ethClient.
+ On("CallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), Data: []byte("foo bar")}, (*big.Int)(nil)).
+ Return([]byte("baz quux"), nil)
+ },
+ []byte("baz quux"), nil, "",
+ },
+ {
+ "simulate using pending block",
+ "0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF",
+ "",
+ "$(foo)",
+ "0",
+ "",
+ "pending",
+ nil,
+ pipeline.NewVarsFrom(map[string]interface{}{
+ "foo": []byte("foo bar"),
+ }),
+ nil,
+ func(ethClient *evmclimocks.Client, config *pipelinemocks.Config) {
+ contractAddr := common.HexToAddress("0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF")
+ ethClient.
+ On("PendingCallContract", mock.Anything, ethereum.CallMsg{To: &contractAddr, Gas: uint64(drJobTypeGasLimit), Data: []byte("foo bar")}).
+ Return([]byte("baz quux"), nil)
+ },
+ []byte("baz quux"), nil, "",
+ },
}
for _, test := range tests {
@@ -241,6 +294,7 @@ func TestETHCallTask(t *testing.T) {
Data: test.data,
EVMChainID: test.evmChainID,
Gas: test.gas,
+ Block: test.block,
}
ethClient := evmclimocks.NewClient(t)
diff --git a/core/services/pipeline/task.vrfv2plus.go b/core/services/pipeline/task.vrfv2plus.go
index c029af68cbe..6bc299eeb6f 100644
--- a/core/services/pipeline/task.vrfv2plus.go
+++ b/core/services/pipeline/task.vrfv2plus.go
@@ -137,7 +137,9 @@ func (t *VRFTaskV2Plus) Run(_ context.Context, lggr logger.Logger, vars Vars, in
if err != nil {
return Result{Error: err}, retryableRunInfo()
}
- b, err := vrfCoordinatorV2PlusABI.Pack("fulfillRandomWords", onChainProof, rc)
+ // onlyPremium is false because this task assumes that chainlink node fulfills the VRF request
+ // gas cost should be billed to the requesting subscription
+ b, err := vrfCoordinatorV2PlusABI.Pack("fulfillRandomWords", onChainProof, rc, false /* onlyPremium */)
if err != nil {
return Result{Error: err}, runInfo
}
diff --git a/core/services/pipeline/task_params.go b/core/services/pipeline/task_params.go
index 72d0d619429..61d3b8650ad 100644
--- a/core/services/pipeline/task_params.go
+++ b/core/services/pipeline/task_params.go
@@ -708,11 +708,11 @@ func (p *JSONPathParam) UnmarshalPipelineParam(val interface{}) error {
ssp = v
case []interface{}:
for _, x := range v {
- if as, is := x.(string); is {
- ssp = append(ssp, as)
- } else {
+ as, is := x.(string)
+ if !is {
return ErrBadInput
}
+ ssp = append(ssp, as)
}
case string:
if len(v) == 0 {
diff --git a/core/services/relay/evm/codec_test.go b/core/services/relay/evm/codec_test.go
index b13051cb010..2f9a4639d41 100644
--- a/core/services/relay/evm/codec_test.go
+++ b/core/services/relay/evm/codec_test.go
@@ -50,6 +50,31 @@ func TestCodec(t *testing.T) {
})
}
+func TestCodec_SimpleEncode(t *testing.T) {
+ codecName := "my_codec"
+ input := map[string]any{
+ "Report": int32(6),
+ "Meta": "abcdefg",
+ }
+ evmEncoderConfig := `[{"Name":"Report","Type":"int32"},{"Name":"Meta","Type":"string"}]`
+
+ codecConfig := types.CodecConfig{Configs: map[string]types.ChainCodecConfig{
+ codecName: {TypeABI: evmEncoderConfig},
+ }}
+ c, err := evm.NewCodec(codecConfig)
+ require.NoError(t, err)
+
+ result, err := c.Encode(testutils.Context(t), input, codecName)
+ require.NoError(t, err)
+ expected :=
+ "0000000000000000000000000000000000000000000000000000000000000006" + // int32(6)
+ "0000000000000000000000000000000000000000000000000000000000000040" + // total bytes occupied by the string (64)
+ "0000000000000000000000000000000000000000000000000000000000000007" + // length of the string (7 chars)
+ "6162636465666700000000000000000000000000000000000000000000000000" // actual string
+
+ require.Equal(t, expected, hexutil.Encode(result)[2:])
+}
+
type codecInterfaceTester struct{}
func (it *codecInterfaceTester) Setup(_ *testing.T) {}
diff --git a/core/services/relay/evm/config_poller.go b/core/services/relay/evm/config_poller.go
index dc75fe037fe..bb962fc6ed5 100644
--- a/core/services/relay/evm/config_poller.go
+++ b/core/services/relay/evm/config_poller.go
@@ -5,7 +5,6 @@ import (
"database/sql"
"fmt"
- "github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
@@ -34,60 +33,9 @@ var (
)
)
-var (
- // ConfigSet Common to all OCR2 evm based contracts: https://github.com/smartcontractkit/libocr/blob/master/contract2/dev/OCR2Abstract.sol
- ConfigSet common.Hash
-
- defaultABI abi.ABI
-)
-
-const configSetEventName = "ConfigSet"
-
-func init() {
- var err error
- abiPointer, err := ocr2aggregator.OCR2AggregatorMetaData.GetAbi()
- if err != nil {
- panic(err)
- }
- defaultABI = *abiPointer
- ConfigSet = defaultABI.Events[configSetEventName].ID
-}
-
-func unpackLogData(d []byte) (*ocr2aggregator.OCR2AggregatorConfigSet, error) {
- unpacked := new(ocr2aggregator.OCR2AggregatorConfigSet)
- err := defaultABI.UnpackIntoInterface(unpacked, configSetEventName, d)
- if err != nil {
- return nil, errors.Wrap(err, "failed to unpack log data")
- }
- return unpacked, nil
-}
-
-func configFromLog(logData []byte) (ocrtypes.ContractConfig, error) {
- unpacked, err := unpackLogData(logData)
- if err != nil {
- return ocrtypes.ContractConfig{}, err
- }
-
- var transmitAccounts []ocrtypes.Account
- for _, addr := range unpacked.Transmitters {
- transmitAccounts = append(transmitAccounts, ocrtypes.Account(addr.Hex()))
- }
- var signers []ocrtypes.OnchainPublicKey
- for _, addr := range unpacked.Signers {
- addr := addr
- signers = append(signers, addr[:])
- }
-
- return ocrtypes.ContractConfig{
- ConfigDigest: unpacked.ConfigDigest,
- ConfigCount: unpacked.ConfigCount,
- Signers: signers,
- Transmitters: transmitAccounts,
- F: unpacked.F,
- OnchainConfig: unpacked.OnchainConfig,
- OffchainConfigVersion: unpacked.OffchainConfigVersion,
- OffchainConfig: unpacked.OffchainConfig,
- }, nil
+type LogDecoder interface {
+ EventSig() common.Hash
+ Decode(rawLog []byte) (ocrtypes.ContractConfig, error)
}
type configPoller struct {
@@ -105,18 +53,30 @@ type configPoller struct {
// contract allows us work around such restrictions.
configStoreContractAddr *common.Address
configStoreContract *ocrconfigurationstoreevmsimple.OCRConfigurationStoreEVMSimple
+
+ // Depending on the exact contract used, the raw config log may be shaped
+ // in different ways
+ ld LogDecoder
}
func configPollerFilterName(addr common.Address) string {
return logpoller.FilterName("OCR2ConfigPoller", addr.String())
}
-func NewConfigPoller(lggr logger.Logger, client client.Client, destChainPoller logpoller.LogPoller, aggregatorContractAddr common.Address, configStoreAddr *common.Address) (evmRelayTypes.ConfigPoller, error) {
- return newConfigPoller(lggr, client, destChainPoller, aggregatorContractAddr, configStoreAddr)
+type CPConfig struct {
+ Client client.Client
+ DestinationChainPoller logpoller.LogPoller
+ AggregatorContractAddress common.Address
+ ConfigStoreAddress *common.Address
+ LogDecoder LogDecoder
+}
+
+func NewConfigPoller(lggr logger.Logger, cfg CPConfig) (evmRelayTypes.ConfigPoller, error) {
+ return newConfigPoller(lggr, cfg.Client, cfg.DestinationChainPoller, cfg.AggregatorContractAddress, cfg.ConfigStoreAddress, cfg.LogDecoder)
}
-func newConfigPoller(lggr logger.Logger, client client.Client, destChainPoller logpoller.LogPoller, aggregatorContractAddr common.Address, configStoreAddr *common.Address) (*configPoller, error) {
- err := destChainPoller.RegisterFilter(logpoller.Filter{Name: configPollerFilterName(aggregatorContractAddr), EventSigs: []common.Hash{ConfigSet}, Addresses: []common.Address{aggregatorContractAddr}})
+func newConfigPoller(lggr logger.Logger, client client.Client, destChainPoller logpoller.LogPoller, aggregatorContractAddr common.Address, configStoreAddr *common.Address, ld LogDecoder) (*configPoller, error) {
+ err := destChainPoller.RegisterFilter(logpoller.Filter{Name: configPollerFilterName(aggregatorContractAddr), EventSigs: []common.Hash{ld.EventSig()}, Addresses: []common.Address{aggregatorContractAddr}})
if err != nil {
return nil, err
}
@@ -133,6 +93,7 @@ func newConfigPoller(lggr logger.Logger, client client.Client, destChainPoller l
aggregatorContractAddr: aggregatorContractAddr,
client: client,
aggregatorContract: aggregatorContract,
+ ld: ld,
}
if configStoreAddr != nil {
@@ -164,7 +125,7 @@ func (cp *configPoller) Replay(ctx context.Context, fromBlock int64) error {
// LatestConfigDetails returns the latest config details from the logs
func (cp *configPoller) LatestConfigDetails(ctx context.Context) (changedInBlock uint64, configDigest ocrtypes.ConfigDigest, err error) {
- latest, err := cp.destChainLogPoller.LatestLogByEventSigWithConfs(ConfigSet, cp.aggregatorContractAddr, 1, pg.WithParentCtx(ctx))
+ latest, err := cp.destChainLogPoller.LatestLogByEventSigWithConfs(cp.ld.EventSig(), cp.aggregatorContractAddr, 1, pg.WithParentCtx(ctx))
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
if cp.isConfigStoreAvailable() {
@@ -176,7 +137,7 @@ func (cp *configPoller) LatestConfigDetails(ctx context.Context) (changedInBlock
}
return 0, ocrtypes.ConfigDigest{}, err
}
- latestConfigSet, err := configFromLog(latest.Data)
+ latestConfigSet, err := cp.ld.Decode(latest.Data)
if err != nil {
return 0, ocrtypes.ConfigDigest{}, err
}
@@ -185,7 +146,7 @@ func (cp *configPoller) LatestConfigDetails(ctx context.Context) (changedInBlock
// LatestConfig returns the latest config from the logs on a certain block
func (cp *configPoller) LatestConfig(ctx context.Context, changedInBlock uint64) (ocrtypes.ContractConfig, error) {
- lgs, err := cp.destChainLogPoller.Logs(int64(changedInBlock), int64(changedInBlock), ConfigSet, cp.aggregatorContractAddr, pg.WithParentCtx(ctx))
+ lgs, err := cp.destChainLogPoller.Logs(int64(changedInBlock), int64(changedInBlock), cp.ld.EventSig(), cp.aggregatorContractAddr, pg.WithParentCtx(ctx))
if err != nil {
return ocrtypes.ContractConfig{}, err
}
@@ -196,7 +157,7 @@ func (cp *configPoller) LatestConfig(ctx context.Context, changedInBlock uint64)
}
return ocrtypes.ContractConfig{}, fmt.Errorf("no logs found for config on contract %s (chain %s) at block %d", cp.aggregatorContractAddr.Hex(), cp.client.ConfiguredChainID().String(), changedInBlock)
}
- latestConfigSet, err := configFromLog(lgs[len(lgs)-1].Data)
+ latestConfigSet, err := cp.ld.Decode(lgs[len(lgs)-1].Data)
if err != nil {
return ocrtypes.ContractConfig{}, err
}
diff --git a/core/services/relay/evm/config_poller_test.go b/core/services/relay/evm/config_poller_test.go
index 79533a06f01..cd66e5479bf 100644
--- a/core/services/relay/evm/config_poller_test.go
+++ b/core/services/relay/evm/config_poller_test.go
@@ -55,6 +55,8 @@ func TestConfigPoller(t *testing.T) {
var linkTokenAddress common.Address
var accessAddress common.Address
+ ld := OCR2AggregatorLogDecoder
+
{
key, err := crypto.GenerateKey()
require.NoError(t, err)
@@ -92,7 +94,7 @@ func TestConfigPoller(t *testing.T) {
}
t.Run("LatestConfig errors if there is no config in logs and config store is unconfigured", func(t *testing.T) {
- cp, err := NewConfigPoller(lggr, ethClient, lp, ocrAddress, nil)
+ cp, err := NewConfigPoller(lggr, CPConfig{ethClient, lp, ocrAddress, nil, ld})
require.NoError(t, err)
_, err = cp.LatestConfig(testutils.Context(t), 0)
@@ -101,7 +103,7 @@ func TestConfigPoller(t *testing.T) {
})
t.Run("happy path (with config store)", func(t *testing.T) {
- cp, err := NewConfigPoller(lggr, ethClient, lp, ocrAddress, &configStoreContractAddr)
+ cp, err := NewConfigPoller(lggr, CPConfig{ethClient, lp, ocrAddress, &configStoreContractAddr, ld})
require.NoError(t, err)
// Should have no config to begin with.
_, configDigest, err := cp.LatestConfigDetails(testutils.Context(t))
@@ -172,7 +174,7 @@ func TestConfigPoller(t *testing.T) {
mp.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, sql.ErrNoRows)
t.Run("if callLatestConfigDetails succeeds", func(t *testing.T) {
- cp, err := newConfigPoller(lggr, ethClient, mp, ocrAddress, &configStoreContractAddr)
+ cp, err := newConfigPoller(lggr, ethClient, mp, ocrAddress, &configStoreContractAddr, ld)
require.NoError(t, err)
t.Run("when config has not been set, returns zero values", func(t *testing.T) {
@@ -209,7 +211,7 @@ func TestConfigPoller(t *testing.T) {
failingClient := new(evmClientMocks.Client)
failingClient.On("ConfiguredChainID").Return(big.NewInt(42))
failingClient.On("CallContract", mock.Anything, mock.Anything, mock.Anything).Return(nil, errors.New("something exploded"))
- cp, err := newConfigPoller(lggr, failingClient, mp, ocrAddress, &configStoreContractAddr)
+ cp, err := newConfigPoller(lggr, failingClient, mp, ocrAddress, &configStoreContractAddr, ld)
require.NoError(t, err)
cp.configStoreContractAddr = &configStoreContractAddr
@@ -248,7 +250,7 @@ func TestConfigPoller(t *testing.T) {
mp.On("LatestLogByEventSigWithConfs", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, sql.ErrNoRows)
t.Run("if callReadConfig succeeds", func(t *testing.T) {
- cp, err := newConfigPoller(lggr, ethClient, mp, ocrAddress, &configStoreContractAddr)
+ cp, err := newConfigPoller(lggr, ethClient, mp, ocrAddress, &configStoreContractAddr, ld)
require.NoError(t, err)
t.Run("when config has not been set, returns error", func(t *testing.T) {
@@ -310,7 +312,7 @@ func TestConfigPoller(t *testing.T) {
// initial call to retrieve config store address from aggregator
return *callArgs.To == ocrAddress
}), mock.Anything).Return(nil, errors.New("something exploded")).Once()
- cp, err := newConfigPoller(lggr, failingClient, mp, ocrAddress, &configStoreContractAddr)
+ cp, err := newConfigPoller(lggr, failingClient, mp, ocrAddress, &configStoreContractAddr, ld)
require.NoError(t, err)
_, err = cp.LatestConfig(testutils.Context(t), 0)
diff --git a/core/services/relay/evm/evm.go b/core/services/relay/evm/evm.go
index 34d353c48d4..4de4e48bd90 100644
--- a/core/services/relay/evm/evm.go
+++ b/core/services/relay/evm/evm.go
@@ -17,7 +17,6 @@ import (
"github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
"github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median"
"github.com/smartcontractkit/libocr/offchainreporting2/reportingplugin/median/evmreportcodec"
- "github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
"github.com/smartcontractkit/chainlink-common/pkg/services"
@@ -42,6 +41,23 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
)
+var (
+ OCR2AggregatorTransmissionContractABI abi.ABI
+ OCR2AggregatorLogDecoder LogDecoder
+)
+
+func init() {
+ var err error
+ OCR2AggregatorTransmissionContractABI, err = abi.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorMetaData.ABI))
+ if err != nil {
+ panic(err)
+ }
+ OCR2AggregatorLogDecoder, err = newOCR2AggregatorLogDecoder()
+ if err != nil {
+ panic(err)
+ }
+}
+
var _ commontypes.Relayer = &Relayer{} //nolint:staticcheck
type Relayer struct {
@@ -125,6 +141,28 @@ func (r *Relayer) HealthReport() (report map[string]error) {
return
}
+func (r *Relayer) NewPluginProvider(rargs commontypes.RelayArgs, pargs commontypes.PluginArgs) (commontypes.PluginProvider, error) {
+ lggr := r.lggr.Named("PluginProvider").Named(rargs.ExternalJobID.String())
+
+ configWatcher, err := newStandardConfigProvider(r.lggr, r.chain, types.NewRelayOpts(rargs))
+ if err != nil {
+ return nil, err
+ }
+
+ transmitter, err := newOnChainContractTransmitter(r.lggr, rargs, pargs.TransmitterID, r.ks.Eth(), configWatcher, configTransmitterOpts{}, OCR2AggregatorTransmissionContractABI)
+ if err != nil {
+ return nil, err
+ }
+
+ return NewPluginProvider(
+ r.chainReader,
+ r.codec,
+ transmitter,
+ configWatcher,
+ lggr,
+ ), nil
+}
+
func (r *Relayer) NewMercuryProvider(rargs commontypes.RelayArgs, pargs commontypes.PluginArgs) (commontypes.MercuryProvider, error) {
lggr := r.lggr.Named("MercuryProvider").Named(rargs.ExternalJobID.String())
relayOpts := types.NewRelayOpts(rargs)
@@ -146,7 +184,7 @@ func (r *Relayer) NewMercuryProvider(rargs commontypes.RelayArgs, pargs commonty
if relayConfig.ChainID.String() != r.chain.ID().String() {
return nil, fmt.Errorf("internal error: chain id in spec does not match this relayer's chain: have %s expected %s", relayConfig.ChainID.String(), r.chain.ID().String())
}
- cw, err := newConfigProvider(lggr, r.chain, relayOpts)
+ cp, err := newMercuryConfigProvider(lggr, r.chain, relayOpts)
if err != nil {
return nil, pkgerrors.WithStack(err)
}
@@ -182,9 +220,13 @@ func (r *Relayer) NewMercuryProvider(rargs commontypes.RelayArgs, pargs commonty
default:
return nil, fmt.Errorf("invalid feed version %d", feedID.Version())
}
- transmitter := mercury.NewTransmitter(lggr, cw.ContractConfigTracker(), client, privKey.PublicKey, rargs.JobID, *relayConfig.FeedID, r.db, r.pgCfg, transmitterCodec)
+ transmitter := mercury.NewTransmitter(lggr, client, privKey.PublicKey, rargs.JobID, *relayConfig.FeedID, r.db, r.pgCfg, transmitterCodec)
- return NewMercuryProvider(cw, r.chainReader, r.codec, NewMercuryChainReader(r.chain.HeadTracker()), transmitter, reportCodecV1, reportCodecV2, reportCodecV3, lggr), nil
+ return NewMercuryProvider(cp, r.chainReader, r.codec, NewMercuryChainReader(r.chain.HeadTracker()), transmitter, reportCodecV1, reportCodecV2, reportCodecV3, lggr), nil
+}
+
+func (r *Relayer) NewLLOProvider(rargs commontypes.RelayArgs, pargs commontypes.PluginArgs) (commontypes.LLOProvider, error) {
+ return nil, errors.New("not implemented")
}
func (r *Relayer) NewFunctionsProvider(rargs commontypes.RelayArgs, pargs commontypes.PluginArgs) (commontypes.FunctionsProvider, error) {
@@ -193,7 +235,8 @@ func (r *Relayer) NewFunctionsProvider(rargs commontypes.RelayArgs, pargs common
return NewFunctionsProvider(r.chain, rargs, pargs, lggr, r.ks.Eth(), functions.FunctionsPlugin)
}
-func (r *Relayer) NewConfigProvider(args commontypes.RelayArgs) (commontypes.ConfigProvider, error) {
+// NewConfigProvider is called by bootstrap jobs
+func (r *Relayer) NewConfigProvider(args commontypes.RelayArgs) (configProvider commontypes.ConfigProvider, err error) {
lggr := r.lggr.Named("ConfigProvider").Named(args.ExternalJobID.String())
relayOpts := types.NewRelayOpts(args)
relayConfig, err := relayOpts.RelayConfig()
@@ -205,7 +248,24 @@ func (r *Relayer) NewConfigProvider(args commontypes.RelayArgs) (commontypes.Con
return nil, fmt.Errorf("internal error: chain id in spec does not match this relayer's chain: have %s expected %s", relayConfig.ChainID.String(), r.chain.ID().String())
}
- configProvider, err := newConfigProvider(lggr, r.chain, relayOpts)
+ // Handle legacy jobs which did not yet specify provider type and
+ // switched between median/mercury based on presence of feed ID
+ if args.ProviderType == "" {
+ if relayConfig.FeedID == nil {
+ args.ProviderType = "median"
+ } else {
+ args.ProviderType = "mercury"
+ }
+ }
+
+ switch args.ProviderType {
+ case "median":
+ configProvider, err = newStandardConfigProvider(lggr, r.chain, relayOpts)
+ case "mercury":
+ configProvider, err = newMercuryConfigProvider(lggr, r.chain, relayOpts)
+ default:
+ return nil, fmt.Errorf("unrecognized provider type: %q", args.ProviderType)
+ }
if err != nil {
// Never return (*configProvider)(nil)
return nil, err
@@ -235,7 +295,6 @@ type configWatcher struct {
services.StateMachine
lggr logger.Logger
contractAddress common.Address
- contractABI abi.ABI
offchainDigester ocrtypes.OffchainConfigDigester
configPoller types.ConfigPoller
chain legacyevm.Chain
@@ -248,7 +307,6 @@ type configWatcher struct {
func newConfigWatcher(lggr logger.Logger,
contractAddress common.Address,
- contractABI abi.ABI,
offchainDigester ocrtypes.OffchainConfigDigester,
configPoller types.ConfigPoller,
chain legacyevm.Chain,
@@ -259,7 +317,6 @@ func newConfigWatcher(lggr logger.Logger,
return &configWatcher{
lggr: lggr.Named("ConfigWatcher").Named(contractAddress.String()),
contractAddress: contractAddress,
- contractABI: contractABI,
offchainDigester: offchainDigester,
configPoller: configPoller,
chain: chain,
@@ -315,63 +372,12 @@ func (c *configWatcher) ContractConfigTracker() ocrtypes.ContractConfigTracker {
return c.configPoller
}
-func newConfigProvider(lggr logger.Logger, chain legacyevm.Chain, opts *types.RelayOpts) (*configWatcher, error) {
- if !common.IsHexAddress(opts.ContractID) {
- return nil, pkgerrors.Errorf("invalid contractID, expected hex address")
- }
-
- aggregatorAddress := common.HexToAddress(opts.ContractID)
- contractABI, err := abi.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorMetaData.ABI))
- if err != nil {
- return nil, pkgerrors.Wrap(err, "could not get contract ABI JSON")
- }
- var cp types.ConfigPoller
-
- relayConfig, err := opts.RelayConfig()
- if err != nil {
- return nil, fmt.Errorf("failed to get relay config: %w", err)
- }
- if relayConfig.FeedID != nil {
- cp, err = mercury.NewConfigPoller(
- lggr.Named(relayConfig.FeedID.String()),
- chain.LogPoller(),
- aggregatorAddress,
- *relayConfig.FeedID,
- // TODO: Does mercury need to support config contract? DF-19182
- )
- } else {
- cp, err = NewConfigPoller(
- lggr,
- chain.Client(),
- chain.LogPoller(),
- aggregatorAddress,
- relayConfig.ConfigContractAddress,
- )
- }
- if err != nil {
- return nil, err
- }
-
- var offchainConfigDigester ocrtypes.OffchainConfigDigester
- if relayConfig.FeedID != nil {
- // Mercury
- offchainConfigDigester = mercury.NewOffchainConfigDigester(*relayConfig.FeedID, chain.Config().EVM().ChainID(), aggregatorAddress)
- } else {
- // Non-mercury
- offchainConfigDigester = evmutil.EVMOffchainConfigDigester{
- ChainID: chain.Config().EVM().ChainID().Uint64(),
- ContractAddress: aggregatorAddress,
- }
- }
- return newConfigWatcher(lggr, aggregatorAddress, contractABI, offchainConfigDigester, cp, chain, relayConfig.FromBlock, opts.New), nil
-}
-
type configTransmitterOpts struct {
// override the gas limit default provided in the config watcher
pluginGasLimit *uint32
}
-func newContractTransmitter(lggr logger.Logger, rargs commontypes.RelayArgs, transmitterID string, ethKeystore keystore.Eth, configWatcher *configWatcher, opts configTransmitterOpts) (*contractTransmitter, error) {
+func newOnChainContractTransmitter(lggr logger.Logger, rargs commontypes.RelayArgs, transmitterID string, ethKeystore keystore.Eth, configWatcher *configWatcher, opts configTransmitterOpts, transmissionContractABI abi.ABI) (*contractTransmitter, error) {
var relayConfig types.RelayConfig
if err := json.Unmarshal(rargs.RelayConfig, &relayConfig); err != nil {
return nil, err
@@ -435,7 +441,7 @@ func newContractTransmitter(lggr logger.Logger, rargs commontypes.RelayArgs, tra
return NewOCRContractTransmitter(
configWatcher.contractAddress,
configWatcher.chain.Client(),
- configWatcher.contractABI,
+ transmissionContractABI,
transmitter,
configWatcher.chain.LogPoller(),
lggr,
@@ -459,13 +465,13 @@ func (r *Relayer) NewMedianProvider(rargs commontypes.RelayArgs, pargs commontyp
}
contractID := common.HexToAddress(relayOpts.ContractID)
- configWatcher, err := newConfigProvider(lggr, r.chain, relayOpts)
+ configWatcher, err := newStandardConfigProvider(lggr, r.chain, relayOpts)
if err != nil {
return nil, err
}
reportCodec := evmreportcodec.ReportCodec{}
- contractTransmitter, err := newContractTransmitter(lggr, rargs, pargs.TransmitterID, r.ks.Eth(), configWatcher, configTransmitterOpts{})
+ contractTransmitter, err := newOnChainContractTransmitter(lggr, rargs, pargs.TransmitterID, r.ks.Eth(), configWatcher, configTransmitterOpts{}, OCR2AggregatorTransmissionContractABI)
if err != nil {
return nil, err
}
diff --git a/core/services/relay/evm/functions.go b/core/services/relay/evm/functions.go
index b957ab56f3b..d4e91034496 100644
--- a/core/services/relay/evm/functions.go
+++ b/core/services/relay/evm/functions.go
@@ -4,14 +4,10 @@ import (
"context"
"encoding/json"
"fmt"
- "strings"
- "github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
- "github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
-
"go.uber.org/multierr"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
@@ -145,10 +141,6 @@ func newFunctionsConfigProvider(pluginType functionsRelay.FunctionsPluginType, c
}
routerContractAddress := common.HexToAddress(args.ContractID)
- contractABI, err := abi.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorMetaData.ABI))
- if err != nil {
- return nil, errors.Wrap(err, "could not get contract ABI JSON")
- }
cp, err := functionsRelay.NewFunctionsConfigPoller(pluginType, chain.LogPoller(), lggr)
if err != nil {
@@ -159,7 +151,7 @@ func newFunctionsConfigProvider(pluginType functionsRelay.FunctionsPluginType, c
offchainConfigDigester := functionsRelay.NewFunctionsOffchainConfigDigester(pluginType, chain.ID().Uint64())
logPollerWrapper.SubscribeToUpdates("FunctionsOffchainConfigDigester", offchainConfigDigester)
- return newConfigWatcher(lggr, routerContractAddress, contractABI, offchainConfigDigester, cp, chain, fromBlock, args.New), nil
+ return newConfigWatcher(lggr, routerContractAddress, offchainConfigDigester, cp, chain, fromBlock, args.New), nil
}
func newFunctionsContractTransmitter(contractVersion uint32, rargs commontypes.RelayArgs, transmitterID string, configWatcher *configWatcher, ethKeystore keystore.Eth, logPollerWrapper evmRelayTypes.LogPollerWrapper, lggr logger.Logger) (ContractTransmitter, error) {
@@ -222,7 +214,7 @@ func newFunctionsContractTransmitter(contractVersion uint32, rargs commontypes.R
functionsTransmitter, err := functionsRelay.NewFunctionsContractTransmitter(
configWatcher.chain.Client(),
- configWatcher.contractABI,
+ OCR2AggregatorTransmissionContractABI,
transmitter,
configWatcher.chain.LogPoller(),
lggr,
diff --git a/core/services/relay/evm/functions/contract_transmitter.go b/core/services/relay/evm/functions/contract_transmitter.go
index 2a62db31a8c..78a5ff39bb7 100644
--- a/core/services/relay/evm/functions/contract_transmitter.go
+++ b/core/services/relay/evm/functions/contract_transmitter.go
@@ -125,7 +125,8 @@ func (oc *contractTransmitter) Transmit(ctx context.Context, reportCtx ocrtypes.
}
var destinationContract common.Address
- if oc.contractVersion == 1 {
+ switch oc.contractVersion {
+ case 1:
oc.lggr.Debugw("FunctionsContractTransmitter: start", "reportLenBytes", len(report))
requests, err2 := oc.reportCodec.DecodeReport(report)
if err2 != nil {
@@ -152,7 +153,7 @@ func (oc *contractTransmitter) Transmit(ctx context.Context, reportCtx ocrtypes.
}
}
oc.lggr.Debugw("FunctionsContractTransmitter: ready", "nRequests", len(requests), "coordinatorContract", destinationContract.Hex())
- } else {
+ default:
return fmt.Errorf("unsupported contract version: %d", oc.contractVersion)
}
payload, err := oc.contractABI.Pack("transmit", rawReportCtx, []byte(report), rs, ss, vs)
diff --git a/core/services/relay/evm/functions/logpoller_wrapper.go b/core/services/relay/evm/functions/logpoller_wrapper.go
index e76b567b42b..f11b6bee1e0 100644
--- a/core/services/relay/evm/functions/logpoller_wrapper.go
+++ b/core/services/relay/evm/functions/logpoller_wrapper.go
@@ -304,12 +304,11 @@ func (l *logPollerWrapper) filterPreviouslyDetectedEvents(logs []logpoller.Log,
expiredRequests := 0
for _, detectedEvent := range detectedEvents.detectedEventsOrdered {
expirationTime := time.Now().Add(-time.Second * time.Duration(l.logPollerCacheDurationSec))
- if detectedEvent.timeDetected.Before(expirationTime) {
- delete(detectedEvents.isPreviouslyDetected, detectedEvent.requestId)
- expiredRequests++
- } else {
+ if !detectedEvent.timeDetected.Before(expirationTime) {
break
}
+ delete(detectedEvents.isPreviouslyDetected, detectedEvent.requestId)
+ expiredRequests++
}
detectedEvents.detectedEventsOrdered = detectedEvents.detectedEventsOrdered[expiredRequests:]
l.lggr.Debugw("filterPreviouslyDetectedEvents: done", "filterType", filterType, "nLogs", len(logs), "nFilteredLogs", len(filteredLogs), "nExpiredRequests", expiredRequests, "previouslyDetectedCacheSize", len(detectedEvents.detectedEventsOrdered))
@@ -321,7 +320,7 @@ func (l *logPollerWrapper) SubscribeToUpdates(subscriberName string, subscriber
if l.pluginConfig.ContractVersion == 0 {
// in V0, immediately set contract address to Oracle contract and never update again
if err := subscriber.UpdateRoutes(l.routerContract.Address(), l.routerContract.Address()); err != nil {
- l.lggr.Errorw("LogPollerWrapper: Failed to update routes", "subscriberName", subscriberName, "error", err)
+ l.lggr.Errorw("LogPollerWrapper: Failed to update routes", "subscriberName", subscriberName, "err", err)
}
} else if l.pluginConfig.ContractVersion == 1 {
l.mu.Lock()
@@ -416,7 +415,7 @@ func (l *logPollerWrapper) handleRouteUpdate(activeCoordinator common.Address, p
for _, subscriber := range l.subscribers {
err := subscriber.UpdateRoutes(activeCoordinator, proposedCoordinator)
if err != nil {
- l.lggr.Errorw("LogPollerWrapper: Failed to update routes", "error", err)
+ l.lggr.Errorw("LogPollerWrapper: Failed to update routes", "err", err)
}
}
}
diff --git a/core/services/relay/evm/mercury/offchain_config_digester.go b/core/services/relay/evm/mercury/offchain_config_digester.go
index a12198738a9..f9ba0b23095 100644
--- a/core/services/relay/evm/mercury/offchain_config_digester.go
+++ b/core/services/relay/evm/mercury/offchain_config_digester.go
@@ -7,6 +7,7 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/pkg/errors"
+
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
"github.com/smartcontractkit/wsrpc/credentials"
diff --git a/core/services/relay/evm/mercury/transmitter.go b/core/services/relay/evm/mercury/transmitter.go
index 40a51b9d92d..9444b904b89 100644
--- a/core/services/relay/evm/mercury/transmitter.go
+++ b/core/services/relay/evm/mercury/transmitter.go
@@ -11,6 +11,7 @@ import (
"time"
"github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/common/hexutil"
"github.com/jpillora/backoff"
pkgerrors "github.com/pkg/errors"
"github.com/prometheus/client_golang/prometheus"
@@ -107,7 +108,6 @@ type mercuryTransmitter struct {
services.StateMachine
lggr logger.Logger
rpcClient wsrpc.Client
- cfgTracker ConfigTracker
persistenceManager *PersistenceManager
codec TransmitterReportDecoder
@@ -148,14 +148,13 @@ func getPayloadTypes() abi.Arguments {
})
}
-func NewTransmitter(lggr logger.Logger, cfgTracker ConfigTracker, rpcClient wsrpc.Client, fromAccount ed25519.PublicKey, jobID int32, feedID [32]byte, db *sqlx.DB, cfg pg.QConfig, codec TransmitterReportDecoder) *mercuryTransmitter {
+func NewTransmitter(lggr logger.Logger, rpcClient wsrpc.Client, fromAccount ed25519.PublicKey, jobID int32, feedID [32]byte, db *sqlx.DB, cfg pg.QConfig, codec TransmitterReportDecoder) *mercuryTransmitter {
feedIDHex := fmt.Sprintf("0x%x", feedID[:])
persistenceManager := NewPersistenceManager(lggr, NewORM(db, lggr, cfg), jobID, maxTransmitQueueSize, flushDeletesFrequency, pruneFrequency)
return &mercuryTransmitter{
services.StateMachine{},
lggr.Named("MercuryTransmitter").With("feedID", feedIDHex),
rpcClient,
- cfgTracker,
persistenceManager,
codec,
feedID,
@@ -241,7 +240,7 @@ func (mt *mercuryTransmitter) runDeleteQueueLoop() {
case req := <-mt.deleteQueue:
for {
if err := mt.persistenceManager.Delete(runloopCtx, req); err != nil {
- mt.lggr.Errorw("Failed to delete transmit request record", "error", err, "req", req)
+ mt.lggr.Errorw("Failed to delete transmit request record", "err", err, "req.Payload", req.Payload)
mt.transmitQueueDeleteErrorCount.Inc()
select {
case <-time.After(b.Duration()):
@@ -308,7 +307,7 @@ func (mt *mercuryTransmitter) runQueueLoop() {
b.Reset()
if res.Error == "" {
mt.transmitSuccessCount.Inc()
- mt.lggr.Tracew("Transmit report success", "req", t.Req, "response", res, "reportCtx", t.ReportCtx)
+ mt.lggr.Debugw("Transmit report success", "payload", hexutil.Encode(t.Req.Payload), "response", res, "reportCtx", t.ReportCtx)
} else {
// We don't need to retry here because the mercury server
// has confirmed it received the report. We only need to retry
@@ -317,7 +316,7 @@ func (mt *mercuryTransmitter) runQueueLoop() {
case DuplicateReport:
mt.transmitSuccessCount.Inc()
mt.transmitDuplicateCount.Inc()
- mt.lggr.Tracew("Transmit report succeeded; duplicate report", "code", res.Code)
+ mt.lggr.Debugw("Transmit report success; duplicate report", "payload", hexutil.Encode(t.Req.Payload), "response", res, "reportCtx", t.ReportCtx)
default:
transmitServerErrorCount.WithLabelValues(mt.feedID.String(), fmt.Sprintf("%d", res.Code)).Inc()
mt.lggr.Errorw("Transmit report failed; mercury server returned error", "response", res, "reportCtx", t.ReportCtx, "err", res.Error, "code", res.Code)
@@ -357,7 +356,7 @@ func (mt *mercuryTransmitter) Transmit(ctx context.Context, reportCtx ocrtypes.R
Payload: payload,
}
- mt.lggr.Tracew("Transmit enqueue", "req", req, "report", report, "reportCtx", reportCtx, "signatures", signatures)
+ mt.lggr.Tracew("Transmit enqueue", "req.Payload", req.Payload, "report", report, "reportCtx", reportCtx, "signatures", signatures)
if err := mt.persistenceManager.Insert(ctx, req, reportCtx); err != nil {
mt.transmitQueueInsertErrorCount.Inc()
diff --git a/core/services/relay/evm/mercury/transmitter_test.go b/core/services/relay/evm/mercury/transmitter_test.go
index c8a68d41a16..188beff5113 100644
--- a/core/services/relay/evm/mercury/transmitter_test.go
+++ b/core/services/relay/evm/mercury/transmitter_test.go
@@ -27,6 +27,7 @@ func Test_MercuryTransmitter_Transmit(t *testing.T) {
pgtest.MustExec(t, db, `SET CONSTRAINTS mercury_transmit_requests_job_id_fkey DEFERRED`)
pgtest.MustExec(t, db, `SET CONSTRAINTS feed_latest_reports_job_id_fkey DEFERRED`)
q := NewTransmitQueue(lggr, "", 0, nil, nil)
+ codec := new(mockCodec)
t.Run("v1 report transmission successfully enqueued", func(t *testing.T) {
report := sampleV1Report
@@ -40,7 +41,7 @@ func Test_MercuryTransmitter_Transmit(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
mt.queue = q
err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs)
@@ -58,7 +59,7 @@ func Test_MercuryTransmitter_Transmit(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
mt.queue = q
err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs)
@@ -76,7 +77,7 @@ func Test_MercuryTransmitter_Transmit(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
mt.queue = q
err := mt.Transmit(testutils.Context(t), sampleReportContext, report, sampleSigs)
@@ -88,6 +89,8 @@ func Test_MercuryTransmitter_LatestTimestamp(t *testing.T) {
t.Parallel()
lggr := logger.TestLogger(t)
db := pgtest.NewSqlxDB(t)
+ var jobID int32
+ codec := new(mockCodec)
t.Run("successful query", func(t *testing.T) {
c := mocks.MockWSRPCClient{
@@ -101,7 +104,7 @@ func Test_MercuryTransmitter_LatestTimestamp(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
ts, err := mt.LatestTimestamp(testutils.Context(t))
require.NoError(t, err)
@@ -116,7 +119,7 @@ func Test_MercuryTransmitter_LatestTimestamp(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
ts, err := mt.LatestTimestamp(testutils.Context(t))
require.NoError(t, err)
@@ -129,7 +132,7 @@ func Test_MercuryTransmitter_LatestTimestamp(t *testing.T) {
return nil, errors.New("something exploded")
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
_, err := mt.LatestTimestamp(testutils.Context(t))
require.Error(t, err)
assert.Contains(t, err.Error(), "something exploded")
@@ -151,6 +154,7 @@ func Test_MercuryTransmitter_LatestPrice(t *testing.T) {
t.Parallel()
lggr := logger.TestLogger(t)
db := pgtest.NewSqlxDB(t)
+ var jobID int32
codec := new(mockCodec)
@@ -167,7 +171,7 @@ func Test_MercuryTransmitter_LatestPrice(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), codec)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
t.Run("BenchmarkPriceFromReport succeeds", func(t *testing.T) {
codec.val = originalPrice
@@ -197,7 +201,7 @@ func Test_MercuryTransmitter_LatestPrice(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
price, err := mt.LatestPrice(testutils.Context(t), sampleFeedID)
require.NoError(t, err)
@@ -210,7 +214,7 @@ func Test_MercuryTransmitter_LatestPrice(t *testing.T) {
return nil, errors.New("something exploded")
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
_, err := mt.LatestPrice(testutils.Context(t), sampleFeedID)
require.Error(t, err)
assert.Contains(t, err.Error(), "something exploded")
@@ -222,6 +226,8 @@ func Test_MercuryTransmitter_FetchInitialMaxFinalizedBlockNumber(t *testing.T) {
lggr := logger.TestLogger(t)
db := pgtest.NewSqlxDB(t)
+ var jobID int32
+ codec := new(mockCodec)
t.Run("successful query", func(t *testing.T) {
c := mocks.MockWSRPCClient{
@@ -235,7 +241,7 @@ func Test_MercuryTransmitter_FetchInitialMaxFinalizedBlockNumber(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
bn, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t))
require.NoError(t, err)
@@ -250,7 +256,7 @@ func Test_MercuryTransmitter_FetchInitialMaxFinalizedBlockNumber(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, jobID, sampleFeedID, db, pgtest.NewQConfig(true), codec)
bn, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t))
require.NoError(t, err)
@@ -262,7 +268,7 @@ func Test_MercuryTransmitter_FetchInitialMaxFinalizedBlockNumber(t *testing.T) {
return nil, errors.New("something exploded")
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), codec)
_, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t))
require.Error(t, err)
assert.Contains(t, err.Error(), "something exploded")
@@ -279,7 +285,7 @@ func Test_MercuryTransmitter_FetchInitialMaxFinalizedBlockNumber(t *testing.T) {
return out, nil
},
}
- mt := NewTransmitter(lggr, nil, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), nil)
+ mt := NewTransmitter(lggr, c, sampleClientPubKey, 0, sampleFeedID, db, pgtest.NewQConfig(true), codec)
_, err := mt.FetchInitialMaxFinalizedBlockNumber(testutils.Context(t))
require.Error(t, err)
assert.Contains(t, err.Error(), "latestReport failed; mismatched feed IDs, expected: 0x1c916b4aa7e57ca7b68ae1bf45653f56b656fd3aa335ef7fae696b663f1b8472, got: 0x")
diff --git a/core/services/relay/evm/mercury/v1/data_source.go b/core/services/relay/evm/mercury/v1/data_source.go
index ce48ec6cf94..7f41bd1e36c 100644
--- a/core/services/relay/evm/mercury/v1/data_source.go
+++ b/core/services/relay/evm/mercury/v1/data_source.go
@@ -295,7 +295,7 @@ func (ds *datasource) setLatestBlocks(ctx context.Context, obs *v1types.Observat
latestBlocks, err := ds.mercuryChainReader.LatestHeads(ctx, nBlocksObservation)
if err != nil {
- ds.lggr.Errorw("failed to read latest blocks", "error", err)
+ ds.lggr.Errorw("failed to read latest blocks", "err", err)
return err
}
diff --git a/core/services/relay/evm/mercury/wsrpc/client.go b/core/services/relay/evm/mercury/wsrpc/client.go
index c9533717757..d420a17a1a4 100644
--- a/core/services/relay/evm/mercury/wsrpc/client.go
+++ b/core/services/relay/evm/mercury/wsrpc/client.go
@@ -193,16 +193,16 @@ func (w *client) resetTransport() {
b := utils.NewRedialBackoff()
for {
// Will block until successful dial, or context is canceled (i.e. on close)
- if err := w.dial(ctx, wsrpc.WithBlock()); err != nil {
- if ctx.Err() != nil {
- w.logger.Debugw("ResetTransport exiting due to client Close", "err", err)
- return
- }
- w.logger.Errorw("ResetTransport failed to redial", "err", err)
- time.Sleep(b.Duration())
- } else {
+ err := w.dial(ctx, wsrpc.WithBlock())
+ if err == nil {
break
}
+ if ctx.Err() != nil {
+ w.logger.Debugw("ResetTransport exiting due to client Close", "err", err)
+ return
+ }
+ w.logger.Errorw("ResetTransport failed to redial", "err", err)
+ time.Sleep(b.Duration())
}
w.logger.Info("ResetTransport successfully redialled")
}
diff --git a/core/services/relay/evm/mercury/wsrpc/pb/generate.go b/core/services/relay/evm/mercury/wsrpc/pb/generate.go
new file mode 100644
index 00000000000..2bb95012d1c
--- /dev/null
+++ b/core/services/relay/evm/mercury/wsrpc/pb/generate.go
@@ -0,0 +1,2 @@
+//go:generate protoc --go_out=. --go_opt=paths=source_relative --go-wsrpc_out=. --go-wsrpc_opt=paths=source_relative mercury.proto
+package pb
diff --git a/core/services/relay/evm/mercury/wsrpc/pb/mercury.pb.go b/core/services/relay/evm/mercury/wsrpc/pb/mercury.pb.go
index 4ffe41860e6..ce4125bd579 100644
--- a/core/services/relay/evm/mercury/wsrpc/pb/mercury.pb.go
+++ b/core/services/relay/evm/mercury/wsrpc/pb/mercury.pb.go
@@ -1,7 +1,7 @@
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
-// protoc-gen-go v1.30.0
-// protoc v3.21.12
+// protoc-gen-go v1.32.0
+// protoc v4.25.1
// source: mercury.proto
package pb
@@ -25,7 +25,8 @@ type TransmitRequest struct {
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
- Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
+ Payload []byte `protobuf:"bytes,1,opt,name=payload,proto3" json:"payload,omitempty"`
+ ReportFormat string `protobuf:"bytes,2,opt,name=reportFormat,proto3" json:"reportFormat,omitempty"`
}
func (x *TransmitRequest) Reset() {
@@ -67,6 +68,13 @@ func (x *TransmitRequest) GetPayload() []byte {
return nil
}
+func (x *TransmitRequest) GetReportFormat() string {
+ if x != nil {
+ return x.ReportFormat
+ }
+ return ""
+}
+
type TransmitResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
@@ -442,73 +450,76 @@ var File_mercury_proto protoreflect.FileDescriptor
var file_mercury_proto_rawDesc = []byte{
0x0a, 0x0d, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12,
- 0x02, 0x70, 0x62, 0x22, 0x2b, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x52,
+ 0x02, 0x70, 0x62, 0x22, 0x4f, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61,
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64,
- 0x22, 0x3c, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70,
- 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01,
- 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f,
- 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2d,
- 0x0a, 0x13, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65,
- 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x18,
- 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x22, 0x50, 0x0a,
- 0x14, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73,
- 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x22, 0x0a, 0x06, 0x72,
- 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62,
- 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x22,
- 0xa1, 0x04, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x65,
- 0x65, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x65, 0x65, 0x64,
- 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
- 0x0c, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c,
- 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f,
- 0x61, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42,
- 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03,
- 0x52, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
- 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
- 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01,
- 0x28, 0x03, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b,
- 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
- 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c,
- 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61,
- 0x73, 0x68, 0x12, 0x34, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f,
- 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28,
- 0x04, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54,
- 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x15, 0x6f, 0x62, 0x73, 0x65,
- 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d,
- 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61,
- 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x22,
- 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x09,
- 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x69, 0x67, 0x65,
- 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28,
- 0x0d, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x6e,
- 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x22,
- 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0c,
- 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61,
- 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x74, 0x69,
- 0x6e, 0x67, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0c,
- 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4f, 0x70,
- 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x64, 0x41, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x54,
- 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
- 0x64, 0x41, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
- 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28,
- 0x03, 0x52, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61,
- 0x6e, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e, 0x61, 0x6e, 0x6f, 0x73,
- 0x32, 0x83, 0x01, 0x0a, 0x07, 0x4d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x79, 0x12, 0x35, 0x0a, 0x08,
- 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x12, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72,
- 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e,
- 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f,
- 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70,
- 0x6f, 0x72, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52,
- 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x70,
- 0x62, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65,
- 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62,
- 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61,
- 0x63, 0x74, 0x6b, 0x69, 0x74, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x2f,
- 0x76, 0x32, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x72, 0x65, 0x6c, 0x61,
- 0x79, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x79, 0x2f, 0x77, 0x73,
- 0x72, 0x70, 0x63, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+ 0x12, 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74,
+ 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f,
+ 0x72, 0x6d, 0x61, 0x74, 0x22, 0x3c, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65,
+ 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05,
+ 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x22, 0x2d, 0x0a, 0x13, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f,
+ 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x65, 0x65,
+ 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49,
+ 0x64, 0x22, 0x50, 0x0a, 0x14, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72,
+ 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72,
+ 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12,
+ 0x22, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
+ 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x72, 0x65, 0x70,
+ 0x6f, 0x72, 0x74, 0x22, 0xa1, 0x04, 0x0a, 0x06, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16,
+ 0x0a, 0x06, 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06,
+ 0x66, 0x65, 0x65, 0x64, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18,
+ 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x18, 0x0a, 0x07,
+ 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70,
+ 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x32, 0x0a, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46,
+ 0x72, 0x6f, 0x6d, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x04,
+ 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x42,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x12, 0x63, 0x75,
+ 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72,
+ 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42,
+ 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x63, 0x75,
+ 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x18, 0x06,
+ 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c, 0x6f,
+ 0x63, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x34, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e,
+ 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18,
+ 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x6c,
+ 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x15,
+ 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x6d, 0x65,
+ 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6f, 0x62, 0x73,
+ 0x65, 0x72, 0x76, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
+ 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x44, 0x69, 0x67, 0x65,
+ 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67,
+ 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18,
+ 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05,
+ 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x72, 0x6f, 0x75,
+ 0x6e, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61,
+ 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74,
+ 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d,
+ 0x69, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x0d,
+ 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x74, 0x69,
+ 0x6e, 0x67, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x09, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e,
+ 0x70, 0x62, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x54, 0x69, 0x6d, 0x65, 0x73,
+ 0x74, 0x61, 0x6d, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18,
+ 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14,
+ 0x0a, 0x05, 0x6e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6e,
+ 0x61, 0x6e, 0x6f, 0x73, 0x32, 0x83, 0x01, 0x0a, 0x07, 0x4d, 0x65, 0x72, 0x63, 0x75, 0x72, 0x79,
+ 0x12, 0x35, 0x0a, 0x08, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x12, 0x13, 0x2e, 0x70,
+ 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
+ 0x74, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x52,
+ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x4c, 0x61, 0x74, 0x65, 0x73,
+ 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x61, 0x74,
+ 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
+ 0x1a, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x70, 0x6f,
+ 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x4e, 0x5a, 0x4c, 0x67, 0x69,
+ 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x6d, 0x61, 0x72, 0x74, 0x63, 0x6f,
+ 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x6b, 0x69, 0x74, 0x2f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x6c,
+ 0x69, 0x6e, 0x6b, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f,
+ 0x72, 0x65, 0x6c, 0x61, 0x79, 0x2f, 0x65, 0x76, 0x6d, 0x2f, 0x6d, 0x65, 0x72, 0x63, 0x75, 0x72,
+ 0x79, 0x2f, 0x77, 0x73, 0x72, 0x70, 0x63, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
+ 0x6f, 0x33,
}
var (
diff --git a/core/services/relay/evm/mercury/wsrpc/pb/mercury.proto b/core/services/relay/evm/mercury/wsrpc/pb/mercury.proto
index 6e5e49724cd..184b0572046 100644
--- a/core/services/relay/evm/mercury/wsrpc/pb/mercury.proto
+++ b/core/services/relay/evm/mercury/wsrpc/pb/mercury.proto
@@ -10,7 +10,8 @@ service Mercury {
}
message TransmitRequest {
- bytes payload = 1;
+ bytes payload = 1;
+ string reportFormat = 2;
}
message TransmitResponse {
diff --git a/core/services/relay/evm/mercury/wsrpc/pb/mercury_wsrpc.pb.go b/core/services/relay/evm/mercury/wsrpc/pb/mercury_wsrpc.pb.go
index eaf42c8568f..0c31a1d7ac9 100644
--- a/core/services/relay/evm/mercury/wsrpc/pb/mercury_wsrpc.pb.go
+++ b/core/services/relay/evm/mercury/wsrpc/pb/mercury_wsrpc.pb.go
@@ -1,17 +1,17 @@
// Code generated by protoc-gen-go-wsrpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-wsrpc v0.0.1
-// - protoc v3.21.12
+// - protoc v4.25.1
package pb
import (
context "context"
-
wsrpc "github.com/smartcontractkit/wsrpc"
)
// MercuryClient is the client API for Mercury service.
+//
type MercuryClient interface {
Transmit(ctx context.Context, in *TransmitRequest) (*TransmitResponse, error)
LatestReport(ctx context.Context, in *LatestReportRequest) (*LatestReportResponse, error)
diff --git a/core/services/relay/evm/mercury_config_provider.go b/core/services/relay/evm/mercury_config_provider.go
new file mode 100644
index 00000000000..027a3cfb27c
--- /dev/null
+++ b/core/services/relay/evm/mercury_config_provider.go
@@ -0,0 +1,44 @@
+package evm
+
+import (
+ "errors"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/common"
+
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+
+ "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
+)
+
+func newMercuryConfigProvider(lggr logger.Logger, chain legacyevm.Chain, opts *types.RelayOpts) (commontypes.ConfigProvider, error) {
+ if !common.IsHexAddress(opts.ContractID) {
+ return nil, errors.New("invalid contractID, expected hex address")
+ }
+
+ aggregatorAddress := common.HexToAddress(opts.ContractID)
+
+ relayConfig, err := opts.RelayConfig()
+ if err != nil {
+ return nil, fmt.Errorf("failed to get relay config: %w", err)
+ }
+ if relayConfig.FeedID == nil {
+ return nil, errors.New("feed ID is required for tracking config on mercury contracts")
+ }
+ cp, err := mercury.NewConfigPoller(
+ lggr.Named(relayConfig.FeedID.String()),
+ chain.LogPoller(),
+ aggregatorAddress,
+ *relayConfig.FeedID,
+ // TODO: Does mercury need to support config contract? DF-19182
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ offchainConfigDigester := mercury.NewOffchainConfigDigester(*relayConfig.FeedID, chain.Config().EVM().ChainID(), aggregatorAddress)
+ return newConfigWatcher(lggr, aggregatorAddress, offchainConfigDigester, cp, chain, relayConfig.FromBlock, opts.New), nil
+}
diff --git a/core/services/relay/evm/mercury_provider.go b/core/services/relay/evm/mercury_provider.go
index d9858ac64c3..9159a13590e 100644
--- a/core/services/relay/evm/mercury_provider.go
+++ b/core/services/relay/evm/mercury_provider.go
@@ -23,7 +23,7 @@ import (
var _ commontypes.MercuryProvider = (*mercuryProvider)(nil)
type mercuryProvider struct {
- configWatcher *configWatcher
+ cp commontypes.ConfigProvider
chainReader commontypes.ChainReader
codec commontypes.Codec
transmitter evmmercury.Transmitter
@@ -36,7 +36,7 @@ type mercuryProvider struct {
}
func NewMercuryProvider(
- configWatcher *configWatcher,
+ cp commontypes.ConfigProvider,
chainReader commontypes.ChainReader,
codec commontypes.Codec,
mercuryChainReader mercurytypes.ChainReader,
@@ -47,7 +47,7 @@ func NewMercuryProvider(
lggr logger.Logger,
) *mercuryProvider {
return &mercuryProvider{
- configWatcher,
+ cp,
chainReader,
codec,
transmitter,
@@ -61,7 +61,7 @@ func NewMercuryProvider(
}
func (p *mercuryProvider) Start(ctx context.Context) error {
- return p.ms.Start(ctx, p.configWatcher, p.transmitter)
+ return p.ms.Start(ctx, p.cp, p.transmitter)
}
func (p *mercuryProvider) Close() error {
@@ -69,7 +69,7 @@ func (p *mercuryProvider) Close() error {
}
func (p *mercuryProvider) Ready() error {
- return errors.Join(p.configWatcher.Ready(), p.transmitter.Ready())
+ return errors.Join(p.cp.Ready(), p.transmitter.Ready())
}
func (p *mercuryProvider) Name() string {
@@ -78,7 +78,7 @@ func (p *mercuryProvider) Name() string {
func (p *mercuryProvider) HealthReport() map[string]error {
report := map[string]error{}
- services.CopyHealth(report, p.configWatcher.HealthReport())
+ services.CopyHealth(report, p.cp.HealthReport())
services.CopyHealth(report, p.transmitter.HealthReport())
return report
}
@@ -92,11 +92,11 @@ func (p *mercuryProvider) Codec() commontypes.Codec {
}
func (p *mercuryProvider) ContractConfigTracker() ocrtypes.ContractConfigTracker {
- return p.configWatcher.ContractConfigTracker()
+ return p.cp.ContractConfigTracker()
}
func (p *mercuryProvider) OffchainConfigDigester() ocrtypes.OffchainConfigDigester {
- return p.configWatcher.OffchainConfigDigester()
+ return p.cp.OffchainConfigDigester()
}
func (p *mercuryProvider) OnchainConfigCodec() mercurytypes.OnchainConfigCodec {
diff --git a/core/services/relay/evm/mocks/loop_relay_adapter.go b/core/services/relay/evm/mocks/loop_relay_adapter.go
index 5b927f1b8ac..5e7335af06d 100644
--- a/core/services/relay/evm/mocks/loop_relay_adapter.go
+++ b/core/services/relay/evm/mocks/loop_relay_adapter.go
@@ -196,6 +196,36 @@ func (_m *LoopRelayAdapter) NewConfigProvider(_a0 context.Context, _a1 types.Rel
return r0, r1
}
+// NewLLOProvider provides a mock function with given fields: _a0, _a1, _a2
+func (_m *LoopRelayAdapter) NewLLOProvider(_a0 context.Context, _a1 types.RelayArgs, _a2 types.PluginArgs) (types.LLOProvider, error) {
+ ret := _m.Called(_a0, _a1, _a2)
+
+ if len(ret) == 0 {
+ panic("no return value specified for NewLLOProvider")
+ }
+
+ var r0 types.LLOProvider
+ var r1 error
+ if rf, ok := ret.Get(0).(func(context.Context, types.RelayArgs, types.PluginArgs) (types.LLOProvider, error)); ok {
+ return rf(_a0, _a1, _a2)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, types.RelayArgs, types.PluginArgs) types.LLOProvider); ok {
+ r0 = rf(_a0, _a1, _a2)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(types.LLOProvider)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, types.RelayArgs, types.PluginArgs) error); ok {
+ r1 = rf(_a0, _a1, _a2)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
// NewPluginProvider provides a mock function with given fields: _a0, _a1, _a2
func (_m *LoopRelayAdapter) NewPluginProvider(_a0 context.Context, _a1 types.RelayArgs, _a2 types.PluginArgs) (types.PluginProvider, error) {
ret := _m.Called(_a0, _a1, _a2)
diff --git a/core/services/relay/evm/ocr2aggregator_decoder.go b/core/services/relay/evm/ocr2aggregator_decoder.go
new file mode 100644
index 00000000000..92abfad1896
--- /dev/null
+++ b/core/services/relay/evm/ocr2aggregator_decoder.go
@@ -0,0 +1,65 @@
+package evm
+
+import (
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/accounts/abi"
+ "github.com/ethereum/go-ethereum/common"
+
+ "github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
+ ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+)
+
+var _ LogDecoder = &ocr2AggregatorLogDecoder{}
+
+type ocr2AggregatorLogDecoder struct {
+ eventName string
+ eventSig common.Hash
+ abi *abi.ABI
+}
+
+func newOCR2AggregatorLogDecoder() (*ocr2AggregatorLogDecoder, error) {
+ const eventName = "ConfigSet"
+ abi, err := ocr2aggregator.OCR2AggregatorMetaData.GetAbi()
+ if err != nil {
+ return nil, err
+ }
+ return &ocr2AggregatorLogDecoder{
+ eventName: eventName,
+ eventSig: abi.Events[eventName].ID,
+ abi: abi,
+ }, nil
+}
+
+func (d *ocr2AggregatorLogDecoder) Decode(rawLog []byte) (ocrtypes.ContractConfig, error) {
+ unpacked := new(ocr2aggregator.OCR2AggregatorConfigSet)
+ err := d.abi.UnpackIntoInterface(unpacked, d.eventName, rawLog)
+ if err != nil {
+ return ocrtypes.ContractConfig{}, fmt.Errorf("failed to unpack log data: %w", err)
+ }
+
+ var transmitAccounts []ocrtypes.Account
+ for _, addr := range unpacked.Transmitters {
+ transmitAccounts = append(transmitAccounts, ocrtypes.Account(addr.Hex()))
+ }
+ var signers []ocrtypes.OnchainPublicKey
+ for _, addr := range unpacked.Signers {
+ addr := addr
+ signers = append(signers, addr[:])
+ }
+
+ return ocrtypes.ContractConfig{
+ ConfigDigest: unpacked.ConfigDigest,
+ ConfigCount: unpacked.ConfigCount,
+ Signers: signers,
+ Transmitters: transmitAccounts,
+ F: unpacked.F,
+ OnchainConfig: unpacked.OnchainConfig,
+ OffchainConfigVersion: unpacked.OffchainConfigVersion,
+ OffchainConfig: unpacked.OffchainConfig,
+ }, nil
+}
+
+func (d *ocr2AggregatorLogDecoder) EventSig() common.Hash {
+ return d.eventSig
+}
diff --git a/core/services/relay/evm/ocr2keeper.go b/core/services/relay/evm/ocr2keeper.go
index fd1fdb70480..6bde444d80b 100644
--- a/core/services/relay/evm/ocr2keeper.go
+++ b/core/services/relay/evm/ocr2keeper.go
@@ -4,36 +4,30 @@ import (
"context"
"encoding/json"
"fmt"
- "strings"
- iregistry21 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_keeper_registry_master_wrapper_2_1"
- "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
- evm "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding"
- "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/transmit"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate"
- "github.com/smartcontractkit/chainlink/v2/core/services/pg"
-
- "github.com/smartcontractkit/chainlink-common/pkg/types/automation"
-
- "github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/jmoiron/sqlx"
"github.com/pkg/errors"
- "github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
"github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil"
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
"github.com/smartcontractkit/chainlink-automation/pkg/v3/plugin"
-
commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/automation"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
+ iregistry21 "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/i_keeper_registry_master_wrapper_2_1"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
+ evm "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/encoding"
+ "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/transmit"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/upkeepstate"
+ "github.com/smartcontractkit/chainlink/v2/core/services/pg"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
)
@@ -96,7 +90,7 @@ func (r *ocr2keeperRelayer) NewOCR2KeeperProvider(rargs commontypes.RelayArgs, p
}
gasLimit := cfgWatcher.chain.Config().EVM().OCR2().Automation().GasLimit()
- contractTransmitter, err := newContractTransmitter(r.lggr, rargs, pargs.TransmitterID, r.ethKeystore, cfgWatcher, configTransmitterOpts{pluginGasLimit: &gasLimit})
+ contractTransmitter, err := newOnChainContractTransmitter(r.lggr, rargs, pargs.TransmitterID, r.ethKeystore, cfgWatcher, configTransmitterOpts{pluginGasLimit: &gasLimit}, OCR2AggregatorTransmissionContractABI)
if err != nil {
return nil, err
}
@@ -221,18 +215,17 @@ func newOCR2KeeperConfigProvider(lggr logger.Logger, chain legacyevm.Chain, rarg
}
contractAddress := common.HexToAddress(rargs.ContractID)
- contractABI, err := abi.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorMetaData.ABI))
- if err != nil {
- return nil, errors.Wrap(err, "could not get OCR2Aggregator ABI JSON")
- }
configPoller, err := NewConfigPoller(
lggr.With("contractID", rargs.ContractID),
- chain.Client(),
- chain.LogPoller(),
- contractAddress,
- // TODO: Does ocr2keeper need to support config contract? DF-19182
- nil,
+ CPConfig{
+ chain.Client(),
+ chain.LogPoller(),
+ contractAddress,
+ // TODO: Does ocr2keeper need to support config contract? DF-19182
+ nil,
+ OCR2AggregatorLogDecoder,
+ },
)
if err != nil {
return nil, errors.Wrap(err, "failed to create config poller")
@@ -246,7 +239,6 @@ func newOCR2KeeperConfigProvider(lggr logger.Logger, chain legacyevm.Chain, rarg
return newConfigWatcher(
lggr,
contractAddress,
- contractABI,
offchainConfigDigester,
configPoller,
chain,
diff --git a/core/services/relay/evm/ocr2vrf.go b/core/services/relay/evm/ocr2vrf.go
index d300c71fbef..d421b38ea77 100644
--- a/core/services/relay/evm/ocr2vrf.go
+++ b/core/services/relay/evm/ocr2vrf.go
@@ -3,14 +3,10 @@ package evm
import (
"encoding/json"
"fmt"
- "strings"
- "github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
"github.com/jmoiron/sqlx"
- "github.com/pkg/errors"
- "github.com/smartcontractkit/libocr/gethwrappers2/ocr2aggregator"
"github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
@@ -67,7 +63,7 @@ func (r *ocr2vrfRelayer) NewDKGProvider(rargs commontypes.RelayArgs, pargs commo
if err != nil {
return nil, err
}
- contractTransmitter, err := newContractTransmitter(r.lggr, rargs, pargs.TransmitterID, r.ethKeystore, configWatcher, configTransmitterOpts{})
+ contractTransmitter, err := newOnChainContractTransmitter(r.lggr, rargs, pargs.TransmitterID, r.ethKeystore, configWatcher, configTransmitterOpts{}, OCR2AggregatorTransmissionContractABI)
if err != nil {
return nil, err
}
@@ -90,7 +86,7 @@ func (r *ocr2vrfRelayer) NewOCR2VRFProvider(rargs commontypes.RelayArgs, pargs c
if err != nil {
return nil, err
}
- contractTransmitter, err := newContractTransmitter(r.lggr, rargs, pargs.TransmitterID, r.ethKeystore, configWatcher, configTransmitterOpts{})
+ contractTransmitter, err := newOnChainContractTransmitter(r.lggr, rargs, pargs.TransmitterID, r.ethKeystore, configWatcher, configTransmitterOpts{}, OCR2AggregatorTransmissionContractABI)
if err != nil {
return nil, err
}
@@ -146,17 +142,16 @@ func newOCR2VRFConfigProvider(lggr logger.Logger, chain legacyevm.Chain, rargs c
}
contractAddress := common.HexToAddress(rargs.ContractID)
- contractABI, err := abi.JSON(strings.NewReader(ocr2aggregator.OCR2AggregatorABI))
- if err != nil {
- return nil, errors.Wrap(err, "could not get OCR2Aggregator ABI JSON")
- }
configPoller, err := NewConfigPoller(
lggr.With("contractID", rargs.ContractID),
- chain.Client(),
- chain.LogPoller(),
- contractAddress,
- // TODO: Does ocr2vrf need to support config contract? DF-19182
- nil,
+ CPConfig{
+ chain.Client(),
+ chain.LogPoller(),
+ contractAddress,
+ // TODO: Does ocr2vrf need to support config contract? DF-19182
+ nil,
+ OCR2AggregatorLogDecoder,
+ },
)
if err != nil {
return nil, err
@@ -170,7 +165,6 @@ func newOCR2VRFConfigProvider(lggr logger.Logger, chain legacyevm.Chain, rargs c
return newConfigWatcher(
lggr,
contractAddress,
- contractABI,
offchainConfigDigester,
configPoller,
chain,
diff --git a/core/services/relay/evm/plugin_provider.go b/core/services/relay/evm/plugin_provider.go
new file mode 100644
index 00000000000..a419d069cae
--- /dev/null
+++ b/core/services/relay/evm/plugin_provider.go
@@ -0,0 +1,79 @@
+package evm
+
+import (
+ "context"
+
+ ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+)
+
+type pluginProvider struct {
+ services.Service
+ chainReader types.ChainReader
+ codec types.Codec
+ contractTransmitter ocrtypes.ContractTransmitter
+ configWatcher *configWatcher
+ lggr logger.Logger
+ ms services.MultiStart
+}
+
+var _ types.PluginProvider = (*pluginProvider)(nil)
+
+func NewPluginProvider(
+ chainReader types.ChainReader,
+ codec types.Codec,
+ contractTransmitter ocrtypes.ContractTransmitter,
+ configWatcher *configWatcher,
+ lggr logger.Logger,
+) *pluginProvider {
+ return &pluginProvider{
+ chainReader: chainReader,
+ codec: codec,
+ contractTransmitter: contractTransmitter,
+ configWatcher: configWatcher,
+ lggr: lggr,
+ ms: services.MultiStart{},
+ }
+}
+
+func (p *pluginProvider) Name() string { return p.lggr.Name() }
+
+func (p *pluginProvider) Ready() error { return nil }
+
+func (p *pluginProvider) HealthReport() map[string]error {
+ hp := map[string]error{p.Name(): p.Ready()}
+ services.CopyHealth(hp, p.configWatcher.HealthReport())
+ return hp
+}
+
+func (p *pluginProvider) ContractTransmitter() ocrtypes.ContractTransmitter {
+ return p.contractTransmitter
+}
+
+func (p *pluginProvider) OffchainConfigDigester() ocrtypes.OffchainConfigDigester {
+ return p.configWatcher.OffchainConfigDigester()
+}
+
+func (p *pluginProvider) ContractConfigTracker() ocrtypes.ContractConfigTracker {
+ return p.configWatcher.configPoller
+}
+
+func (p *pluginProvider) ChainReader() types.ChainReader {
+ return p.chainReader
+}
+
+func (p *pluginProvider) Codec() types.Codec {
+ return p.codec
+}
+
+func (p *pluginProvider) Start(ctx context.Context) error {
+ return p.configWatcher.Start(ctx)
+}
+
+func (p *pluginProvider) Close() error {
+ return p.configWatcher.Close()
+}
diff --git a/core/services/relay/evm/standard_config_provider.go b/core/services/relay/evm/standard_config_provider.go
new file mode 100644
index 00000000000..0de48240b7d
--- /dev/null
+++ b/core/services/relay/evm/standard_config_provider.go
@@ -0,0 +1,52 @@
+package evm
+
+import (
+ "errors"
+ "fmt"
+
+ "github.com/ethereum/go-ethereum/common"
+
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/chains/evmutil"
+ ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+
+ "github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
+)
+
+func newStandardConfigProvider(lggr logger.Logger, chain legacyevm.Chain, opts *types.RelayOpts) (*configWatcher, error) {
+ if !common.IsHexAddress(opts.ContractID) {
+ return nil, errors.New("invalid contractID, expected hex address")
+ }
+
+ aggregatorAddress := common.HexToAddress(opts.ContractID)
+ offchainConfigDigester := evmutil.EVMOffchainConfigDigester{
+ ChainID: chain.Config().EVM().ChainID().Uint64(),
+ ContractAddress: aggregatorAddress,
+ }
+ return newContractConfigProvider(lggr, chain, opts, aggregatorAddress, OCR2AggregatorLogDecoder, offchainConfigDigester)
+}
+
+func newContractConfigProvider(lggr logger.Logger, chain legacyevm.Chain, opts *types.RelayOpts, aggregatorAddress common.Address, ld LogDecoder, digester ocrtypes.OffchainConfigDigester) (*configWatcher, error) {
+ var cp types.ConfigPoller
+
+ relayConfig, err := opts.RelayConfig()
+ if err != nil {
+ return nil, fmt.Errorf("failed to get relay config: %w", err)
+ }
+ cp, err = NewConfigPoller(
+ lggr,
+ CPConfig{
+ chain.Client(),
+ chain.LogPoller(),
+ aggregatorAddress,
+ relayConfig.ConfigContractAddress,
+ ld,
+ },
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ return newConfigWatcher(lggr, aggregatorAddress, digester, cp, chain, relayConfig.FromBlock, opts.New), nil
+}
diff --git a/core/services/relay/evm/types/abi_types.go b/core/services/relay/evm/types/abi_types.go
index 34b12d885b4..4d1328bcc12 100644
--- a/core/services/relay/evm/types/abi_types.go
+++ b/core/services/relay/evm/types/abi_types.go
@@ -53,6 +53,10 @@ var typeMap = map[string]*ABIEncodingType{
native: reflect.TypeOf(common.Address{}),
checked: reflect.TypeOf(common.Address{}),
},
+ "bytes": {
+ native: reflect.TypeOf([]byte{}),
+ checked: reflect.TypeOf([]byte{}),
+ },
}
type ABIEncodingType struct {
diff --git a/core/services/relay/evm/types/codec_entry.go b/core/services/relay/evm/types/codec_entry.go
index b87f7ced721..21e5ac59847 100644
--- a/core/services/relay/evm/types/codec_entry.go
+++ b/core/services/relay/evm/types/codec_entry.go
@@ -222,7 +222,7 @@ func getNativeAndCheckedTypes(curType *abi.Type) (reflect.Type, reflect.Type, er
func createTupleType(curType *abi.Type, converter func(reflect.Type) reflect.Type) (reflect.Type, reflect.Type, error) {
if len(curType.TupleElems) == 0 {
if curType.TupleType == nil {
- return nil, nil, fmt.Errorf("%w: unsupported solitidy type: %v", commontypes.ErrInvalidType, curType.String())
+ return nil, nil, fmt.Errorf("%w: unsupported solidity type: %v", commontypes.ErrInvalidType, curType.String())
}
return curType.TupleType, curType.TupleType, nil
}
diff --git a/core/services/relay/relay.go b/core/services/relay/relay.go
index 826c3d17a44..db8cb03d431 100644
--- a/core/services/relay/relay.go
+++ b/core/services/relay/relay.go
@@ -93,7 +93,7 @@ func (r *ServerAdapter) NewPluginProvider(ctx context.Context, rargs types.Relay
return r.NewAutomationProvider(ctx, rargs, pargs)
case types.DKG, types.OCR2VRF, types.GenericPlugin:
return r.RelayerAdapter.NewPluginProvider(ctx, rargs, pargs)
- case types.CCIPCommit, types.CCIPExecution:
+ case types.LLO, types.CCIPCommit, types.CCIPExecution:
return nil, fmt.Errorf("provider type not supported: %s", rargs.ProviderType)
}
return nil, fmt.Errorf("provider type not recognized: %s", rargs.ProviderType)
diff --git a/core/services/relay/relay_test.go b/core/services/relay/relay_test.go
index 40a11518edd..7b92bab37cd 100644
--- a/core/services/relay/relay_test.go
+++ b/core/services/relay/relay_test.go
@@ -101,6 +101,10 @@ type staticAutomationProvider struct {
types.AutomationProvider
}
+type staticPluginProvider struct {
+ types.PluginProvider
+}
+
type mockRelayer struct {
types.Relayer
}
@@ -121,6 +125,10 @@ func (m *mockRelayer) NewAutomationProvider(rargs types.RelayArgs, pargs types.P
return staticAutomationProvider{}, nil
}
+func (m *mockRelayer) NewPluginProvider(rargs types.RelayArgs, pargs types.PluginArgs) (types.PluginProvider, error) {
+ return staticPluginProvider{}, nil
+}
+
type mockRelayerExt struct {
loop.RelayerExt
}
@@ -165,7 +173,7 @@ func TestRelayerServerAdapter(t *testing.T) {
},
{
ProviderType: string(types.GenericPlugin),
- Error: "unexpected call to NewPluginProvider",
+ Test: isType[types.PluginProvider],
},
}
diff --git a/core/services/s4/storage.go b/core/services/s4/storage.go
index 7c9a92d1f68..02ba9c7bd50 100644
--- a/core/services/s4/storage.go
+++ b/core/services/s4/storage.go
@@ -3,10 +3,11 @@ package s4
import (
"context"
+ "github.com/jonboulle/clockwork"
+
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/pg"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
"github.com/ethereum/go-ethereum/common"
)
@@ -70,12 +71,12 @@ type storage struct {
lggr logger.Logger
contraints Constraints
orm ORM
- clock utils.Clock
+ clock clockwork.Clock
}
var _ Storage = (*storage)(nil)
-func NewStorage(lggr logger.Logger, contraints Constraints, orm ORM, clock utils.Clock) Storage {
+func NewStorage(lggr logger.Logger, contraints Constraints, orm ORM, clock clockwork.Clock) Storage {
return &storage{
lggr: lggr.Named("S4Storage"),
contraints: contraints,
diff --git a/core/services/s4/storage_test.go b/core/services/s4/storage_test.go
index 199e3e6924b..b643609f449 100644
--- a/core/services/s4/storage_test.go
+++ b/core/services/s4/storage_test.go
@@ -4,12 +4,13 @@ import (
"testing"
"time"
+ "github.com/jonboulle/clockwork"
+
"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/s4"
"github.com/smartcontractkit/chainlink/v2/core/services/s4/mocks"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
@@ -27,7 +28,7 @@ var (
func setupTestStorage(t *testing.T, now time.Time) (*mocks.ORM, s4.Storage) {
logger := logger.TestLogger(t)
orm := mocks.NewORM(t)
- clock := utils.NewFixedClock(now)
+ clock := clockwork.NewFakeClock()
storage := s4.NewStorage(logger, constraints, orm, clock)
return orm, storage
}
diff --git a/core/services/streams/delegate.go b/core/services/streams/delegate.go
index b62ceb9857b..f7dc852a50b 100644
--- a/core/services/streams/delegate.go
+++ b/core/services/streams/delegate.go
@@ -31,7 +31,7 @@ type Delegate struct {
var _ job.Delegate = (*Delegate)(nil)
func NewDelegate(lggr logger.Logger, registry Registry, runner ocrcommon.Runner, cfg DelegateConfig) *Delegate {
- return &Delegate{lggr, registry, runner, cfg}
+ return &Delegate{lggr.Named("StreamsDelegate"), registry, runner, cfg}
}
func (d *Delegate) JobType() job.Type {
@@ -44,11 +44,11 @@ func (d *Delegate) BeforeJobDeleted(jb job.Job) {}
func (d *Delegate) OnDeleteJob(jb job.Job, q pg.Queryer) error { return nil }
func (d *Delegate) ServicesForSpec(jb job.Job) (services []job.ServiceCtx, err error) {
- if !jb.Name.Valid {
- return nil, errors.New("job name is required to be present for stream specs")
+ if jb.StreamID == nil {
+ return nil, errors.New("streamID is required to be present for stream specs")
}
- id := jb.Name.String
- lggr := d.lggr.Named(id).With("streamID", id)
+ id := *jb.StreamID
+ lggr := d.lggr.Named(fmt.Sprintf("%d", id)).With("streamID", id)
rrs := ocrcommon.NewResultRunSaver(d.runner, lggr, d.cfg.MaxSuccessfulRuns(), d.cfg.ResultWriteQueueDepth())
services = append(services, rrs, &StreamService{
@@ -77,12 +77,12 @@ func (s *StreamService) Start(_ context.Context) error {
if s.spec == nil {
return fmt.Errorf("pipeline spec unexpectedly missing for stream %q", s.id)
}
- s.lggr.Debugf("Starting stream %q", s.id)
+ s.lggr.Debugf("Starting stream %d", s.id)
return s.registry.Register(s.id, *s.spec, s.rrs)
}
func (s *StreamService) Close() error {
- s.lggr.Debugf("Stopping stream %q", s.id)
+ s.lggr.Debugf("Stopping stream %d", s.id)
s.registry.Unregister(s.id)
return nil
}
@@ -102,8 +102,8 @@ func ValidatedStreamSpec(tomlString string) (job.Job, error) {
return jb, errors.Errorf("unsupported type: %q", jb.Type)
}
- if !jb.Name.Valid {
- return jb, errors.New("jobs of type 'stream' require a non-blank name as stream ID")
+ if jb.StreamID == nil {
+ return jb, errors.New("jobs of type 'stream' require streamID to be specified")
}
return jb, nil
diff --git a/core/services/streams/delegate_test.go b/core/services/streams/delegate_test.go
index 77b10260375..e97da63d522 100644
--- a/core/services/streams/delegate_test.go
+++ b/core/services/streams/delegate_test.go
@@ -10,7 +10,6 @@ import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
- "gopkg.in/guregu/null.v4"
)
type mockRegistry struct{}
@@ -35,11 +34,11 @@ func Test_Delegate(t *testing.T) {
t.Run("ServicesForSpec", func(t *testing.T) {
jb := job.Job{PipelineSpec: &pipeline.Spec{ID: 1}}
- t.Run("errors if job is missing name", func(t *testing.T) {
+ t.Run("errors if job is missing streamID", func(t *testing.T) {
_, err := d.ServicesForSpec(jb)
- assert.EqualError(t, err, "job name is required to be present for stream specs")
+ assert.EqualError(t, err, "streamID is required to be present for stream specs")
})
- jb.Name = null.StringFrom("jobname")
+ jb.StreamID = ptr(uint32(42))
t.Run("returns services", func(t *testing.T) {
srvs, err := d.ServicesForSpec(jb)
require.NoError(t, err)
@@ -49,7 +48,7 @@ func Test_Delegate(t *testing.T) {
strmSrv := srvs[1].(*StreamService)
assert.Equal(t, registry, strmSrv.registry)
- assert.Equal(t, StreamID("jobname"), strmSrv.id)
+ assert.Equal(t, StreamID(42), strmSrv.id)
assert.Equal(t, jb.PipelineSpec, strmSrv.spec)
assert.NotNil(t, strmSrv.lggr)
assert.Equal(t, srvs[0], strmSrv.rrs)
@@ -67,6 +66,7 @@ func Test_ValidatedStreamSpec(t *testing.T) {
name: "minimal stream spec",
toml: `
type = "stream"
+streamID = 12345
name = "voter-turnout"
schemaVersion = 1
observationSource = """
@@ -82,6 +82,8 @@ answer1 [type=median index=0];
assert.Equal(t, job.Type("stream"), jb.Type)
assert.Equal(t, uint32(1), jb.SchemaVersion)
assert.True(t, jb.Name.Valid)
+ require.NotNil(t, jb.StreamID)
+ assert.Equal(t, uint32(12345), *jb.StreamID)
assert.Equal(t, "voter-turnout", jb.Name.String)
},
},
@@ -134,10 +136,11 @@ answer1 [type=median index=0];
},
},
{
- name: "error if missing name",
+ name: "no error if missing name",
toml: `
type = "stream"
schemaVersion = 1
+streamID = 12345
observationSource = """
ds1 [type=bridge name=voter_turnout];
ds1_parse [type=jsonparse path="one,two"];
@@ -147,7 +150,24 @@ answer1 [type=median index=0];
"""
`,
assertion: func(t *testing.T, jb job.Job, err error) {
- assert.EqualError(t, err, "jobs of type 'stream' require a non-blank name as stream ID")
+ require.NoError(t, err)
+ },
+ },
+ {
+ name: "error if missing streamID",
+ toml: `
+type = "stream"
+schemaVersion = 1
+observationSource = """
+ds1 [type=bridge name=voter_turnout];
+ds1_parse [type=jsonparse path="one,two"];
+ds1_multiply [type=multiply times=1.23];
+ds1 -> ds1_parse -> ds1_multiply -> answer1;
+answer1 [type=median index=0];
+"""
+`,
+ assertion: func(t *testing.T, jb job.Job, err error) {
+ assert.EqualError(t, err, "jobs of type 'stream' require streamID to be specified")
},
},
}
@@ -159,3 +179,4 @@ answer1 [type=median index=0];
})
}
}
+func ptr[T any](t T) *T { return &t }
diff --git a/core/services/streams/stream.go b/core/services/streams/stream.go
index 51535a0cb86..cb168c11bce 100644
--- a/core/services/streams/stream.go
+++ b/core/services/streams/stream.go
@@ -101,14 +101,9 @@ func (s *stream) executeRun(ctx context.Context) (*pipeline.Run, pipeline.TaskRu
// extract any desired type that matches a particular pipeline run output.
// Returns error on parse errors: if results are wrong type
func ExtractBigInt(trrs pipeline.TaskRunResults) (*big.Int, error) {
- var finaltrrs []pipeline.TaskRunResult
// pipeline.TaskRunResults comes ordered asc by index, this is guaranteed
// by the pipeline executor
- for _, trr := range trrs {
- if trr.IsTerminal() {
- finaltrrs = append(finaltrrs, trr)
- }
- }
+ finaltrrs := trrs.Terminals()
if len(finaltrrs) != 1 {
return nil, fmt.Errorf("invalid number of results, expected: 1, got: %d", len(finaltrrs))
diff --git a/core/services/streams/stream_registry.go b/core/services/streams/stream_registry.go
index c79c6c4e043..c4795caa304 100644
--- a/core/services/streams/stream_registry.go
+++ b/core/services/streams/stream_registry.go
@@ -4,18 +4,25 @@ import (
"fmt"
"sync"
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/pipeline"
)
-type StreamID = string
+// alias for easier refactoring
+type StreamID = commontypes.StreamID
type Registry interface {
- Get(streamID StreamID) (strm Stream, exists bool)
+ Getter
Register(streamID StreamID, spec pipeline.Spec, rrs ResultRunSaver) error
Unregister(streamID StreamID)
}
+type Getter interface {
+ Get(streamID StreamID) (strm Stream, exists bool)
+}
+
type streamRegistry struct {
sync.RWMutex
lggr logger.Logger
@@ -47,7 +54,7 @@ func (s *streamRegistry) Register(streamID StreamID, spec pipeline.Spec, rrs Res
s.Lock()
defer s.Unlock()
if _, exists := s.streams[streamID]; exists {
- return fmt.Errorf("stream already registered for id: %q", streamID)
+ return fmt.Errorf("stream already registered for id: %d", streamID)
}
s.streams[streamID] = NewStream(s.lggr, streamID, spec, s.runner, rrs)
return nil
diff --git a/core/services/streams/stream_registry_test.go b/core/services/streams/stream_registry_test.go
index 2c7c2bd6ecc..738b68f5d4d 100644
--- a/core/services/streams/stream_registry_test.go
+++ b/core/services/streams/stream_registry_test.go
@@ -28,23 +28,23 @@ func Test_Registry(t *testing.T) {
t.Run("Get", func(t *testing.T) {
sr := newRegistry(lggr, runner)
- sr.streams["foo"] = &mockStream{run: &pipeline.Run{ID: 1}}
- sr.streams["bar"] = &mockStream{run: &pipeline.Run{ID: 2}}
- sr.streams["baz"] = &mockStream{run: &pipeline.Run{ID: 3}}
+ sr.streams[1] = &mockStream{run: &pipeline.Run{ID: 1}}
+ sr.streams[2] = &mockStream{run: &pipeline.Run{ID: 2}}
+ sr.streams[3] = &mockStream{run: &pipeline.Run{ID: 3}}
- v, exists := sr.Get("foo")
+ v, exists := sr.Get(1)
assert.True(t, exists)
- assert.Equal(t, sr.streams["foo"], v)
+ assert.Equal(t, sr.streams[1], v)
- v, exists = sr.Get("bar")
+ v, exists = sr.Get(2)
assert.True(t, exists)
- assert.Equal(t, sr.streams["bar"], v)
+ assert.Equal(t, sr.streams[2], v)
- v, exists = sr.Get("baz")
+ v, exists = sr.Get(3)
assert.True(t, exists)
- assert.Equal(t, sr.streams["baz"], v)
+ assert.Equal(t, sr.streams[3], v)
- v, exists = sr.Get("qux")
+ v, exists = sr.Get(4)
assert.Nil(t, v)
assert.False(t, exists)
})
@@ -53,54 +53,54 @@ func Test_Registry(t *testing.T) {
t.Run("registers new stream", func(t *testing.T) {
assert.Len(t, sr.streams, 0)
- err := sr.Register("foo", pipeline.Spec{ID: 32, DotDagSource: "source"}, nil)
+ err := sr.Register(1, pipeline.Spec{ID: 32, DotDagSource: "source"}, nil)
require.NoError(t, err)
assert.Len(t, sr.streams, 1)
- v, exists := sr.Get("foo")
+ v, exists := sr.Get(1)
require.True(t, exists)
strm := v.(*stream)
- assert.Equal(t, StreamID("foo"), strm.id)
+ assert.Equal(t, StreamID(1), strm.id)
assert.Equal(t, int32(32), strm.spec.ID)
})
t.Run("errors when attempt to re-register a stream with an existing ID", func(t *testing.T) {
assert.Len(t, sr.streams, 1)
- err := sr.Register("foo", pipeline.Spec{ID: 33, DotDagSource: "source"}, nil)
+ err := sr.Register(1, pipeline.Spec{ID: 33, DotDagSource: "source"}, nil)
require.Error(t, err)
assert.Len(t, sr.streams, 1)
- assert.EqualError(t, err, "stream already registered for id: \"foo\"")
+ assert.EqualError(t, err, "stream already registered for id: 1")
- v, exists := sr.Get("foo")
+ v, exists := sr.Get(1)
require.True(t, exists)
strm := v.(*stream)
- assert.Equal(t, StreamID("foo"), strm.id)
+ assert.Equal(t, StreamID(1), strm.id)
assert.Equal(t, int32(32), strm.spec.ID)
})
})
t.Run("Unregister", func(t *testing.T) {
sr := newRegistry(lggr, runner)
- sr.streams["foo"] = &mockStream{run: &pipeline.Run{ID: 1}}
- sr.streams["bar"] = &mockStream{run: &pipeline.Run{ID: 2}}
- sr.streams["baz"] = &mockStream{run: &pipeline.Run{ID: 3}}
+ sr.streams[1] = &mockStream{run: &pipeline.Run{ID: 1}}
+ sr.streams[2] = &mockStream{run: &pipeline.Run{ID: 2}}
+ sr.streams[3] = &mockStream{run: &pipeline.Run{ID: 3}}
t.Run("unregisters a stream", func(t *testing.T) {
assert.Len(t, sr.streams, 3)
- sr.Unregister("foo")
+ sr.Unregister(1)
assert.Len(t, sr.streams, 2)
- _, exists := sr.streams["foo"]
+ _, exists := sr.streams[1]
assert.False(t, exists)
})
t.Run("no effect when unregistering a non-existent stream", func(t *testing.T) {
assert.Len(t, sr.streams, 2)
- sr.Unregister("foo")
+ sr.Unregister(1)
assert.Len(t, sr.streams, 2)
- _, exists := sr.streams["foo"]
+ _, exists := sr.streams[1]
assert.False(t, exists)
})
})
diff --git a/core/services/streams/stream_test.go b/core/services/streams/stream_test.go
index 3a556411bc6..3c0b4d0721f 100644
--- a/core/services/streams/stream_test.go
+++ b/core/services/streams/stream_test.go
@@ -59,7 +59,7 @@ func Test_Stream(t *testing.T) {
lggr := logger.TestLogger(t)
runner := &mockRunner{}
spec := pipeline.Spec{}
- id := StreamID("stream-id-foo")
+ id := StreamID(123)
ctx := testutils.Context(t)
t.Run("Run", func(t *testing.T) {
diff --git a/core/services/vrf/v1/listener_v1.go b/core/services/vrf/v1/listener_v1.go
index f4e813d7d61..a3240365a66 100644
--- a/core/services/vrf/v1/listener_v1.go
+++ b/core/services/vrf/v1/listener_v1.go
@@ -369,7 +369,7 @@ func (lsn *Listener) handleLog(lb log.Broadcast, minConfs uint32) {
func (lsn *Listener) shouldProcessLog(lb log.Broadcast) bool {
consumed, err := lsn.Chain.LogBroadcaster().WasAlreadyConsumed(lb)
if err != nil {
- lsn.L.Errorw("Could not determine if log was already consumed", "error", err, "txHash", lb.RawLog().TxHash)
+ lsn.L.Errorw("Could not determine if log was already consumed", "err", err, "txHash", lb.RawLog().TxHash)
// Do not process, let lb resend it as a retry mechanism.
return false
}
diff --git a/core/services/vrf/v2/coordinator_v2x_interface.go b/core/services/vrf/v2/coordinator_v2x_interface.go
index e88053ebc2c..21622c2cb18 100644
--- a/core/services/vrf/v2/coordinator_v2x_interface.go
+++ b/core/services/vrf/v2/coordinator_v2x_interface.go
@@ -40,7 +40,7 @@ type CoordinatorV2_X interface {
WithdrawNative(opts *bind.TransactOpts, recipient common.Address) (*types.Transaction, error)
LogsWithTopics(keyHash common.Hash) map[common.Hash][][]log.Topic
Version() vrfcommon.Version
- RegisterProvingKey(opts *bind.TransactOpts, oracle *common.Address, publicProvingKey [2]*big.Int) (*types.Transaction, error)
+ RegisterProvingKey(opts *bind.TransactOpts, oracle *common.Address, publicProvingKey [2]*big.Int, maxGasPrice *uint64) (*types.Transaction, error)
FilterSubscriptionCreated(opts *bind.FilterOpts, subID []*big.Int) (SubscriptionCreatedIterator, error)
FilterRandomWordsRequested(opts *bind.FilterOpts, keyHash [][32]byte, subID []*big.Int, sender []common.Address) (RandomWordsRequestedIterator, error)
FilterRandomWordsFulfilled(opts *bind.FilterOpts, requestID []*big.Int, subID []*big.Int) (RandomWordsFulfilledIterator, error)
@@ -154,7 +154,11 @@ func (c *coordinatorV2) Version() vrfcommon.Version {
return c.vrfVersion
}
-func (c *coordinatorV2) RegisterProvingKey(opts *bind.TransactOpts, oracle *common.Address, publicProvingKey [2]*big.Int) (*types.Transaction, error) {
+func (c *coordinatorV2) RegisterProvingKey(opts *bind.TransactOpts, oracle *common.Address, publicProvingKey [2]*big.Int, maxGasPrice *uint64) (*types.Transaction, error) {
+ if maxGasPrice != nil {
+ return nil, fmt.Errorf("max gas price not supported for registering proving key in v2")
+
+ }
return c.coordinator.RegisterProvingKey(opts, *oracle, publicProvingKey)
}
@@ -316,11 +320,14 @@ func (c *coordinatorV2_5) Version() vrfcommon.Version {
return c.vrfVersion
}
-func (c *coordinatorV2_5) RegisterProvingKey(opts *bind.TransactOpts, oracle *common.Address, publicProvingKey [2]*big.Int) (*types.Transaction, error) {
+func (c *coordinatorV2_5) RegisterProvingKey(opts *bind.TransactOpts, oracle *common.Address, publicProvingKey [2]*big.Int, maxGasPrice *uint64) (*types.Transaction, error) {
if oracle != nil {
return nil, errors.New("oracle address not supported for registering proving key in v2.5")
}
- return c.coordinator.RegisterProvingKey(opts, publicProvingKey)
+ if maxGasPrice == nil {
+ return nil, errors.New("max gas price is required for registering proving key in v2.5")
+ }
+ return c.coordinator.RegisterProvingKey(opts, publicProvingKey, *maxGasPrice)
}
func (c *coordinatorV2_5) FilterSubscriptionCreated(opts *bind.FilterOpts, subID []*big.Int) (SubscriptionCreatedIterator, error) {
diff --git a/core/services/vrf/v2/integration_helpers_test.go b/core/services/vrf/v2/integration_helpers_test.go
index 47d0089ade6..b0ae4266b12 100644
--- a/core/services/vrf/v2/integration_helpers_test.go
+++ b/core/services/vrf/v2/integration_helpers_test.go
@@ -32,6 +32,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/evmtest"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+ "github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
v22 "github.com/smartcontractkit/chainlink/v2/core/services/vrf/v2"
"github.com/smartcontractkit/chainlink/v2/core/services/vrf/vrfcommon"
@@ -1682,7 +1683,7 @@ func testMaliciousConsumer(
time.Sleep(1 * time.Second)
// Register a proving key associated with the VRF job.
- registerProvingKeyHelper(t, uni, uni.rootContract, vrfkey)
+ registerProvingKeyHelper(t, uni, uni.rootContract, vrfkey, &defaultMaxGasPrice)
subFunding := decimal.RequireFromString("1000000000000000000")
_, err = uni.maliciousConsumerContract.CreateSubscriptionAndFund(carol,
@@ -1736,3 +1737,145 @@ func testMaliciousConsumer(
}
require.Equal(t, 1, len(requests))
}
+
+func testReplayOldRequestsOnStartUp(
+ t *testing.T,
+ ownerKey ethkey.KeyV2,
+ uni coordinatorV2UniverseCommon,
+ consumer *bind.TransactOpts,
+ consumerContract vrftesthelpers.VRFConsumerContract,
+ consumerContractAddress common.Address,
+ coordinator v22.CoordinatorV2_X,
+ coordinatorAddress common.Address,
+ batchCoordinatorAddress common.Address,
+ vrfOwnerAddress *common.Address,
+ vrfVersion vrfcommon.Version,
+ nativePayment bool,
+ assertions ...func(
+ t *testing.T,
+ coordinator v22.CoordinatorV2_X,
+ rwfe v22.RandomWordsFulfilled,
+ subID *big.Int),
+) {
+ sendingKey := cltest.MustGenerateRandomKey(t)
+ gasLanePriceWei := assets.GWei(10)
+ config, _ := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{
+ // Gas lane.
+ Key: ptr(sendingKey.EIP55Address),
+ GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei},
+ })(c, s)
+ c.EVM[0].MinIncomingConfirmations = ptr[uint32](2)
+ c.Feature.LogPoller = ptr(true)
+ c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(1 * time.Second)
+ })
+ app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, uni.backend, ownerKey, sendingKey)
+
+ // Create a subscription and fund with 5 LINK.
+ subID := subscribeAndAssertSubscriptionCreatedEvent(t, consumerContract, consumer, consumerContractAddress, big.NewInt(5e18), coordinator, uni.backend, nativePayment)
+
+ // Fund gas lanes.
+ sendEth(t, ownerKey, uni.backend, sendingKey.Address, 10)
+ require.NoError(t, app.Start(testutils.Context(t)))
+
+ // Create VRF Key, register it to coordinator and export
+ vrfkey, err := app.GetKeyStore().VRF().Create()
+ require.NoError(t, err)
+ registerProvingKeyHelper(t, uni, coordinator, vrfkey, &defaultMaxGasPrice)
+ keyHash := vrfkey.PublicKey.MustHash()
+
+ encodedVrfKey, err := app.GetKeyStore().VRF().Export(vrfkey.ID(), testutils.Password)
+ require.NoError(t, err)
+
+ // Shut down the node before making the randomness request
+ require.NoError(t, app.Stop())
+
+ // Make the first randomness request.
+ numWords := uint32(20)
+ requestID1, _ := requestRandomnessAndAssertRandomWordsRequestedEvent(t, consumerContract, consumer, keyHash, subID, numWords, 500_000, coordinator, uni.backend, nativePayment)
+
+ // number of blocks to mine before restarting the node
+ nBlocks := 100
+ for i := 0; i < nBlocks; i++ {
+ uni.backend.Commit()
+ }
+
+ config, db := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{
+ // Gas lane.
+ Key: ptr(sendingKey.EIP55Address),
+ GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei},
+ })(c, s)
+ c.EVM[0].MinIncomingConfirmations = ptr[uint32](2)
+ c.Feature.LogPoller = ptr(true)
+ c.EVM[0].LogPollInterval = commonconfig.MustNewDuration(1 * time.Second)
+ })
+
+ // Start a new app and create VRF job using the same VRF key created above
+ app = cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, uni.backend, ownerKey, sendingKey)
+
+ require.NoError(t, app.Start(testutils.Context(t)))
+
+ vrfKey, err := app.GetKeyStore().VRF().Import(encodedVrfKey, testutils.Password)
+ require.NoError(t, err)
+
+ incomingConfs := 2
+ var vrfOwnerString string
+ if vrfOwnerAddress != nil {
+ vrfOwnerString = vrfOwnerAddress.Hex()
+ }
+
+ spec := testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{
+ Name: "vrf-primary",
+ VRFVersion: vrfVersion,
+ CoordinatorAddress: coordinatorAddress.Hex(),
+ BatchCoordinatorAddress: batchCoordinatorAddress.Hex(),
+ MinIncomingConfirmations: incomingConfs,
+ PublicKey: vrfKey.PublicKey.String(),
+ FromAddresses: []string{sendingKey.Address.String()},
+ BackoffInitialDelay: 10 * time.Millisecond,
+ BackoffMaxDelay: time.Second,
+ V2: true,
+ GasLanePrice: gasLanePriceWei,
+ VRFOwnerAddress: vrfOwnerString,
+ EVMChainID: testutils.SimulatedChainID.String(),
+ }).Toml()
+
+ jb, err := vrfcommon.ValidatedVRFSpec(spec)
+ require.NoError(t, err)
+ t.Log(jb.VRFSpec.PublicKey.MustHash(), vrfKey.PublicKey.MustHash())
+ err = app.JobSpawner().CreateJob(&jb)
+ require.NoError(t, err)
+
+ // Wait until all jobs are active and listening for logs
+ gomega.NewWithT(t).Eventually(func() bool {
+ jbs := app.JobSpawner().ActiveJobs()
+ for _, jb := range jbs {
+ if jb.Type == job.VRF {
+ return true
+ }
+ }
+ return false
+ }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue())
+
+ // Wait for fulfillment to be queued.
+ gomega.NewGomegaWithT(t).Eventually(func() bool {
+ uni.backend.Commit()
+ runs, err := app.PipelineORM().GetAllRuns()
+ require.NoError(t, err)
+ t.Log("runs", len(runs))
+ return len(runs) == 1
+ }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())
+
+ // Mine the fulfillment that was queued.
+ mine(t, requestID1, subID, uni.backend, db, vrfVersion, testutils.SimulatedChainID)
+
+ // Assert correct state of RandomWordsFulfilled event.
+ // In particular:
+ // * success should be true
+ // * payment should be exactly the amount specified as the premium in the coordinator fee config
+ rwfe := assertRandomWordsFulfilled(t, requestID1, true, coordinator, nativePayment)
+ if len(assertions) > 0 {
+ assertions[0](t, coordinator, rwfe, subID)
+ }
+}
diff --git a/core/services/vrf/v2/integration_v2_plus_test.go b/core/services/vrf/v2/integration_v2_plus_test.go
index e5eed6f09bc..9d89911f0f2 100644
--- a/core/services/vrf/v2/integration_v2_plus_test.go
+++ b/core/services/vrf/v2/integration_v2_plus_test.go
@@ -255,10 +255,10 @@ func newVRFCoordinatorV2PlusUniverse(t *testing.T, key ethkey.KeyV2, numConsumer
uint32(60*60*24), // stalenessSeconds
uint32(v22.GasAfterPaymentCalculation), // gasAfterPaymentCalculation
big.NewInt(1e16), // 0.01 eth per link fallbackLinkPrice
- vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig{
- FulfillmentFlatFeeLinkPPM: uint32(1000), // 0.001 LINK premium
- FulfillmentFlatFeeNativePPM: uint32(5), // 0.000005 ETH premium
- },
+ uint32(5), // 0.000005 ETH premium
+ uint32(1), // 0.000001 LINK premium discount denominated in ETH
+ uint8(10), // 10% native payment percentage
+ uint8(5), // 5% LINK payment percentage
)
require.NoError(t, err, "failed to set coordinator configuration")
backend.Commit()
@@ -727,10 +727,17 @@ func TestVRFV2PlusIntegration_ExternalOwnerConsumerExample(t *testing.T) {
vrf_coordinator_v2_5.DeployVRFCoordinatorV25(
owner, backend, common.Address{}) //bhs not needed for this test
require.NoError(t, err)
- _, err = coordinator.SetConfig(owner, uint16(1), uint32(10000), 1, 1, big.NewInt(10), vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig{
- FulfillmentFlatFeeLinkPPM: 0,
- FulfillmentFlatFeeNativePPM: 0,
- })
+ _, err = coordinator.SetConfig(owner,
+ uint16(1), // minimumRequestConfirmations
+ uint32(10000), // maxGasLimit
+ 1, // stalenessSeconds
+ 1, // gasAfterPaymentCalculation
+ big.NewInt(10), // fallbackWeiPerUnitLink
+ 0, // fulfillmentFlatFeeNativePPM
+ 0, // fulfillmentFlatFeeLinkDiscountPPM
+ 0, // nativePremiumPercentage
+ 0, // linkPremiumPercentage
+ )
require.NoError(t, err)
backend.Commit()
_, err = coordinator.SetLINKAndLINKNativeFeed(owner, linkAddress, linkEthFeed)
@@ -849,7 +856,7 @@ func TestVRFV2PlusIntegration_RequestCost(t *testing.T) {
vrfkey, err := app.GetKeyStore().VRF().Create()
require.NoError(t, err)
- registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey)
+ registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey, &defaultMaxGasPrice)
t.Run("non-proxied consumer", func(tt *testing.T) {
carol := uni.vrfConsumers[0]
carolContract := uni.consumerContracts[0]
@@ -970,7 +977,7 @@ func requestAndEstimateFulfillmentCost(
uni.backend.Commit()
}
- requestLog := FindLatestRandomnessRequestedLog(t, uni.rootContract, vrfkey.PublicKey.MustHash())
+ requestLog := FindLatestRandomnessRequestedLog(t, uni.rootContract, vrfkey.PublicKey.MustHash(), nil)
s, err := proof.BigToSeed(requestLog.PreSeed())
require.NoError(t, err)
extraArgs, err := extraargs.ExtraArgsV1(nativePayment)
@@ -988,7 +995,7 @@ func requestAndEstimateFulfillmentCost(
require.NoError(t, err)
gasEstimate := estimateGas(t, uni.backend, common.Address{},
uni.rootContractAddress, uni.coordinatorABI,
- "fulfillRandomWords", proof, rc)
+ "fulfillRandomWords", proof, rc, false)
t.Log("consumer fulfillment gas estimate:", gasEstimate)
assert.Greater(t, gasEstimate, lowerBound)
assert.Less(t, gasEstimate, upperBound)
@@ -1004,7 +1011,7 @@ func TestVRFV2PlusIntegration_FulfillmentCost(t *testing.T) {
vrfkey, err := app.GetKeyStore().VRF().Create()
require.NoError(t, err)
- registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey)
+ registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey, &defaultMaxGasPrice)
t.Run("non-proxied consumer", func(tt *testing.T) {
carol := uni.vrfConsumers[0]
@@ -1339,3 +1346,24 @@ func TestVRFV2PlusIntegration_CancelSubscription(t *testing.T) {
AssertLinkBalance(t, uni.linkContract, uni.neil.From, linkBalanceBeforeCancel.Add(linkBalanceBeforeCancel, linkAmount))
AssertNativeBalance(t, uni.backend, uni.neil.From, nativeBalanceBeforeCancel.Add(nativeBalanceBeforeCancel, nativeAmount))
}
+
+func TestVRFV2PlusIntegration_ReplayOldRequestsOnStartUp(t *testing.T) {
+ t.Parallel()
+ ownerKey := cltest.MustGenerateRandomKey(t)
+ uni := newVRFCoordinatorV2PlusUniverse(t, ownerKey, 1, false)
+
+ testReplayOldRequestsOnStartUp(
+ t,
+ ownerKey,
+ uni.coordinatorV2UniverseCommon,
+ uni.vrfConsumers[0],
+ uni.consumerContracts[0],
+ uni.consumerContractAddresses[0],
+ uni.rootContract,
+ uni.rootContractAddress,
+ uni.batchCoordinatorContractAddress,
+ nil,
+ vrfcommon.V2Plus,
+ false,
+ )
+}
diff --git a/core/services/vrf/v2/integration_v2_reverted_txns_test.go b/core/services/vrf/v2/integration_v2_reverted_txns_test.go
new file mode 100644
index 00000000000..b8e6f5f9b05
--- /dev/null
+++ b/core/services/vrf/v2/integration_v2_reverted_txns_test.go
@@ -0,0 +1,692 @@
+package v2_test
+
+import (
+ "database/sql"
+ "fmt"
+ "math/big"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/ethereum/go-ethereum/common/hexutil"
+ "github.com/google/uuid"
+ "github.com/onsi/gomega"
+ "github.com/pkg/errors"
+ "github.com/stretchr/testify/require"
+
+ "github.com/jmoiron/sqlx"
+
+ txmgrcommon "github.com/smartcontractkit/chainlink/v2/common/txmgr"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
+ evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
+ evmutils "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/batch_vrf_coordinator_v2"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_external_sub_owner_example"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/cltest/heavyweight"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+ "github.com/smartcontractkit/chainlink/v2/core/services/job"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
+ prooflib "github.com/smartcontractkit/chainlink/v2/core/services/vrf/proof"
+ v2 "github.com/smartcontractkit/chainlink/v2/core/services/vrf/v2"
+ "github.com/smartcontractkit/chainlink/v2/core/services/vrf/vrfcommon"
+ "github.com/smartcontractkit/chainlink/v2/core/testdata/testspecs"
+ "github.com/smartcontractkit/chainlink/v2/core/utils"
+)
+
+var (
+ coordinatorV2ABI = evmtypes.MustGetABI(vrf_coordinator_v2.VRFCoordinatorV2ABI)
+ batchCoordinatorV2ABI = evmtypes.MustGetABI(batch_vrf_coordinator_v2.BatchVRFCoordinatorV2ABI)
+)
+
+func TestVRFV2Integration_SingleRevertedTxn_ForceFulfillment(t *testing.T) {
+ t.Parallel()
+
+ ownerKey := cltest.MustGenerateRandomKey(t)
+ uni := newVRFCoordinatorV2Universe(t, ownerKey, 1)
+ th := newRevertTxnTH(t, &uni, ownerKey, false, []uint64{1})
+
+ // Make VRF request without sufficient balance and send fulfillment without simulation
+ req := makeVRFReq(t, th, th.subs[0])
+ req = fulfillVRFReq(t, th, req, th.subs[0], false, nil)
+
+ waitForForceFulfillment(t, th, req, th.subs[0], true, 1)
+
+ t.Log("Done!")
+}
+
+func TestVRFV2Integration_BatchRevertedTxn_ForceFulfillment(t *testing.T) {
+ t.Parallel()
+ ownerKey := cltest.MustGenerateRandomKey(t)
+ uni := newVRFCoordinatorV2Universe(t, ownerKey, 1)
+
+ th := newRevertTxnTH(t, &uni, ownerKey, true, []uint64{1})
+
+ numReqs := 2
+ reqs := make([]*vrfReq, numReqs)
+ for i := 0; i < numReqs; i++ {
+ reqs[i] = makeVRFReq(t, th, th.subs[0])
+ }
+ fulfilBatchVRFReq(t, th, reqs, th.subs[0])
+
+ for i := 0; i < numReqs; i++ {
+ // The last request will be the successful one because of the way the example
+ // contract is written.
+ success := false
+ if i == (numReqs - 1) {
+ success = true
+ }
+ waitForForceFulfillment(t, th, reqs[i], th.subs[0], success, 1)
+ }
+ t.Log("Done!")
+}
+
+func TestVRFV2Integration_ForceFulfillmentRevertedTxn_Retry(t *testing.T) {
+ t.Parallel()
+
+ ownerKey := cltest.MustGenerateRandomKey(t)
+ uni := newVRFCoordinatorV2Universe(t, ownerKey, 1)
+ th := newRevertTxnTH(t, &uni, ownerKey, false, []uint64{1})
+
+ // Make VRF request without sufficient balance and send fulfillment without simulation
+ req := makeVRFReq(t, th, th.subs[0])
+ req = fulfillVRFReq(t, th, req, th.subs[0], true, ptr(uint64(7)))
+
+ waitForForceFulfillment(t, th, req, th.subs[0], true, 2)
+
+ receipts, err := getTxnReceiptDB(th.db, -1)
+ require.Nil(t, err)
+ require.Len(t, receipts, 2)
+ require.Equal(t, uint64(0), receipts[0].EVMReceipt.Status)
+ require.Equal(t, uint64(1), receipts[1].EVMReceipt.Status)
+ require.Equal(t, uint64(8), receipts[1].ForceFulfillmentAttempt)
+
+ t.Log("Done!")
+}
+func TestVRFV2Integration_CanceledSubForceFulfillmentRevertedTxn_Retry(t *testing.T) {
+ t.Parallel()
+
+ ownerKey := cltest.MustGenerateRandomKey(t)
+ uni := newVRFCoordinatorV2Universe(t, ownerKey, 1)
+ th := newRevertTxnTH(t, &uni, ownerKey, false, []uint64{1})
+
+ // Make VRF request without sufficient balance and send fulfillment without simulation
+ req := makeVRFReq(t, th, th.subs[0])
+ req = fulfillVRFReq(t, th, req, th.subs[0], true, nil)
+
+ waitForForceFulfillment(t, th, req, th.subs[0], true, 2)
+
+ receipts, err := getTxnReceiptDB(th.db, -1)
+ require.Nil(t, err)
+ require.Len(t, receipts, 2)
+ require.Equal(t, uint64(0), receipts[0].EVMReceipt.Status)
+ require.Equal(t, uint64(1), receipts[1].EVMReceipt.Status)
+ require.Equal(t, uint64(1), receipts[1].ForceFulfillmentAttempt)
+
+ t.Log("Done!")
+}
+
+func TestUniqueReqById_NoPendingReceipts(t *testing.T) {
+ revertedForceTxns := []v2.TxnReceiptDB{
+ {RequestID: common.BigToHash(big.NewInt(1)).Hex(),
+ ForceFulfillmentAttempt: 1, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(1)).Hex(),
+ ForceFulfillmentAttempt: 2, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 1, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 2, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 3, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 4, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ }
+ allForceTxns := revertedForceTxns
+ res := v2.UniqueByReqID(revertedForceTxns, allForceTxns)
+ require.Len(t, res, 2)
+ for _, r := range res {
+ if r.RequestID == "1" {
+ require.Equal(t, r.ForceFulfillmentAttempt, 2)
+ }
+ if r.RequestID == "2" {
+ require.Equal(t, r.ForceFulfillmentAttempt, 4)
+ }
+ }
+}
+
+func TestUniqueReqById_WithPendingReceipts(t *testing.T) {
+ revertedForceTxns := []v2.TxnReceiptDB{
+ {RequestID: common.BigToHash(big.NewInt(1)).Hex(),
+ ForceFulfillmentAttempt: 1, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(1)).Hex(),
+ ForceFulfillmentAttempt: 2, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 1, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 2, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 3, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ {RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 4, EVMReceipt: evmtypes.Receipt{Status: 0}},
+ }
+ allForceTxns := []v2.TxnReceiptDB{}
+ allForceTxns = append(allForceTxns, revertedForceTxns...)
+ allForceTxns = append(allForceTxns, v2.TxnReceiptDB{RequestID: common.BigToHash(big.NewInt(2)).Hex(),
+ ForceFulfillmentAttempt: 5})
+ res := v2.UniqueByReqID(revertedForceTxns, allForceTxns)
+ require.Len(t, res, 1)
+ for _, r := range res {
+ if r.RequestID == "1" {
+ require.Equal(t, r.ForceFulfillmentAttempt, 2)
+ }
+ }
+}
+
+// Wait till force fulfillment event fired for the req passed in, till go test timeout
+func waitForForceFulfillment(t *testing.T,
+ th *revertTxnTH,
+ req *vrfReq,
+ sub *vrfSub,
+ success bool,
+ forceFulfilledCount int64) {
+ uni := th.uni
+ coordinator := th.uni.rootContract
+ requestID := req.requestID
+
+ // Wait for force-fulfillment to be queued.
+ gomega.NewGomegaWithT(t).Eventually(func() bool {
+ uni.backend.Commit()
+ commitment, err := coordinator.GetCommitment(nil, requestID)
+ require.NoError(t, err)
+ t.Log("commitment is:", hexutil.Encode(commitment[:]), ", requestID: ", common.BigToHash(requestID).Hex())
+ checkForForceFulfilledEvent(t, th, req, sub, -1)
+ return utils.IsEmpty(commitment[:])
+ }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())
+
+ // Mine the fulfillment that was queued.
+ mineForceFulfilled(t, requestID, sub.subID, forceFulfilledCount, *uni, th.db)
+
+ // Assert correct state of RandomWordsFulfilled event.
+ // In this particular case:
+ // * success should be true
+ // * payment should be zero (forced fulfillment)
+ rwfe := assertRandomWordsFulfilled(t, requestID, success, coordinator, false)
+ require.Equal(t, "0", rwfe.Payment().String())
+
+ // Check that the RandomWordsForced event is emitted correctly.
+ checkForForceFulfilledEvent(t, th, req, sub, 0)
+}
+
+// Check if force fulfillment event fired for the req passed in
+func checkForForceFulfilledEvent(t *testing.T,
+ th *revertTxnTH,
+ req *vrfReq,
+ sub *vrfSub,
+ numForcedLogs int) {
+ requestID := req.requestID
+ it, err := th.uni.vrfOwnerNew.FilterRandomWordsForced(nil, []*big.Int{requestID},
+ []uint64{sub.subID}, []common.Address{th.eoaConsumerAddr})
+ require.NoError(t, err)
+ i := 0
+ for it.Next() {
+ i++
+ require.Equal(t, requestID.String(), it.Event.RequestId.String())
+ require.Equal(t, sub.subID, it.Event.SubId)
+ require.Equal(t, th.eoaConsumerAddr.String(), it.Event.Sender.String())
+ }
+ t.Log("Number of RandomWordsForced Logs:", i)
+ require.Greater(t, i, numForcedLogs)
+}
+
+// Make VRF request without sufficient balance and send fulfillment without simulation
+func makeVRFReq(t *testing.T, th *revertTxnTH, sub *vrfSub) (req *vrfReq) {
+ // Make the randomness request and send fulfillment without simulation
+ numWords := uint32(3)
+ confs := 10
+ callbackGasLimit := uint32(600_000)
+ _, err := th.eoaConsumer.RequestRandomWords(th.uni.neil, sub.subID,
+ callbackGasLimit, uint16(confs), numWords, th.keyHash)
+ require.NoError(t, err, fmt.Sprintf("failed to request randomness from consumer: %v", err))
+ th.uni.backend.Commit()
+
+ // Generate VRF proof
+ requestID, err := th.eoaConsumer.SRequestId(nil)
+ require.NoError(t, err)
+
+ return &vrfReq{requestID: requestID, callbackGasLimit: callbackGasLimit, numWords: numWords}
+}
+
+// Fulfill VRF req without prior simulation, after computing req proof and commitment
+func fulfillVRFReq(t *testing.T,
+ th *revertTxnTH,
+ req *vrfReq,
+ sub *vrfSub,
+ forceFulfill bool,
+ forceFulfilmentAttempt *uint64) *vrfReq {
+ // Generate VRF proof and commitment
+ reqUpdated := genReqProofNCommitment(t, th, *req, sub)
+ req = &reqUpdated
+
+ // Send fulfillment TX w/ out simulation to txm, to revert on-chain
+
+ // Construct data payload
+ b, err := coordinatorV2ABI.Pack("fulfillRandomWords", req.proof, req.reqCommitment)
+ require.NoError(t, err)
+
+ ec := th.uni.backend
+ chainID := th.uni.backend.Blockchain().Config().ChainID
+ chain, err := th.app.GetRelayers().LegacyEVMChains().Get(chainID.String())
+ require.NoError(t, err)
+
+ metadata := &txmgr.TxMeta{
+ RequestID: ptr(common.BytesToHash(req.requestID.Bytes())),
+ SubID: &sub.subID,
+ RequestTxHash: req.requestTxHash,
+ // No max link since simulation failed
+ }
+ if forceFulfill {
+ metadata.ForceFulfilled = ptr(true)
+ if forceFulfilmentAttempt != nil {
+ metadata.ForceFulfillmentAttempt = forceFulfilmentAttempt
+ }
+ }
+ etx, err := chain.TxManager().CreateTransaction(testutils.Context(t), txmgr.TxRequest{
+ FromAddress: th.key1.EIP55Address.Address(),
+ ToAddress: th.uni.rootContractAddress,
+ EncodedPayload: b,
+ FeeLimit: 1e6,
+ Strategy: txmgrcommon.NewSendEveryStrategy(),
+ Meta: metadata,
+ })
+ require.NoError(t, err)
+ ec.Commit()
+
+ // wait for above tx to mine (reach state confirmed)
+ mine(t, req.requestID, big.NewInt(int64(sub.subID)), th.uni.backend, th.db, vrfcommon.V2, th.chainID)
+
+ receipts, err := getTxnReceiptDB(th.db, etx.ID)
+ require.Nil(t, err)
+ require.Len(t, receipts, 1)
+ require.Equal(t, uint64(0), receipts[0].EVMReceipt.Status)
+ req.txID = etx.ID
+ return req
+}
+
+// Fulfill VRF req without prior simulation, after computing req proof and commitment
+func fulfilBatchVRFReq(t *testing.T,
+ th *revertTxnTH,
+ reqs []*vrfReq,
+ sub *vrfSub) {
+ proofs := make([]vrf_coordinator_v2.VRFProof, 0)
+ reqCommitments := make([]vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment, 0)
+ requestIDs := make([]common.Hash, 0)
+ requestIDInts := make([]*big.Int, 0)
+ requestTxnHashes := make([]common.Hash, 0)
+ // Generate VRF proof and commitment
+ for i, req := range reqs {
+ reqUpdated := genReqProofNCommitment(t, th, *req, sub)
+ reqs[i] = &reqUpdated
+ proofs = append(proofs, *reqUpdated.proof)
+ reqCommitments = append(reqCommitments, *reqUpdated.reqCommitment)
+ requestIDs = append(requestIDs, common.BytesToHash(reqUpdated.requestID.Bytes()))
+ requestIDInts = append(requestIDInts, reqUpdated.requestID)
+ requestTxnHashes = append(requestTxnHashes, *reqUpdated.requestTxHash)
+ }
+
+ // Send fulfillment TX w/ out simulation to txm, to revert on-chain
+
+ // Construct data payload
+ b, err := batchCoordinatorV2ABI.Pack("fulfillRandomWords", proofs, reqCommitments)
+ require.NoError(t, err)
+
+ ec := th.uni.backend
+ chainID := th.uni.backend.Blockchain().Config().ChainID
+ chain, err := th.app.GetRelayers().LegacyEVMChains().Get(chainID.String())
+ require.NoError(t, err)
+
+ etx, err := chain.TxManager().CreateTransaction(testutils.Context(t), txmgr.TxRequest{
+ FromAddress: th.key1.EIP55Address.Address(),
+ ToAddress: th.uni.batchCoordinatorContractAddress,
+ EncodedPayload: b,
+ FeeLimit: 1e6,
+ Strategy: txmgrcommon.NewSendEveryStrategy(),
+ Meta: &txmgr.TxMeta{
+ RequestIDs: requestIDs,
+ RequestTxHashes: requestTxnHashes,
+ SubID: &sub.subID,
+ // No max link since simulation failed
+ },
+ })
+ require.NoError(t, err)
+ ec.Commit()
+
+ // wait for above tx to mine (reach state confirmed)
+ mineBatch(t, requestIDInts, big.NewInt(int64(sub.subID)), th.uni.backend, th.db, vrfcommon.V2, chainID)
+
+ receipts, err := getTxnReceiptDB(th.db, etx.ID)
+ require.Nil(t, err)
+ require.Len(t, receipts, 1)
+ require.Equal(t, uint64(1), receipts[0].EVMReceipt.Status)
+}
+
+// Fulfill VRF req without prior simulation, after computing req proof and commitment
+func genReqProofNCommitment(t *testing.T,
+ th *revertTxnTH,
+ req vrfReq,
+ sub *vrfSub) vrfReq {
+ // Generate VRF proof
+ requestLog := FindLatestRandomnessRequestedLog(t, th.uni.rootContract, th.keyHash, req.requestID)
+ s, err := prooflib.BigToSeed(requestLog.PreSeed())
+ require.NoError(t, err)
+ proof, rc, err := prooflib.GenerateProofResponseV2(th.app.GetKeyStore().VRF(), th.vrfKeyID, prooflib.PreSeedDataV2{
+ PreSeed: s,
+ BlockHash: requestLog.Raw().BlockHash,
+ BlockNum: requestLog.Raw().BlockNumber,
+ SubId: sub.subID,
+ CallbackGasLimit: req.callbackGasLimit,
+ NumWords: req.numWords,
+ Sender: th.eoaConsumerAddr,
+ })
+ require.NoError(t, err)
+ txHash := requestLog.Raw().TxHash
+ req.proof, req.reqCommitment, req.requestTxHash = &proof, &rc, &txHash
+ return req
+}
+
+// Create VRF jobs in test CL node
+func createVRFJobsNew(
+ t *testing.T,
+ fromKeys [][]ethkey.KeyV2,
+ app *cltest.TestApplication,
+ coordinator v2.CoordinatorV2_X,
+ coordinatorAddress common.Address,
+ batchCoordinatorAddress common.Address,
+ uni coordinatorV2Universe,
+ batchEnabled bool,
+ chainID *big.Int,
+ gasLanePrices ...*assets.Wei,
+) (jobs []job.Job, vrfKeyIDs []string) {
+ if len(gasLanePrices) != len(fromKeys) {
+ t.Fatalf("must provide one gas lane price for each set of from addresses. len(gasLanePrices) != len(fromKeys) [%d != %d]",
+ len(gasLanePrices), len(fromKeys))
+ }
+ // Create separate jobs for each gas lane and register their keys
+ for i, keys := range fromKeys {
+ var keyStrs []string
+ for _, k := range keys {
+ keyStrs = append(keyStrs, k.Address.String())
+ }
+
+ vrfkey, err := app.GetKeyStore().VRF().Create()
+ require.NoError(t, err)
+
+ jid := uuid.New()
+ incomingConfs := 2
+ s := testspecs.GenerateVRFSpec(testspecs.VRFSpecParams{
+ JobID: jid.String(),
+ Name: fmt.Sprintf("vrf-primary-%d", i),
+ CoordinatorAddress: coordinatorAddress.Hex(),
+ BatchCoordinatorAddress: batchCoordinatorAddress.Hex(),
+ BatchFulfillmentEnabled: batchEnabled,
+ MinIncomingConfirmations: incomingConfs,
+ PublicKey: vrfkey.PublicKey.String(),
+ FromAddresses: keyStrs,
+ BackoffInitialDelay: 10 * time.Millisecond,
+ BackoffMaxDelay: time.Second,
+ V2: true,
+ GasLanePrice: gasLanePrices[i],
+ VRFOwnerAddress: uni.vrfOwnerAddressNew.Hex(),
+ CustomRevertsPipelineEnabled: true,
+ EVMChainID: chainID.String(),
+ }).Toml()
+ jb, err := vrfcommon.ValidatedVRFSpec(s)
+ t.Log(jb.VRFSpec.PublicKey.MustHash(), vrfkey.PublicKey.MustHash())
+ require.NoError(t, err)
+ err = app.JobSpawner().CreateJob(&jb)
+ require.NoError(t, err)
+ registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, coordinator, vrfkey, ptr(gasLanePrices[i].ToInt().Uint64()))
+ jobs = append(jobs, jb)
+ vrfKeyIDs = append(vrfKeyIDs, vrfkey.ID())
+ }
+ // Wait until all jobs are active and listening for logs
+ gomega.NewWithT(t).Eventually(func() bool {
+ jbs := app.JobSpawner().ActiveJobs()
+ var count int
+ for _, jb := range jbs {
+ if jb.Type == job.VRF {
+ count++
+ }
+ }
+ return count == len(fromKeys)
+ }, testutils.WaitTimeout(t), 100*time.Millisecond).Should(gomega.BeTrue())
+ // Unfortunately the lb needs heads to be able to backfill logs to new subscribers.
+ // To avoid confirming
+ // TODO: it could just backfill immediately upon receiving a new subscriber? (though would
+ // only be useful for tests, probably a more robust way is to have the job spawner accept a signal that a
+ // job is fully up and running and not add it to the active jobs list before then)
+ time.Sleep(2 * time.Second)
+ return
+}
+
+// Get txn receipt from txstore DB for a given txID. Useful to get status
+// of a txn on chain, to check if it reverted or not
+func getTxnReceiptDB(db *sqlx.DB, txesID int64) ([]v2.TxnReceiptDB, error) {
+ sqlQuery := `
+ WITH txes AS (
+ SELECT *
+ FROM evm.txes
+ WHERE (state = 'confirmed' OR state = 'unconfirmed')
+ AND id = $1
+ ), attempts AS (
+ SELECT *
+ FROM evm.tx_attempts
+ WHERE eth_tx_id IN (SELECT id FROM txes)
+ ), receipts AS (
+ SELECT *
+ FROM evm.receipts
+ WHERE tx_hash IN (SELECT hash FROM attempts)
+ )
+ SELECT r.tx_hash,
+ r.receipt,
+ t.from_address,
+ t.meta->>'SubId' as sub_id,
+ COALESCE(t.meta->>'RequestID', '') as request_id,
+ COALESCE(t.meta->>'RequestTxHash', '') as request_tx_hash,
+ COALESCE(t.meta->>'ForceFulfillmentAttempt', '0') as force_fulfillment_attempt
+ FROM receipts r
+ INNER JOIN attempts a ON r.tx_hash = a.hash
+ INNER JOIN txes t ON a.eth_tx_id = t.id
+ `
+ var recentReceipts []v2.TxnReceiptDB
+ var err error
+ if txesID != -1 {
+ err = db.Select(&recentReceipts, sqlQuery, txesID)
+ } else {
+ sqlQuery = strings.Replace(sqlQuery, "AND id = $1", "AND meta->>'ForceFulfilled' IS NOT NULL", 1)
+ err = db.Select(&recentReceipts, sqlQuery)
+ }
+ if err != nil && !errors.Is(err, sql.ErrNoRows) {
+ return nil, errors.Wrap(err, "fetch_failed_receipts_txm")
+ }
+
+ return recentReceipts, nil
+}
+
+// Type to store VRF req details like requestID, proof, reqCommitment
+type vrfReq struct {
+ requestID *big.Int
+ callbackGasLimit uint32
+ numWords uint32
+ txID int64
+ requestTxHash *common.Hash
+ proof *vrf_coordinator_v2.VRFProof
+ reqCommitment *vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment
+}
+
+// Type to store VRF sub details like subID, balance
+type vrfSub struct {
+ subID uint64
+ balance uint64
+}
+
+// Test harness for handling reverted txns functionality
+type revertTxnTH struct {
+ // VRF Key Details
+ key1 ethkey.KeyV2
+ key2 ethkey.KeyV2
+ vrfKeyID string
+ keyHash [32]byte
+
+ // CL Node Details
+ chainID *big.Int
+ app *cltest.TestApplication
+ db *sqlx.DB
+
+ // Contract Details
+ uni *coordinatorV2Universe
+ eoaConsumer *vrf_external_sub_owner_example.VRFExternalSubOwnerExample
+ eoaConsumerAddr common.Address
+
+ // VRF Req Details
+ subs []*vrfSub
+}
+
+// Constructor for handling reverted txns test harness
+func newRevertTxnTH(t *testing.T,
+ uni *coordinatorV2Universe,
+ ownerKey ethkey.KeyV2,
+ batchEnabled bool,
+ subBalances []uint64) (th *revertTxnTH) {
+ key1 := cltest.MustGenerateRandomKey(t)
+ key2 := cltest.MustGenerateRandomKey(t)
+ gasLanePriceWei := assets.GWei(10)
+ config, db := heavyweight.FullTestDBV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
+ simulatedOverrides(t, assets.GWei(10), toml.KeySpecific{
+ // Gas lane.
+ Key: ptr(key1.EIP55Address),
+ GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei},
+ }, toml.KeySpecific{
+ // Gas lane.
+ Key: ptr(key2.EIP55Address),
+ GasEstimator: toml.KeySpecificGasEstimator{PriceMax: gasLanePriceWei},
+ })(c, s)
+ c.EVM[0].MinIncomingConfirmations = ptr[uint32](2)
+ })
+ app := cltest.NewApplicationWithConfigV2AndKeyOnSimulatedBlockchain(t, config, uni.backend, ownerKey, key1, key2)
+
+ th = &revertTxnTH{
+ key1: key1,
+ key2: key2,
+ app: app,
+ db: db,
+ uni: uni,
+ subs: make([]*vrfSub, len(subBalances)),
+ }
+ coordinator := uni.rootContract
+ coordinatorAddress := uni.rootContractAddress
+ th.chainID = th.uni.backend.Blockchain().Config().ChainID
+ var err error
+
+ th.eoaConsumerAddr, _, th.eoaConsumer, err = vrf_external_sub_owner_example.DeployVRFExternalSubOwnerExample(
+ uni.neil,
+ uni.backend,
+ coordinatorAddress,
+ uni.linkContractAddress,
+ )
+ require.NoError(t, err, "failed to deploy eoa consumer")
+ uni.backend.Commit()
+
+ for i := 0; i < len(subBalances); i++ {
+ subID := uint64(i + 1)
+ setupSub(t, th, subID, subBalances[i])
+ th.subs[i] = &vrfSub{subID: subID, balance: subBalances[i]}
+ }
+
+ // Fund gas lanes.
+ sendEth(t, ownerKey, uni.backend, key1.Address, 10)
+ sendEth(t, ownerKey, uni.backend, key2.Address, 10)
+ require.NoError(t, app.Start(testutils.Context(t)))
+
+ // Create VRF job using key1 and key2 on the same gas lane.
+ jbs, vrfKeyIDs := createVRFJobsNew(
+ t,
+ [][]ethkey.KeyV2{{key1, key2}},
+ app,
+ uni.rootContract,
+ uni.rootContractAddress,
+ uni.batchCoordinatorContractAddress,
+ *uni,
+ batchEnabled,
+ th.chainID,
+ gasLanePriceWei)
+ vrfKey := jbs[0].VRFSpec.PublicKey
+
+ th.keyHash = vrfKey.MustHash()
+ th.vrfKeyID = vrfKeyIDs[0]
+
+ // Transfer ownership of the VRF coordinator to the VRF owner,
+ // which is critical for this test.
+ t.Log("vrf owner address:", uni.vrfOwnerAddressNew)
+ _, err = coordinator.TransferOwnership(uni.neil, uni.vrfOwnerAddressNew)
+ require.NoError(t, err, "unable to TransferOwnership of VRF coordinator to VRFOwner")
+ uni.backend.Commit()
+
+ _, err = uni.vrfOwnerNew.AcceptVRFOwnership(uni.neil)
+ require.NoError(t, err, "unable to Accept VRF Ownership")
+ uni.backend.Commit()
+
+ actualCoordinatorAddr, err := uni.vrfOwnerNew.GetVRFCoordinator(nil)
+ require.NoError(t, err)
+ require.Equal(t, coordinatorAddress, actualCoordinatorAddr)
+
+ // Add allowed callers so that the oracle can call fulfillRandomWords
+ // on VRFOwner.
+ _, err = uni.vrfOwnerNew.SetAuthorizedSenders(uni.neil, []common.Address{
+ key1.EIP55Address.Address(),
+ key2.EIP55Address.Address(),
+ })
+ require.NoError(t, err, "unable to update authorized senders in VRFOwner")
+ uni.backend.Commit()
+
+ return th
+}
+
+func setupSub(t *testing.T, th *revertTxnTH, subID uint64, balance uint64) {
+ uni := th.uni
+ coordinator := uni.rootContract
+ coordinatorAddress := uni.rootContractAddress
+ var err error
+
+ // Create a subscription and fund with amount specified
+ _, err = coordinator.CreateSubscription(uni.neil)
+ require.NoError(t, err, "failed to create eoa sub")
+ uni.backend.Commit()
+
+ // Fund the sub
+ b, err := evmutils.ABIEncode(`[{"type":"uint64"}]`, subID)
+ require.NoError(t, err)
+ _, err = uni.linkContract.TransferAndCall(
+ uni.sergey, coordinatorAddress, big.NewInt(int64(balance)), b)
+ require.NoError(t, err, "failed to fund sub")
+ uni.backend.Commit()
+
+ // Add the consumer to the sub
+ subIDBig := big.NewInt(int64(subID))
+ _, err = coordinator.AddConsumer(uni.neil, subIDBig, th.eoaConsumerAddr)
+ require.NoError(t, err, "failed to add consumer")
+ uni.backend.Commit()
+
+ // Check the subscription state
+ sub, err := coordinator.GetSubscription(nil, subIDBig)
+ consumers := sub.Consumers()
+ require.NoError(t, err, "failed to get subscription with id %d", subID)
+ require.Equal(t, big.NewInt(int64(balance)), sub.Balance())
+ require.Equal(t, 1, len(consumers))
+ require.Equal(t, th.eoaConsumerAddr, consumers[0])
+ require.Equal(t, uni.neil.From, sub.Owner())
+}
diff --git a/core/services/vrf/v2/integration_v2_test.go b/core/services/vrf/v2/integration_v2_test.go
index d415793ede4..39acc3da3e5 100644
--- a/core/services/vrf/v2/integration_v2_test.go
+++ b/core/services/vrf/v2/integration_v2_test.go
@@ -87,6 +87,8 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/utils"
)
+var defaultMaxGasPrice = uint64(1e12)
+
type coordinatorV2UniverseCommon struct {
// Golang wrappers of solidity contracts
consumerContracts []vrftesthelpers.VRFConsumerContract
@@ -128,6 +130,8 @@ type coordinatorV2Universe struct {
coordinatorV2UniverseCommon
vrfOwner *vrf_owner.VRFOwner
vrfOwnerAddress common.Address
+ vrfOwnerNew *vrf_owner.VRFOwner
+ vrfOwnerAddressNew common.Address
oldRootContract v22.CoordinatorV2_X
oldRootContractAddress common.Address
oldBatchCoordinatorContract *batch_vrf_coordinator_v2.BatchVRFCoordinatorV2
@@ -239,6 +243,12 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in
require.NoError(t, err, "failed to deploy VRFOwner contract to simulated ethereum blockchain")
backend.Commit()
+ vrfOwnerAddressNew, _, vrfOwnerNew, err := vrf_owner.DeployVRFOwner(
+ neil, backend, coordinatorAddress,
+ )
+ require.NoError(t, err, "failed to deploy VRFOwner contract for vrfOwnerNew to simulated ethereum blockchain")
+ backend.Commit()
+
// Deploy batch VRF V2 coordinator
oldBatchCoordinatorAddress, _, oldBatchCoordinatorContract, err :=
batch_vrf_coordinator_v2.DeployBatchVRFCoordinatorV2(
@@ -408,6 +418,8 @@ func newVRFCoordinatorV2Universe(t *testing.T, key ethkey.KeyV2, numConsumers in
},
vrfOwner: vrfOwner,
vrfOwnerAddress: vrfOwnerAddress,
+ vrfOwnerNew: vrfOwnerNew,
+ vrfOwnerAddressNew: vrfOwnerAddressNew,
oldRootContractAddress: oldRootContractAddress,
oldRootContract: v22.NewCoordinatorV2(oldRootContract),
oldBatchCoordinatorContract: oldBatchCoordinatorContract,
@@ -564,7 +576,7 @@ func createVRFJobs(
t.Log(jb.VRFSpec.PublicKey.MustHash(), vrfkey.PublicKey.MustHash())
err = app.JobSpawner().CreateJob(&jb)
require.NoError(t, err)
- registerProvingKeyHelper(t, uni, coordinator, vrfkey)
+ registerProvingKeyHelper(t, uni, coordinator, vrfkey, ptr(gasLanePrices[i].ToInt().Uint64()))
jobs = append(jobs, jb)
}
// Wait until all jobs are active and listening for logs
@@ -830,6 +842,22 @@ func mineBatch(t *testing.T, requestIDs []*big.Int, subID *big.Int, backend *bac
}, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())
}
+func mineForceFulfilled(t *testing.T, requestID *big.Int, subID uint64, forceFulfilledCount int64, uni coordinatorV2Universe, db *sqlx.DB) bool {
+ return gomega.NewWithT(t).Eventually(func() bool {
+ uni.backend.Commit()
+ var txs []txmgr.DbEthTx
+ err := db.Select(&txs, `
+ SELECT * FROM evm.txes
+ WHERE evm.txes.state = 'confirmed'
+ AND evm.txes.meta->>'RequestID' = $1
+ AND CAST(evm.txes.meta->>'SubId' AS NUMERIC) = $2 ORDER BY created_at DESC
+ `, common.BytesToHash(requestID.Bytes()).String(), subID)
+ require.NoError(t, err)
+ t.Log("num txs", len(txs))
+ return len(txs) == int(forceFulfilledCount)
+ }, testutils.WaitTimeout(t), time.Second).Should(gomega.BeTrue())
+}
+
func TestVRFV2Integration_SingleConsumer_ForceFulfillment(t *testing.T) {
t.Parallel()
ownerKey := cltest.MustGenerateRandomKey(t)
@@ -1481,16 +1509,22 @@ func simulatedOverrides(t *testing.T, defaultGasPrice *assets.Wei, ks ...toml.Ke
}
}
-func registerProvingKeyHelper(t *testing.T, uni coordinatorV2UniverseCommon, coordinator v22.CoordinatorV2_X, vrfkey vrfkey.KeyV2) {
+func registerProvingKeyHelper(t *testing.T, uni coordinatorV2UniverseCommon, coordinator v22.CoordinatorV2_X, vrfkey vrfkey.KeyV2, gasLaneMaxGas *uint64) {
// Register a proving key associated with the VRF job.
p, err := vrfkey.PublicKey.Point()
require.NoError(t, err)
if uni.rootContract.Version() == vrfcommon.V2Plus {
+ if gasLaneMaxGas == nil {
+ t.Error("gasLaneMaxGas must be non-nil for V2+")
+ }
_, err = coordinator.RegisterProvingKey(
- uni.neil, nil, pair(secp256k1.Coordinates(p)))
+ uni.neil, nil, pair(secp256k1.Coordinates(p)), gasLaneMaxGas)
} else {
+ if gasLaneMaxGas != nil {
+ t.Log("gasLaneMaxGas is ignored for V2")
+ }
_, err = coordinator.RegisterProvingKey(
- uni.neil, &uni.nallory.From, pair(secp256k1.Coordinates(p)))
+ uni.neil, &uni.nallory.From, pair(secp256k1.Coordinates(p)), nil)
}
require.NoError(t, err)
uni.backend.Commit()
@@ -1811,7 +1845,7 @@ func TestRequestCost(t *testing.T) {
vrfkey, err := app.GetKeyStore().VRF().Create()
require.NoError(t, err)
- registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey)
+ registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey, nil)
t.Run("non-proxied consumer", func(tt *testing.T) {
carol := uni.vrfConsumers[0]
carolContract := uni.consumerContracts[0]
@@ -1916,7 +1950,7 @@ func TestFulfillmentCost(t *testing.T) {
vrfkey, err := app.GetKeyStore().VRF().Create()
require.NoError(t, err)
- registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey)
+ registerProvingKeyHelper(t, uni.coordinatorV2UniverseCommon, uni.rootContract, vrfkey, nil)
var (
nonProxiedConsumerGasEstimate uint64
@@ -1943,7 +1977,7 @@ func TestFulfillmentCost(t *testing.T) {
uni.backend.Commit()
}
- requestLog := FindLatestRandomnessRequestedLog(tt, uni.rootContract, vrfkey.PublicKey.MustHash())
+ requestLog := FindLatestRandomnessRequestedLog(tt, uni.rootContract, vrfkey.PublicKey.MustHash(), nil)
s, err := proof.BigToSeed(requestLog.PreSeed())
require.NoError(t, err)
proof, rc, err := proof.GenerateProofResponseV2(app.GetKeyStore().VRF(), vrfkey.ID(), proof.PreSeedDataV2{
@@ -1984,7 +2018,7 @@ func TestFulfillmentCost(t *testing.T) {
uni.backend.Commit()
}
- requestLog := FindLatestRandomnessRequestedLog(t, uni.rootContract, vrfkey.PublicKey.MustHash())
+ requestLog := FindLatestRandomnessRequestedLog(t, uni.rootContract, vrfkey.PublicKey.MustHash(), nil)
require.Equal(tt, subId, requestLog.SubID())
s, err := proof.BigToSeed(requestLog.PreSeed())
require.NoError(t, err)
@@ -2197,15 +2231,39 @@ func TestStartingCountsV1(t *testing.T) {
assert.Equal(t, uint64(2), countsV2[big.NewInt(0x12).String()])
}
+func TestVRFV2Integration_ReplayOldRequestsOnStartUp(t *testing.T) {
+ t.Parallel()
+ ownerKey := cltest.MustGenerateRandomKey(t)
+ uni := newVRFCoordinatorV2Universe(t, ownerKey, 1)
+
+ testReplayOldRequestsOnStartUp(
+ t,
+ ownerKey,
+ uni.coordinatorV2UniverseCommon,
+ uni.vrfConsumers[0],
+ uni.consumerContracts[0],
+ uni.consumerContractAddresses[0],
+ uni.rootContract,
+ uni.rootContractAddress,
+ uni.batchCoordinatorContractAddress,
+ nil,
+ vrfcommon.V2,
+ false,
+ )
+}
+
func FindLatestRandomnessRequestedLog(t *testing.T,
coordContract v22.CoordinatorV2_X,
- keyHash [32]byte) v22.RandomWordsRequested {
+ keyHash [32]byte,
+ requestID *big.Int) v22.RandomWordsRequested {
var rf []v22.RandomWordsRequested
gomega.NewWithT(t).Eventually(func() bool {
rfIterator, err2 := coordContract.FilterRandomWordsRequested(nil, [][32]byte{keyHash}, nil, []common.Address{})
require.NoError(t, err2, "failed to logs")
for rfIterator.Next() {
- rf = append(rf, rfIterator.Event())
+ if requestID == nil || requestID.Cmp(rfIterator.Event().RequestID()) == 0 {
+ rf = append(rf, rfIterator.Event())
+ }
}
return len(rf) >= 1
}, testutils.WaitTimeout(t), 500*time.Millisecond).Should(gomega.BeTrue())
diff --git a/core/services/vrf/v2/listener_v2.go b/core/services/vrf/v2/listener_v2.go
index 6556bbd2186..cb87921e86b 100644
--- a/core/services/vrf/v2/listener_v2.go
+++ b/core/services/vrf/v2/listener_v2.go
@@ -191,6 +191,15 @@ func (lsn *listenerV2) Start(ctx context.Context) error {
}
lsn.respCount = respCount
+ if lsn.job.VRFSpec.CustomRevertsPipelineEnabled && lsn.vrfOwner != nil && lsn.job.VRFSpec.VRFOwnerAddress != nil {
+ // Start reverted txns handler in background
+ lsn.wg.Add(1)
+ go func() {
+ defer lsn.wg.Done()
+ lsn.runRevertedTxnsHandler(spec.PollPeriod)
+ }()
+ }
+
// Log listener gathers request logs and processes them
lsn.wg.Add(1)
go func() {
diff --git a/core/services/vrf/v2/listener_v2_log_processor.go b/core/services/vrf/v2/listener_v2_log_processor.go
index eebe9038c0c..be9457d7cee 100644
--- a/core/services/vrf/v2/listener_v2_log_processor.go
+++ b/core/services/vrf/v2/listener_v2_log_processor.go
@@ -155,22 +155,21 @@ func (lsn *listenerV2) processPendingVRFRequests(ctx context.Context, pendingReq
Context: ctx}, sID)
if err != nil {
- if strings.Contains(err.Error(), "execution reverted") {
- // "execution reverted" indicates that the subscription no longer exists.
- // We can no longer just mark these as processed and continue,
- // since it could be that the subscription was canceled while there
- // were still unfulfilled requests.
- // The simplest approach to handle this is to enter the processRequestsPerSub
- // loop rather than create a bunch of largely duplicated code
- // to handle this specific situation, since we need to run the pipeline to get
- // the VRF proof, abi-encode it, etc.
- l.Warnw("Subscription not found - setting start balance to zero", "subID", subID, "err", err)
- startLinkBalance = big.NewInt(0)
- } else {
+ if !strings.Contains(err.Error(), "execution reverted") {
// Most likely this is an RPC error, so we re-try later.
l.Errorw("Unable to read subscription balance", "err", err)
return
}
+ // "execution reverted" indicates that the subscription no longer exists.
+ // We can no longer just mark these as processed and continue,
+ // since it could be that the subscription was canceled while there
+ // were still unfulfilled requests.
+ // The simplest approach to handle this is to enter the processRequestsPerSub
+ // loop rather than create a bunch of largely duplicated code
+ // to handle this specific situation, since we need to run the pipeline to get
+ // the VRF proof, abi-encode it, etc.
+ l.Warnw("Subscription not found - setting start balance to zero", "subID", subID, "err", err)
+ startLinkBalance = big.NewInt(0)
} else {
// Happy path - sub is active.
startLinkBalance = sub.Balance()
diff --git a/core/services/vrf/v2/reverted_txns.go b/core/services/vrf/v2/reverted_txns.go
new file mode 100644
index 00000000000..5aead146f5f
--- /dev/null
+++ b/core/services/vrf/v2/reverted_txns.go
@@ -0,0 +1,722 @@
+package v2
+
+import (
+ "bytes"
+ "context"
+ "database/sql"
+ "fmt"
+ "strconv"
+ "strings"
+ "time"
+
+ "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/common/hexutil"
+ "github.com/ethereum/go-ethereum/crypto"
+ "github.com/pkg/errors"
+
+ txmgrcommon "github.com/smartcontractkit/chainlink/v2/common/txmgr"
+ evmclient "github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
+ evmtypes "github.com/smartcontractkit/chainlink/v2/core/chains/evm/types"
+ evmutils "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2"
+ "github.com/smartcontractkit/chainlink/v2/core/services/pg"
+ "github.com/smartcontractkit/chainlink/v2/core/utils"
+)
+
+type (
+ TxnReceiptDB struct {
+ TxHash common.Hash `db:"tx_hash"`
+ EVMReceipt evmtypes.Receipt `db:"receipt"`
+ FromAddress common.Address `db:"from_address"`
+ ToAddress common.Address `db:"to_address"`
+ EncodedPayload hexutil.Bytes `db:"encoded_payload"`
+ GasLimit uint64 `db:"gas_limit"`
+ SubID uint64 `db:"sub_id"`
+ RequestID string `db:"request_id"`
+ RequestTxHash string `db:"request_tx_hash"`
+ ForceFulfillmentAttempt uint64 `db:"force_fulfillment_attempt"`
+ }
+
+ RevertedVRFTxn struct {
+ DBReceipt TxnReceiptDB
+ IsBatchReq bool
+ Proof vrf_coordinator_v2.VRFProof
+ Commitment vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment
+ }
+)
+
+var ReqScanTimeRangeInDB = "1 hour"
+
+func (lsn *listenerV2) runRevertedTxnsHandler(pollPeriod time.Duration) {
+ pollPeriod = pollPeriod + time.Second*3
+ tick := time.NewTicker(pollPeriod)
+ defer tick.Stop()
+ ctx, cancel := lsn.chStop.NewCtx()
+ defer cancel()
+ for {
+ select {
+ case <-lsn.chStop:
+ return
+ case <-tick.C:
+ lsn.handleRevertedTxns(ctx, pollPeriod)
+ }
+ }
+}
+
+func (lsn *listenerV2) handleRevertedTxns(ctx context.Context, pollPeriod time.Duration) {
+ lsn.l.Infow("Handling reverted txns")
+
+ // Fetch recent single and batch txns, that have not been force-fulfilled
+ recentSingleTxns, err := lsn.fetchRecentSingleTxns(ctx, lsn.q, lsn.chainID.Uint64(), pollPeriod)
+ if err != nil {
+ lsn.l.Fatalw("Fetch recent txns", "err", err)
+ }
+ recentBatchTxns, err := lsn.fetchRecentBatchTxns(ctx, lsn.q, lsn.chainID.Uint64(), pollPeriod)
+ if err != nil {
+ lsn.l.Fatalw("Fetch recent batch txns", "err", err)
+ }
+ recentForceFulfillmentTxns, err := lsn.fetchRevertedForceFulfilmentTxns(ctx, lsn.q, lsn.chainID.Uint64(), pollPeriod)
+ if err != nil {
+ lsn.l.Fatalw("Fetch recent reverted force-fulfillment txns", "err", err)
+ }
+ recentTxns := make([]TxnReceiptDB, 0)
+ if len(recentSingleTxns) > 0 {
+ recentTxns = append(recentTxns, recentSingleTxns...)
+ }
+ if len(recentBatchTxns) > 0 {
+ recentTxns = append(recentTxns, recentBatchTxns...)
+ }
+ if len(recentForceFulfillmentTxns) > 0 {
+ recentTxns = append(recentTxns, recentForceFulfillmentTxns...)
+ }
+
+ // Query RPC using TransactionByHash to get the transaction object
+ revertedTxns := lsn.filterRevertedTxns(ctx, recentTxns)
+
+ // Extract calldata of function call from transaction object
+ for _, revertedTxn := range revertedTxns {
+ // Pass that to txm to create a new tx for force fulfillment
+ _, err := lsn.enqueueForceFulfillmentForRevertedTxn(ctx, revertedTxn)
+ if err != nil {
+ lsn.l.Errorw("Enqueue force fulfilment", "err", err)
+ }
+ }
+}
+
+func (lsn *listenerV2) fetchRecentSingleTxns(ctx context.Context,
+ q pg.Q,
+ chainID uint64,
+ pollPeriod time.Duration) ([]TxnReceiptDB, error) {
+
+ // (state = 'confirmed' OR state = 'unconfirmed')
+ sqlQuery := fmt.Sprintf(`
+ WITH already_ff as (
+ SELECT meta->>'RequestID' as request_id
+ FROM evm.txes
+ WHERE created_at >= NOW() - interval '%s'
+ AND evm_chain_id = $1
+ AND meta->>'ForceFulfilled' is NOT NULL
+ ), txes AS (
+ SELECT *
+ FROM evm.txes
+ WHERE created_at >= NOW() - interval '%s'
+ AND evm_chain_id = $1
+ AND meta->>'SubId' IS NOT NULL
+ AND meta->>'RequestID' IS NOT NULL
+ AND meta->>'ForceFulfilled' is NULL
+ AND meta->>'RequestID' NOT IN (SELECT request_id FROM already_ff)
+ ), attempts AS (
+ SELECT *
+ FROM evm.tx_attempts
+ WHERE eth_tx_id IN (SELECT id FROM txes)
+ ), receipts AS (
+ SELECT *
+ FROM evm.receipts
+ WHERE tx_hash IN (SELECT hash FROM attempts)
+ AND receipt->>'status' = '0x0'
+ )
+ SELECT r.tx_hash,
+ r.receipt,
+ t.from_address,
+ t.to_address,
+ t.encoded_payload,
+ t.gas_limit,
+ t.meta->>'SubId' as sub_id,
+ t.meta->>'RequestID' as request_id,
+ t.meta->>'RequestTxHash' as request_tx_hash
+ FROM receipts r
+ INNER JOIN attempts a ON r.tx_hash = a.hash
+ INNER JOIN txes t ON a.eth_tx_id = t.id
+ `, ReqScanTimeRangeInDB, ReqScanTimeRangeInDB)
+ var recentReceipts []TxnReceiptDB
+
+ before := time.Now()
+ err := q.Select(&recentReceipts, sqlQuery, chainID)
+ lsn.postSqlLog(ctx, before, pollPeriod, "FetchRecentSingleTxns")
+ if err != nil && !errors.Is(err, sql.ErrNoRows) {
+ return nil, errors.Wrap(err, "Error fetching recent non-force-fulfilled txns")
+ }
+
+ recentReceipts = unique(recentReceipts)
+ lsn.l.Infow("finished querying for recently reverting single fulfillments",
+ "count", len(recentReceipts),
+ )
+ for _, r := range recentReceipts {
+ lsn.l.Infow("found reverted fulfillment", "requestID", r.RequestID, "fulfillmentTxHash", r.TxHash.String())
+ }
+ return recentReceipts, nil
+}
+
+func (lsn *listenerV2) fetchRecentBatchTxns(ctx context.Context,
+ q pg.Q,
+ chainID uint64,
+ pollPeriod time.Duration) ([]TxnReceiptDB, error) {
+ sqlQuery := fmt.Sprintf(`
+ WITH already_ff as (
+ SELECT meta->>'RequestID' as request_id
+ FROM evm.txes
+ WHERE created_at >= NOW() - interval '%s'
+ AND evm_chain_id = $1
+ AND meta->>'ForceFulfilled' is NOT NULL
+ ), txes AS (
+ SELECT *
+ FROM (
+ SELECT *
+ FROM evm.txes
+ WHERE created_at >= NOW() - interval '%s'
+ AND evm_chain_id = $1
+ AND meta->>'SubId' IS NOT NULL
+ AND meta->>'RequestIDs' IS NOT NULL
+ AND meta->>'ForceFulfilled' IS NULL
+ ) AS eth_txes1
+ WHERE (meta->'RequestIDs' ?| (SELECT ARRAY_AGG(request_id) FROM already_ff)) IS NOT TRUE
+ ), attempts AS (
+ SELECT *
+ FROM evm.tx_attempts
+ WHERE eth_tx_id IN (SELECT id FROM txes)
+ ), receipts AS (
+ SELECT *
+ FROM evm.receipts
+ WHERE tx_hash IN (SELECT hash FROM attempts)
+ )
+ SELECT r.tx_hash,
+ r.receipt,
+ t.from_address,
+ t.to_address,
+ t.encoded_payload,
+ t.gas_limit,
+ t.meta->>'SubId' as sub_id
+ FROM receipts r
+ INNER JOIN attempts a ON r.tx_hash = a.hash
+ INNER JOIN txes t ON a.eth_tx_id = t.id
+ `, ReqScanTimeRangeInDB, ReqScanTimeRangeInDB)
+ var recentReceipts []TxnReceiptDB
+
+ before := time.Now()
+ err := q.Select(&recentReceipts, sqlQuery, chainID)
+ lsn.postSqlLog(ctx, before, pollPeriod, "FetchRecentBatchTxns")
+ if err != nil && !errors.Is(err, sql.ErrNoRows) {
+ return nil, errors.Wrap(err, "Error fetching recent non-force-fulfilled txns")
+ }
+
+ recentReceipts = unique(recentReceipts)
+ lsn.l.Infow("finished querying for recent batch fulfillments",
+ "count", len(recentReceipts),
+ )
+ return recentReceipts, nil
+}
+
+func (lsn *listenerV2) fetchRevertedForceFulfilmentTxns(ctx context.Context,
+ q pg.Q,
+ chainID uint64,
+ pollPeriod time.Duration) ([]TxnReceiptDB, error) {
+
+ sqlQuery := fmt.Sprintf(`
+ WITH txes AS (
+ SELECT *
+ FROM evm.txes
+ WHERE created_at >= NOW() - interval '%s'
+ AND evm_chain_id = $1
+ AND meta->>'SubId' IS NOT NULL
+ AND meta->>'RequestID' IS NOT NULL
+ AND meta->>'ForceFulfilled' is NOT NULL
+ ), attempts AS (
+ SELECT *
+ FROM evm.tx_attempts
+ WHERE eth_tx_id IN (SELECT id FROM txes)
+ ), receipts AS (
+ SELECT *
+ FROM evm.receipts
+ WHERE tx_hash IN (SELECT hash FROM attempts)
+ AND receipt->>'status' = '0x0'
+ )
+ SELECT r.tx_hash,
+ r.receipt,
+ t.from_address,
+ t.to_address,
+ t.encoded_payload,
+ t.gas_limit,
+ t.meta->>'SubId' as sub_id,
+ t.meta->>'RequestID' as request_id,
+ t.meta->>'RequestTxHash' as request_tx_hash,
+ CAST(COALESCE(t.meta->>'ForceFulfillmentAttempt', '0') AS INT) as force_fulfillment_attempt
+ FROM receipts r
+ INNER JOIN attempts a ON r.tx_hash = a.hash
+ INNER JOIN txes t ON a.eth_tx_id = t.id
+ `, ReqScanTimeRangeInDB)
+ var recentReceipts []TxnReceiptDB
+
+ before := time.Now()
+ err := q.Select(&recentReceipts, sqlQuery, chainID)
+ lsn.postSqlLog(ctx, before, pollPeriod, "FetchRevertedForceFulfilmentTxns")
+ if err != nil && !errors.Is(err, sql.ErrNoRows) {
+ return nil, errors.Wrap(err, "Error fetching recent reverted force-fulfilled txns")
+ }
+
+ sqlQueryAll := fmt.Sprintf(`
+ WITH txes AS (
+ SELECT *
+ FROM evm.txes
+ WHERE created_at >= NOW() - interval '%s'
+ AND evm_chain_id = $1
+ AND meta->>'SubId' IS NOT NULL
+ AND meta->>'RequestID' IS NOT NULL
+ AND meta->>'ForceFulfilled' is NOT NULL
+ ), attempts AS (
+ SELECT *
+ FROM evm.tx_attempts
+ WHERE eth_tx_id IN (SELECT id FROM txes)
+ )
+ SELECT a.hash as tx_hash,
+ t.meta->>'SubId' as sub_id,
+ t.meta->>'RequestID' as request_id,
+ CAST(COALESCE(t.meta->>'ForceFulfillmentAttempt', '0') AS INT) as force_fulfillment_attempt
+ FROM attempts a
+ INNER JOIN txes t ON a.eth_tx_id = t.id
+ `, ReqScanTimeRangeInDB)
+ var allReceipts []TxnReceiptDB
+ before = time.Now()
+ err = q.Select(&allReceipts, sqlQueryAll, chainID)
+ lsn.postSqlLog(ctx, before, pollPeriod, "Fetch all ForceFulfilment Txns")
+ if err != nil && !errors.Is(err, sql.ErrNoRows) {
+ return nil, errors.Wrap(err, "Error fetching all recent force-fulfilled txns")
+ }
+
+ recentReceipts = UniqueByReqID(recentReceipts, allReceipts)
+
+ lsn.l.Infow("finished querying for recently reverting reverted force-fulfillment txns",
+ "count", len(recentReceipts),
+ )
+ for _, r := range recentReceipts {
+ lsn.l.Infow("found reverted force-fulfillment txn", "requestID", r.RequestID,
+ "fulfillmentTxHash", r.TxHash.String(),
+ "ForceFulfillmentAttempt", r.ForceFulfillmentAttempt)
+ }
+ return unique(recentReceipts), nil
+}
+
+func unique(rs []TxnReceiptDB) (res []TxnReceiptDB) {
+ if len(rs) == 0 {
+ return
+ }
+ exists := make(map[string]bool)
+ res = make([]TxnReceiptDB, 0)
+ for _, r := range rs {
+ if _, ok := exists[r.TxHash.Hex()]; ok {
+ continue
+ }
+ res = append(res, r)
+ exists[r.TxHash.Hex()] = true
+ }
+ return res
+}
+
+func UniqueByReqID(revertedForceTxns []TxnReceiptDB, allForceTxns []TxnReceiptDB) (res []TxnReceiptDB) {
+ if len(revertedForceTxns) == 0 {
+ return
+ }
+
+ // Load all force fulfillment txns into a map
+ // allForceTxns would have successful, reverted and pending force fulfillment txns
+ allForceTxnsMap := make(map[string]TxnReceiptDB)
+ for _, r := range allForceTxns {
+ if existingReceipt, ok := allForceTxnsMap[r.RequestID]; ok {
+ // Get the latest force fulfillment attempt for a given RequestID
+ if existingReceipt.ForceFulfillmentAttempt < r.ForceFulfillmentAttempt {
+ allForceTxnsMap[r.RequestID] = r
+ }
+ continue
+ }
+ allForceTxnsMap[r.RequestID] = r
+ }
+
+ // Deduplicate reverted force fulfillment txns and skip/ignore reverted
+ // force-fulfillment txns which have a pending force-fulfillment retry
+ revertedForceTxnsMap := make(map[string]TxnReceiptDB)
+ res = make([]TxnReceiptDB, 0)
+ for _, forceTxn := range revertedForceTxns {
+ // If there is a pending force fulfilment without a receipt yet, skip force-fulfilling it now again, until a txn receipt
+ // This prevents a race between this Custom-VRF-Reverted-Txns-Pipeline and TransactionManager
+ if receipt, ok := allForceTxnsMap[forceTxn.RequestID]; ok && receipt.ForceFulfillmentAttempt > forceTxn.ForceFulfillmentAttempt {
+ continue
+ }
+ if existingReceipt, ok := revertedForceTxnsMap[forceTxn.RequestID]; ok {
+ // Get the latest force fulfillment attempt for a given RequestID
+ if existingReceipt.ForceFulfillmentAttempt < forceTxn.ForceFulfillmentAttempt {
+ revertedForceTxnsMap[forceTxn.RequestID] = forceTxn
+ }
+ continue
+ }
+ revertedForceTxnsMap[forceTxn.RequestID] = forceTxn
+ }
+
+ // Load the deduplicated map into a list and return
+ for _, r := range revertedForceTxnsMap {
+ res = append(res, r)
+ }
+ return res
+}
+
+// postSqlLog logs about context cancellation and timing after a query returns.
+// Queries which use their full timeout log critical level. More than 50% log error, and 10% warn.
+func (lsn *listenerV2) postSqlLog(ctx context.Context, begin time.Time, pollPeriod time.Duration, queryName string) {
+ elapsed := time.Since(begin)
+ if ctx.Err() != nil {
+ lsn.l.Debugw("SQL context canceled", "ms", elapsed.Milliseconds(), "err", ctx.Err(), "sql", queryName)
+ }
+
+ timeout := lsn.q.QueryTimeout
+ if timeout <= 0 {
+ timeout = pollPeriod
+ }
+
+ pct := float64(elapsed) / float64(timeout)
+ pct *= 100
+
+ kvs := []any{"ms", elapsed.Milliseconds(),
+ "timeout", timeout.Milliseconds(),
+ "percent", strconv.FormatFloat(pct, 'f', 1, 64),
+ "sql", queryName}
+
+ if elapsed >= timeout {
+ lsn.l.Criticalw("ExtremelySlowSQLQuery", kvs...)
+ } else if errThreshold := timeout / 5; errThreshold > 0 && elapsed > errThreshold {
+ lsn.l.Errorw("VerySlowSQLQuery", kvs...)
+ } else if warnThreshold := timeout / 10; warnThreshold > 0 && elapsed > warnThreshold {
+ lsn.l.Warnw("SlowSQLQuery", kvs...)
+ } else {
+ lsn.l.Infow("SQLQueryLatency", kvs...)
+ }
+}
+
+func (lsn *listenerV2) filterRevertedTxns(ctx context.Context,
+ recentReceipts []TxnReceiptDB) []RevertedVRFTxn {
+
+ revertedVRFTxns := make([]RevertedVRFTxn, 0)
+ for _, txnReceipt := range recentReceipts {
+ switch txnReceipt.ToAddress.Hex() {
+ case lsn.vrfOwner.Address().Hex():
+ fallthrough
+ case lsn.coordinator.Address().Hex():
+ // Filter Single VRF Fulfilment
+ revertedVRFTxn, err := lsn.filterSingleRevertedTxn(ctx, txnReceipt)
+ if err != nil {
+ lsn.l.Errorw("Filter reverted single fulfillment txn", "Err", err)
+ continue
+ }
+ // Revert reason is not insufficient balance
+ if revertedVRFTxn == nil {
+ continue
+ }
+ revertedVRFTxns = append(revertedVRFTxns, *revertedVRFTxn)
+ case lsn.batchCoordinator.Address().Hex():
+ // Filter Batch VRF Fulfilment
+ revertedBatchVRFTxns, err := lsn.filterBatchRevertedTxn(ctx, txnReceipt)
+ if err != nil {
+ lsn.l.Errorw("Filter batchfulfilment with reverted txns", "Err", err)
+ continue
+ }
+ // No req in the batch txn with insufficient balance revert reason
+ if len(revertedBatchVRFTxns) == 0 {
+ continue
+ }
+ revertedVRFTxns = append(revertedVRFTxns, revertedBatchVRFTxns...)
+ default:
+ // Unrecognised Txn
+ lsn.l.Warnw("Unrecognised txn in VRF-Reverted-Pipeline",
+ "ToAddress", txnReceipt.ToAddress.Hex(),
+ )
+ }
+ }
+
+ lsn.l.Infow("Reverted VRF fulfilment txns due to InsufficientBalance",
+ "count", len(revertedVRFTxns),
+ "reverted_txns", revertedVRFTxns,
+ )
+ for _, r := range revertedVRFTxns {
+ lsn.l.Infow("Reverted VRF fulfilment txns due to InsufficientBalance",
+ "RequestID", r.DBReceipt.RequestID,
+ "TxnStoreEVMReceipt.BlockHash", r.DBReceipt.EVMReceipt.BlockHash.String(),
+ "TxnStoreEVMReceipt.BlockNumber", r.DBReceipt.EVMReceipt.BlockNumber.String(),
+ "VRFFulfillmentTxHash", r.DBReceipt.TxHash.String())
+ }
+ return revertedVRFTxns
+}
+
+func (lsn *listenerV2) filterSingleRevertedTxn(ctx context.Context,
+ txnReceiptDB TxnReceiptDB) (
+ *RevertedVRFTxn, error) {
+
+ requestID := common.HexToHash(txnReceiptDB.RequestID).Big()
+ commitment, err := lsn.coordinator.GetCommitment(&bind.CallOpts{Context: ctx}, requestID)
+ if err != nil {
+ // Not able to get commitment from chain RPC node, continue
+ lsn.l.Errorw("Force-fulfilment of single reverted txns: Not able to get commitment from chain RPC node", "err", err)
+ } else if utils.IsEmpty(commitment[:]) {
+ // VRF request already fulfilled, return
+ return nil, nil
+ }
+ lsn.l.Infow("Single reverted txn: Unfulfilled req", "req", requestID.String())
+
+ // Get txn object from RPC node
+ ethClient := lsn.chain.Client()
+ tx, err := ethClient.TransactionByHash(ctx, txnReceiptDB.TxHash)
+ if err != nil {
+ return nil, errors.Wrap(err, "get_txn_by_hash")
+ }
+
+ // Simulate txn to get revert error
+ call := ethereum.CallMsg{
+ From: txnReceiptDB.FromAddress,
+ To: &txnReceiptDB.ToAddress,
+ Data: tx.Data(), // txnReceiptDB.EncodedPayload,
+ Gas: txnReceiptDB.GasLimit,
+ GasPrice: tx.GasPrice(),
+ }
+ _, rpcError := ethClient.CallContract(ctx, call, txnReceiptDB.EVMReceipt.BlockNumber)
+ if rpcError == nil {
+ return nil, fmt.Errorf("error fetching revert reason %v: %v", txnReceiptDB.TxHash, err)
+ }
+ revertErr, err := evmclient.ExtractRPCError(rpcError)
+ lsn.l.Infow("InsufficientBalRevertedTxn",
+ "RawRevertData", rpcError,
+ "ParsedRevertData", revertErr.Data,
+ "ParsingErr", err,
+ )
+ if err != nil {
+ return nil, fmt.Errorf("reverted_txn_reason_parse_err: %v", err)
+ }
+ revertErrDataStr := ""
+ revertErrDataBytes := []byte{}
+ if revertErr.Data != nil {
+ revertErrDataStr = revertErr.Data.(string)
+ revertErrDataStr = strings.Replace(revertErrDataStr, "Reverted ", "", 1)
+ // If force fulfillment txn reverts on chain due to getFeedData not falling back
+ // to MAXINT256 due to stalenessSeconds criteria not satisfying
+ revertErrDataBytes = common.FromHex(revertErrDataStr)
+ }
+ insufficientErr := coordinatorV2ABI.Errors["InsufficientBalance"].ID.Bytes()[0:4]
+ // Revert reason may not be accurately determined from all RPC nodes and may
+ // not work in some chains
+ if len(revertErrDataStr) > 0 && !bytes.Equal(revertErrDataBytes[0:4], insufficientErr) {
+ return nil, nil
+ }
+ // If reached maximum number of retries for force fulfillment
+ if txnReceiptDB.ForceFulfillmentAttempt >= 15 {
+ return nil, nil
+ }
+
+ // Get VRF fulfillment proof and commitment from tx object
+ txData := txnReceiptDB.EncodedPayload
+ if len(txData) <= 4 {
+ return nil, fmt.Errorf("invalid_txn_data_for_tx: %s", tx.Hash().String())
+ }
+ callData := txData[4:] // Remove first 4 bytes of function signature
+ unpacked, err := coordinatorV2ABI.Methods["fulfillRandomWords"].Inputs.Unpack(callData)
+ if err != nil {
+ return nil, fmt.Errorf("invalid_txn_data_for_tx_pack: %s, err %v", tx.Hash().String(), err)
+ }
+ proof := abi.ConvertType(unpacked[0], new(vrf_coordinator_v2.VRFProof)).(*vrf_coordinator_v2.VRFProof)
+ reqCommitment := abi.ConvertType(unpacked[1], new(vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment)).(*vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment)
+ return &RevertedVRFTxn{
+ DBReceipt: txnReceiptDB,
+ IsBatchReq: false,
+ Proof: *proof,
+ Commitment: *reqCommitment}, nil
+}
+
+func (lsn *listenerV2) filterBatchRevertedTxn(ctx context.Context,
+ txnReceiptDB TxnReceiptDB) (
+ []RevertedVRFTxn, error) {
+ if len(txnReceiptDB.EncodedPayload) <= 4 {
+ return nil, fmt.Errorf("invalid encodedPayload: %v", hexutil.Encode(txnReceiptDB.EncodedPayload))
+ }
+ unpackedInputs, err := batchCoordinatorV2ABI.Methods["fulfillRandomWords"].Inputs.Unpack(txnReceiptDB.EncodedPayload[4:])
+ if err != nil {
+ return nil, errors.Wrap(err, "cannot_unpack_batch_txn")
+ }
+ proofs := abi.ConvertType(unpackedInputs[0], new([]vrf_coordinator_v2.VRFProof)).(*[]vrf_coordinator_v2.VRFProof)
+ reqCommitments := abi.ConvertType(unpackedInputs[1], new([]vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment)).(*[]vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment)
+
+ proofReqIDs := make([]common.Hash, 0)
+ keyHash := lsn.job.VRFSpec.PublicKey.MustHash()
+ for _, proof := range *proofs {
+ payload, err := evmutils.ABIEncode(`[{"type":"bytes32"},{"type":"uint256"}]`, keyHash, proof.Seed)
+ if err != nil {
+ return nil, fmt.Errorf("ABI Encode Error: (err %v), (keyHash %v), (prood: %v)", err, keyHash, proof.Seed)
+ }
+ requestIDOfProof := common.BytesToHash(crypto.Keccak256(payload))
+ proofReqIDs = append(proofReqIDs, requestIDOfProof)
+ }
+
+ // BatchVRFCoordinatorV2
+ revertedTxns := make([]RevertedVRFTxn, 0)
+ for _, log := range txnReceiptDB.EVMReceipt.Logs {
+ if log.Topics[0] != batchCoordinatorV2ABI.Events["RawErrorReturned"].ID {
+ continue
+ }
+
+ // Extract revert reason for individual req in batch txn
+ unpacked, err := batchCoordinatorV2ABI.Events["RawErrorReturned"].Inputs.Unpack(log.Data)
+ if err != nil {
+ lsn.l.Errorw("cannot_unpack_batch_coordinator_log", "err", err)
+ continue
+ }
+ lowLevelData := unpacked[0].([]byte)
+ if !bytes.Equal(lowLevelData, coordinatorV2ABI.Errors["InsufficientBalance"].ID.Bytes()[0:4]) {
+ continue
+ }
+
+ // Match current log to a (proof, commitment) pair from rawTxData using requestID
+ requestID := log.Topics[1]
+ var curProof vrf_coordinator_v2.VRFProof
+ var curReqCommitment vrf_coordinator_v2.VRFCoordinatorV2RequestCommitment
+ found := false
+ for i, proof := range *proofs {
+ requestIDOfProof := proofReqIDs[i]
+ if requestID == requestIDOfProof {
+ found = true
+ curProof = proof
+ curReqCommitment = (*reqCommitments)[i]
+ break
+ }
+ }
+
+ if found {
+ commitment, err := lsn.coordinator.GetCommitment(&bind.CallOpts{Context: ctx}, requestID.Big())
+ if err != nil {
+ // Not able to get commitment from chain RPC node, continue
+ lsn.l.Errorw("Force-fulfilment of batch reverted txns: Not able to get commitment from chain RPC node",
+ "err", err,
+ "requestID", requestID.Big())
+ } else if utils.IsEmpty(commitment[:]) {
+ lsn.l.Infow("Batch fulfillment with initial reverted fulfillment txn and later successful fulfillment, Skipping", "req", requestID.String())
+ continue
+ }
+ lsn.l.Infow("Batch fulfillment with reverted fulfillment txn", "req", requestID.String())
+ revertedTxn := RevertedVRFTxn{
+ DBReceipt: TxnReceiptDB{
+ TxHash: txnReceiptDB.TxHash,
+ EVMReceipt: txnReceiptDB.EVMReceipt,
+ FromAddress: txnReceiptDB.FromAddress,
+ SubID: txnReceiptDB.SubID,
+ RequestID: requestID.Hex(),
+ },
+ IsBatchReq: true,
+ Proof: curProof,
+ Commitment: curReqCommitment,
+ }
+ revertedTxns = append(revertedTxns, revertedTxn)
+ } else {
+ lsn.l.Criticalw("Reverted Batch fulfilment requestID from log does not have proof in req EncodedPayload",
+ "requestIDFromLog", requestID.Big().Int64(),
+ )
+ }
+ }
+ return revertedTxns, nil
+}
+
+// enqueueForceFulfillment enqueues a forced fulfillment through the
+// VRFOwner contract. It estimates gas again on the transaction due
+// to the extra steps taken within VRFOwner.fulfillRandomWords.
+func (lsn *listenerV2) enqueueForceFulfillmentForRevertedTxn(
+ ctx context.Context,
+ revertedTxn RevertedVRFTxn,
+) (etx txmgr.Tx, err error) {
+ if lsn.job.VRFSpec.VRFOwnerAddress == nil {
+ return txmgr.Tx{}, errors.New("vrf_owner_not_set_in_job_spec")
+ }
+
+ proof := revertedTxn.Proof
+ reqCommitment := revertedTxn.Commitment
+
+ fromAddresses := lsn.fromAddresses()
+ fromAddress, err := lsn.gethks.GetRoundRobinAddress(lsn.chainID, fromAddresses...)
+ if err != nil {
+ return txmgr.Tx{}, errors.Wrap(err, "failed_to_get_vrf_listener_from_address")
+ }
+
+ // fulfill the request through the VRF owner
+ lsn.l.Infow("VRFOwner.fulfillRandomWords vs. VRFCoordinatorV2.fulfillRandomWords",
+ "vrf_owner.fulfillRandomWords", hexutil.Encode(vrfOwnerABI.Methods["fulfillRandomWords"].ID),
+ "vrf_coordinator_v2.fulfillRandomWords", hexutil.Encode(coordinatorV2ABI.Methods["fulfillRandomWords"].ID),
+ )
+
+ vrfOwnerAddress1 := lsn.vrfOwner.Address()
+ vrfOwnerAddressSpec := lsn.job.VRFSpec.VRFOwnerAddress.Address()
+ lsn.l.Infow("addresses diff", "wrapper_address", vrfOwnerAddress1, "spec_address", vrfOwnerAddressSpec)
+
+ txData, err := vrfOwnerABI.Pack("fulfillRandomWords", proof, reqCommitment)
+ if err != nil {
+ return txmgr.Tx{}, errors.Wrap(err, "abi pack VRFOwner.fulfillRandomWords")
+ }
+ vrfOwnerCoordinator, _ := lsn.vrfOwner.GetVRFCoordinator(nil)
+ lsn.l.Infow("RevertedTxnForceFulfilment EstimatingGas",
+ "EncodedPayload", hexutil.Encode(txData),
+ "VRFOwnerCoordinator", vrfOwnerCoordinator.String(),
+ )
+ ethClient := lsn.chain.Client()
+ estimateGasLimit, err := ethClient.EstimateGas(ctx, ethereum.CallMsg{
+ From: fromAddress,
+ To: &vrfOwnerAddressSpec,
+ Data: txData,
+ })
+ if err != nil {
+ return txmgr.Tx{}, errors.Wrap(err, "failed to estimate gas on VRFOwner.fulfillRandomWords")
+ }
+ estimateGasLimit = uint64(1.4 * float64(estimateGasLimit))
+
+ lsn.l.Infow("Estimated gas limit on force fulfillment", "estimateGasLimit", estimateGasLimit)
+
+ reqID := common.BytesToHash(hexutil.MustDecode(revertedTxn.DBReceipt.RequestID))
+ var reqTxHash common.Hash
+ if revertedTxn.DBReceipt.RequestTxHash != "" {
+ reqTxHash = common.BytesToHash(hexutil.MustDecode(revertedTxn.DBReceipt.RequestTxHash))
+ }
+ lsn.l.Infow("RevertedTxnForceFulfilment CreateTransaction",
+ "RequestID", revertedTxn.DBReceipt.RequestID,
+ "RequestTxHash", revertedTxn.DBReceipt.RequestTxHash,
+ )
+ forceFulfiled := true
+ forceFulfillmentAttempt := revertedTxn.DBReceipt.ForceFulfillmentAttempt + 1
+ etx, err = lsn.chain.TxManager().CreateTransaction(ctx, txmgr.TxRequest{
+ FromAddress: fromAddress,
+ ToAddress: lsn.vrfOwner.Address(),
+ EncodedPayload: txData,
+ FeeLimit: uint32(estimateGasLimit),
+ Strategy: txmgrcommon.NewSendEveryStrategy(),
+ Meta: &txmgr.TxMeta{
+ RequestID: &reqID,
+ SubID: &revertedTxn.DBReceipt.SubID,
+ RequestTxHash: &reqTxHash,
+ ForceFulfilled: &forceFulfiled,
+ ForceFulfillmentAttempt: &forceFulfillmentAttempt,
+ // No max link since simulation failed
+ },
+ })
+ return etx, err
+}
diff --git a/core/services/vrf/vrfcommon/validate.go b/core/services/vrf/vrfcommon/validate.go
index 07e8676ddb7..09f2e669483 100644
--- a/core/services/vrf/vrfcommon/validate.go
+++ b/core/services/vrf/vrfcommon/validate.go
@@ -47,9 +47,6 @@ func ValidatedVRFSpec(tomlString string) (job.Job, error) {
if bytes.Equal(spec.PublicKey[:], empty[:]) {
return jb, errors.Wrap(ErrKeyNotSet, "publicKey")
}
- if spec.MinIncomingConfirmations == 0 {
- return jb, errors.Wrap(ErrKeyNotSet, "minIncomingConfirmations")
- }
if spec.CoordinatorAddress.String() == "" {
return jb, errors.Wrap(ErrKeyNotSet, "coordinatorAddress")
}
diff --git a/core/services/workflows/delegate.go b/core/services/workflows/delegate.go
new file mode 100644
index 00000000000..1e48e229da5
--- /dev/null
+++ b/core/services/workflows/delegate.go
@@ -0,0 +1,40 @@
+package workflows
+
+import (
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/job"
+ "github.com/smartcontractkit/chainlink/v2/core/services/pg"
+)
+
+type Delegate struct {
+ registry types.CapabilitiesRegistry
+ logger logger.Logger
+}
+
+var _ job.Delegate = (*Delegate)(nil)
+
+func (d *Delegate) JobType() job.Type {
+ return job.Workflow
+}
+
+func (d *Delegate) BeforeJobCreated(spec job.Job) {}
+
+func (d *Delegate) AfterJobCreated(jb job.Job) {}
+
+func (d *Delegate) BeforeJobDeleted(spec job.Job) {}
+
+func (d *Delegate) OnDeleteJob(jb job.Job, q pg.Queryer) error { return nil }
+
+// ServicesForSpec satisfies the job.Delegate interface.
+func (d *Delegate) ServicesForSpec(spec job.Job) ([]job.ServiceCtx, error) {
+ engine, err := NewEngine(d.logger, d.registry)
+ if err != nil {
+ return nil, err
+ }
+ return []job.ServiceCtx{engine}, nil
+}
+
+func NewDelegate(logger logger.Logger, registry types.CapabilitiesRegistry) *Delegate {
+ return &Delegate{logger: logger, registry: registry}
+}
diff --git a/core/services/workflows/engine.go b/core/services/workflows/engine.go
new file mode 100644
index 00000000000..1f34b58105d
--- /dev/null
+++ b/core/services/workflows/engine.go
@@ -0,0 +1,216 @@
+package workflows
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/services"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink-common/pkg/values"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+)
+
+const (
+ mockedWorkflowID = "ef7c8168-f4d1-422f-a4b2-8ce0a1075f0a"
+ mockedTriggerID = "bd727a82-5cac-4071-be62-0152dd9adb0f"
+)
+
+type Engine struct {
+ services.StateMachine
+ logger logger.Logger
+ registry types.CapabilitiesRegistry
+ trigger capabilities.TriggerCapability
+ consensus capabilities.ConsensusCapability
+ target capabilities.TargetCapability
+ callbackCh chan capabilities.CapabilityResponse
+ cancel func()
+}
+
+func (e *Engine) Start(ctx context.Context) error {
+ return e.StartOnce("Engine", func() error {
+ err := e.registerTrigger(ctx)
+ if err != nil {
+ return err
+ }
+
+ // create a new context, since the one passed in via Start is short-lived.
+ ctx, cancel := context.WithCancel(context.Background())
+ e.cancel = cancel
+ go e.loop(ctx)
+ return nil
+ })
+}
+
+func (e *Engine) registerTrigger(ctx context.Context) error {
+ triggerConf, err := values.NewMap(
+ map[string]any{
+ "feedlist": []any{
+ // ETHUSD, LINKUSD, USDBTC
+ 123, 456, 789,
+ },
+ },
+ )
+ if err != nil {
+ return err
+ }
+
+ triggerInputs, err := values.NewMap(
+ map[string]any{
+ "triggerId": mockedTriggerID,
+ },
+ )
+ if err != nil {
+ return err
+ }
+
+ triggerRegRequest := capabilities.CapabilityRequest{
+ Metadata: capabilities.RequestMetadata{
+ WorkflowID: mockedWorkflowID,
+ },
+ Config: triggerConf,
+ Inputs: triggerInputs,
+ }
+ err = e.trigger.RegisterTrigger(ctx, e.callbackCh, triggerRegRequest)
+ if err != nil {
+ return fmt.Errorf("failed to instantiate mercury_trigger, %s", err)
+ }
+ return nil
+}
+
+func (e *Engine) loop(ctx context.Context) {
+ for {
+ select {
+ case <-ctx.Done():
+ return
+ case resp := <-e.callbackCh:
+ err := e.handleExecution(ctx, resp)
+ if err != nil {
+ e.logger.Error("error executing event %+v: %w", resp, err)
+ }
+ }
+ }
+}
+
+func (e *Engine) handleExecution(ctx context.Context, resp capabilities.CapabilityResponse) error {
+ results, err := e.handleConsensus(ctx, resp)
+ if err != nil {
+ return err
+ }
+
+ _, err = e.handleTarget(ctx, results)
+ return err
+}
+
+func (e *Engine) handleTarget(ctx context.Context, resp *values.List) (*values.List, error) {
+ report, err := resp.Unwrap()
+ if err != nil {
+ return nil, err
+ }
+ inputs := map[string]values.Value{
+ "report": resp,
+ }
+ config, err := values.NewMap(map[string]any{
+ "address": "0xaabbcc",
+ "method": "updateFeedValues(report bytes, role uint8)",
+ "params": []any{
+ report, 1,
+ },
+ })
+ if err != nil {
+ return nil, err
+ }
+
+ tr := capabilities.CapabilityRequest{
+ Inputs: &values.Map{Underlying: inputs},
+ Config: config,
+ Metadata: capabilities.RequestMetadata{
+ WorkflowID: mockedWorkflowID,
+ },
+ }
+ return capabilities.ExecuteSync(ctx, e.target, tr)
+}
+
+func (e *Engine) handleConsensus(ctx context.Context, resp capabilities.CapabilityResponse) (*values.List, error) {
+ inputs := map[string]values.Value{
+ "observations": resp.Value,
+ }
+ config, err := values.NewMap(map[string]any{
+ "aggregation_method": "data_feeds_2_0",
+ "aggregation_config": map[string]any{
+ // ETHUSD
+ "123": map[string]any{
+ "deviation": "0.005",
+ "heartbeat": "24h",
+ },
+ // LINKUSD
+ "456": map[string]any{
+ "deviation": "0.001",
+ "heartbeat": "24h",
+ },
+ // BTCUSD
+ "789": map[string]any{
+ "deviation": "0.002",
+ "heartbeat": "6h",
+ },
+ },
+ "encoder": "EVM",
+ })
+ if err != nil {
+ return nil, nil
+ }
+ cr := capabilities.CapabilityRequest{
+ Metadata: capabilities.RequestMetadata{
+ WorkflowID: mockedWorkflowID,
+ },
+ Inputs: &values.Map{Underlying: inputs},
+ Config: config,
+ }
+ return capabilities.ExecuteSync(ctx, e.consensus, cr)
+}
+
+func (e *Engine) Close() error {
+ return e.StopOnce("Engine", func() error {
+ defer e.cancel()
+
+ triggerInputs, err := values.NewMap(
+ map[string]any{
+ "triggerId": mockedTriggerID,
+ },
+ )
+ if err != nil {
+ return err
+ }
+ deregRequest := capabilities.CapabilityRequest{
+ Metadata: capabilities.RequestMetadata{
+ WorkflowID: mockedWorkflowID,
+ },
+ Inputs: triggerInputs,
+ }
+ return e.trigger.UnregisterTrigger(context.Background(), deregRequest)
+ })
+}
+
+func NewEngine(lggr logger.Logger, registry types.CapabilitiesRegistry) (*Engine, error) {
+ ctx := context.Background()
+ trigger, err := registry.GetTrigger(ctx, "on_mercury_report")
+ if err != nil {
+ return nil, err
+ }
+ consensus, err := registry.GetConsensus(ctx, "off-chain-reporting")
+ if err != nil {
+ return nil, err
+ }
+ target, err := registry.GetTarget(ctx, "write_polygon_mainnet")
+ if err != nil {
+ return nil, err
+ }
+ return &Engine{
+ logger: lggr,
+ registry: registry,
+ trigger: trigger,
+ consensus: consensus,
+ target: target,
+ callbackCh: make(chan capabilities.CapabilityResponse),
+ }, nil
+}
diff --git a/core/services/workflows/engine_test.go b/core/services/workflows/engine_test.go
new file mode 100644
index 00000000000..603f5eee3b1
--- /dev/null
+++ b/core/services/workflows/engine_test.go
@@ -0,0 +1,125 @@
+package workflows
+
+import (
+ "context"
+ "testing"
+
+ "github.com/shopspring/decimal"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/capabilities"
+ "github.com/smartcontractkit/chainlink-common/pkg/values"
+ coreCap "github.com/smartcontractkit/chainlink/v2/core/capabilities"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+)
+
+type mockCapability struct {
+ capabilities.CapabilityInfo
+ capabilities.CallbackExecutable
+ response chan capabilities.CapabilityResponse
+ transform func(capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error)
+}
+
+func newMockCapability(info capabilities.CapabilityInfo, transform func(capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error)) *mockCapability {
+ return &mockCapability{
+ transform: transform,
+ CapabilityInfo: info,
+ response: make(chan capabilities.CapabilityResponse, 10),
+ }
+}
+
+func (m *mockCapability) Execute(ctx context.Context, ch chan<- capabilities.CapabilityResponse, req capabilities.CapabilityRequest) error {
+ cr, err := m.transform(req)
+ if err != nil {
+ return err
+ }
+
+ ch <- cr
+ close(ch)
+ m.response <- cr
+ return nil
+}
+
+type mockTriggerCapability struct {
+ capabilities.CapabilityInfo
+ ch chan<- capabilities.CapabilityResponse
+}
+
+var _ capabilities.TriggerCapability = (*mockTriggerCapability)(nil)
+
+func (m *mockTriggerCapability) RegisterTrigger(ctx context.Context, ch chan<- capabilities.CapabilityResponse, req capabilities.CapabilityRequest) error {
+ m.ch = ch
+ return nil
+}
+
+func (m *mockTriggerCapability) UnregisterTrigger(ctx context.Context, req capabilities.CapabilityRequest) error {
+ return nil
+}
+
+func TestEngineWithHardcodedWorkflow(t *testing.T) {
+ ctx := context.Background()
+ reg := coreCap.NewRegistry()
+
+ trigger := &mockTriggerCapability{
+ CapabilityInfo: capabilities.MustNewCapabilityInfo(
+ "on_mercury_report",
+ capabilities.CapabilityTypeTrigger,
+ "issues a trigger when a mercury report is received.",
+ "v1.0.0",
+ ),
+ }
+ require.NoError(t, reg.Add(ctx, trigger))
+
+ consensus := newMockCapability(
+ capabilities.MustNewCapabilityInfo(
+ "off-chain-reporting",
+ capabilities.CapabilityTypeConsensus,
+ "an ocr3 consensus capability",
+ "v3.0.0",
+ ),
+ func(req capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error) {
+ return capabilities.CapabilityResponse{
+ Value: req.Inputs.Underlying["observations"],
+ }, nil
+ },
+ )
+ require.NoError(t, reg.Add(ctx, consensus))
+
+ target := newMockCapability(
+ capabilities.MustNewCapabilityInfo(
+ "write_polygon_mainnet",
+ capabilities.CapabilityTypeTarget,
+ "a write capability targeting polygon mainnet",
+ "v1.0.0",
+ ),
+ func(req capabilities.CapabilityRequest) (capabilities.CapabilityResponse, error) {
+
+ list := req.Inputs.Underlying["report"].(*values.List)
+ return capabilities.CapabilityResponse{
+ Value: list.Underlying[0],
+ }, nil
+ },
+ )
+ require.NoError(t, reg.Add(ctx, target))
+
+ lggr := logger.TestLogger(t)
+ eng, err := NewEngine(lggr, reg)
+ require.NoError(t, err)
+
+ err = eng.Start(ctx)
+ require.NoError(t, err)
+ defer eng.Close()
+
+ resp, err := values.NewMap(map[string]any{
+ "123": decimal.NewFromFloat(1.00),
+ "456": decimal.NewFromFloat(1.25),
+ "789": decimal.NewFromFloat(1.50),
+ })
+ require.NoError(t, err)
+ cr := capabilities.CapabilityResponse{
+ Value: resp,
+ }
+ trigger.ch <- cr
+ assert.Equal(t, cr, <-target.response)
+}
diff --git a/core/sessions/ldapauth/ldap.go b/core/sessions/ldapauth/ldap.go
index 147f8bd2aed..fc0e76bb5c1 100644
--- a/core/sessions/ldapauth/ldap.go
+++ b/core/sessions/ldapauth/ldap.go
@@ -124,17 +124,15 @@ func (l *ldapAuthenticator) FindUser(email string) (sessions.User, error) {
sql := "SELECT * FROM users WHERE lower(email) = lower($1)"
return tx.Get(&foundLocalAdminUser, sql, email)
})
- if checkErr != nil {
- // If error is not nil, there was either an issue or no local users found
- if !errors.Is(checkErr, sql.ErrNoRows) {
- // If the error is not that no local user was found, log and exit
- l.lggr.Errorf("error searching users table: %v", checkErr)
- return sessions.User{}, errors.New("error Finding user")
- }
- } else {
- // Error was nil, local user found. Return
+ if checkErr == nil {
return foundLocalAdminUser, nil
}
+ // If error is not nil, there was either an issue or no local users found
+ if !errors.Is(checkErr, sql.ErrNoRows) {
+ // If the error is not that no local user was found, log and exit
+ l.lggr.Errorf("error searching users table: %v", checkErr)
+ return sessions.User{}, errors.New("error Finding user")
+ }
// First query for user "is active" property if defined
usersActive, err := l.validateUsersActive([]string{email})
diff --git a/core/store/migrate/migrations/0222_jobs_stream_id.sql b/core/store/migrate/migrations/0222_jobs_stream_id.sql
new file mode 100644
index 00000000000..5732011cb61
--- /dev/null
+++ b/core/store/migrate/migrations/0222_jobs_stream_id.sql
@@ -0,0 +1,7 @@
+-- +goose Up
+ALTER TABLE jobs ADD COLUMN stream_id BIGINT;
+CREATE UNIQUE INDEX idx_jobs_unique_stream_id ON jobs(stream_id) WHERE stream_id IS NOT NULL;
+
+-- +goose Down
+ALTER TABLE jobs DROP COLUMN stream_id;
+
diff --git a/core/testdata/testspecs/v2_specs.go b/core/testdata/testspecs/v2_specs.go
index e66971a7a11..5ca79f1abb4 100644
--- a/core/testdata/testspecs/v2_specs.go
+++ b/core/testdata/testspecs/v2_specs.go
@@ -376,6 +376,7 @@ estimate_gas [type=estimategaslimit
to="%s"
multiplier="1.1"
data="$(generate_proof.output)"
+ block="latest"
]
simulate_fulfillment [type=ethcall
to="%s"
@@ -384,6 +385,7 @@ simulate_fulfillment [type=ethcall
extractRevertReason=true
contract="%s"
data="$(generate_proof.output)"
+ block="latest"
]
decode_log->generate_proof->estimate_gas->simulate_fulfillment
`, coordinatorAddress, coordinatorAddress, coordinatorAddress)
@@ -830,7 +832,8 @@ storeBlockhashesBatchSize = %d
}
type StreamSpecParams struct {
- Name string
+ Name string
+ StreamID uint64
}
type StreamSpec struct {
@@ -848,6 +851,7 @@ func GenerateStreamSpec(params StreamSpecParams) StreamSpec {
type = "stream"
schemaVersion = 1
name = "%s"
+streamID = %d
observationSource = """
ds [type=http method=GET url="https://chain.link/ETH-USD"];
ds_parse [type=jsonparse path="data,price"];
@@ -856,6 +860,6 @@ ds -> ds_parse -> ds_multiply;
"""
`
- toml := fmt.Sprintf(template, params.Name)
+ toml := fmt.Sprintf(template, params.Name, params.StreamID)
return StreamSpec{StreamSpecParams: params, toml: toml}
}
diff --git a/core/utils/clock.go b/core/utils/clock.go
deleted file mode 100644
index 0734c8a6a84..00000000000
--- a/core/utils/clock.go
+++ /dev/null
@@ -1,29 +0,0 @@
-package utils
-
-import "time"
-
-type Clock interface {
- Now() time.Time
-}
-
-type realClock struct{}
-
-func NewRealClock() Clock {
- return &realClock{}
-}
-
-func (realClock) Now() time.Time {
- return time.Now()
-}
-
-type fixedClock struct {
- now time.Time
-}
-
-func NewFixedClock(now time.Time) Clock {
- return &fixedClock{now: now}
-}
-
-func (fc fixedClock) Now() time.Time {
- return fc.now
-}
diff --git a/core/utils/clock_test.go b/core/utils/clock_test.go
deleted file mode 100644
index 9c4e7645dee..00000000000
--- a/core/utils/clock_test.go
+++ /dev/null
@@ -1,30 +0,0 @@
-package utils_test
-
-import (
- "testing"
- "time"
-
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/utils"
-
- "github.com/stretchr/testify/assert"
-)
-
-func TestNewRealClock(t *testing.T) {
- t.Parallel()
-
- clock := utils.NewRealClock()
- now := clock.Now()
- time.Sleep(testutils.TestInterval)
- interval := time.Since(now)
- assert.GreaterOrEqual(t, interval, testutils.TestInterval)
-}
-
-func TestNewFixedClock(t *testing.T) {
- t.Parallel()
-
- now := time.Now()
- clock := utils.NewFixedClock(now)
- time.Sleep(testutils.TestInterval)
- assert.Equal(t, now, clock.Now())
-}
diff --git a/core/web/cosmos_transfer_controller.go b/core/web/cosmos_transfer_controller.go
index 965f694fc1b..9b958346642 100644
--- a/core/web/cosmos_transfer_controller.go
+++ b/core/web/cosmos_transfer_controller.go
@@ -60,12 +60,12 @@ func (tc *CosmosTransfersController) Create(c *gin.Context) {
}
var gasToken string
cfgs := tc.App.GetConfig().CosmosConfigs()
- if i := slices.IndexFunc(cfgs, func(config *coscfg.TOMLConfig) bool { return *config.ChainID == tr.CosmosChainID }); i != -1 {
- gasToken = cfgs[i].GasToken()
- } else {
+ i := slices.IndexFunc(cfgs, func(config *coscfg.TOMLConfig) bool { return *config.ChainID == tr.CosmosChainID })
+ if i == -1 {
jsonAPIError(c, http.StatusInternalServerError, fmt.Errorf("no config for chain id: %s", tr.CosmosChainID))
return
}
+ gasToken = cfgs[i].GasToken()
//TODO move this inside?
coin, err := denom.ConvertDecCoinToDenom(sdk.NewDecCoinFromDec(tr.Token, tr.Amount), gasToken)
diff --git a/core/web/eth_keys_controller.go b/core/web/eth_keys_controller.go
index fe76e8863ef..4e95bc3cb89 100644
--- a/core/web/eth_keys_controller.go
+++ b/core/web/eth_keys_controller.go
@@ -270,7 +270,7 @@ func (ekc *ETHKeysController) Chain(c *gin.Context) {
jsonAPIError(c, http.StatusBadRequest, errors.Errorf("invalid address: %s, must be hex address", keyID))
return
}
- address := common.HexToAddress((keyID))
+ address := common.HexToAddress(keyID)
cid := c.Query("evmChainID")
chain, ok := ekc.getChain(c, cid)
diff --git a/core/web/eth_keys_controller_test.go b/core/web/eth_keys_controller_test.go
index a9be5517bcc..e075b3196e1 100644
--- a/core/web/eth_keys_controller_test.go
+++ b/core/web/eth_keys_controller_test.go
@@ -284,7 +284,8 @@ func TestETHKeysController_ChainSuccess_UpdateNonce(t *testing.T) {
err := cltest.ParseJSONAPIResponse(t, resp, &updatedKey)
assert.NoError(t, err)
- assert.Equal(t, key.ID(), updatedKey.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(cltest.FixtureChainID.String(), key.Address.String()), updatedKey.ID)
+ assert.Equal(t, key.Address.String(), updatedKey.Address)
assert.Equal(t, cltest.FixtureChainID.String(), updatedKey.EVMChainID.String())
assert.Equal(t, false, updatedKey.Disabled)
}
@@ -328,7 +329,8 @@ func TestETHKeysController_ChainSuccess_Disable(t *testing.T) {
err := cltest.ParseJSONAPIResponse(t, resp, &updatedKey)
assert.NoError(t, err)
- assert.Equal(t, key.ID(), updatedKey.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(updatedKey.EVMChainID.String(), key.Address.String()), updatedKey.ID)
+ assert.Equal(t, key.Address.String(), updatedKey.Address)
assert.Equal(t, cltest.FixtureChainID.String(), updatedKey.EVMChainID.String())
assert.Equal(t, true, updatedKey.Disabled)
}
@@ -371,7 +373,8 @@ func TestETHKeysController_ChainSuccess_Enable(t *testing.T) {
err := cltest.ParseJSONAPIResponse(t, resp, &updatedKey)
assert.NoError(t, err)
- assert.Equal(t, key.ID(), updatedKey.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(cltest.FixtureChainID.String(), key.Address.String()), updatedKey.ID)
+ assert.Equal(t, key.Address.String(), updatedKey.Address)
assert.Equal(t, cltest.FixtureChainID.String(), updatedKey.EVMChainID.String())
assert.Equal(t, false, updatedKey.Disabled)
}
@@ -436,7 +439,8 @@ func TestETHKeysController_ChainSuccess_ResetWithAbandon(t *testing.T) {
err = cltest.ParseJSONAPIResponse(t, resp, &updatedKey)
assert.NoError(t, err)
- assert.Equal(t, key.ID(), updatedKey.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(cltest.FixtureChainID.String(), key.Address.String()), updatedKey.ID)
+ assert.Equal(t, key.Address.String(), updatedKey.Address)
assert.Equal(t, cltest.FixtureChainID.String(), updatedKey.EVMChainID.String())
assert.Equal(t, false, updatedKey.Disabled)
@@ -663,7 +667,8 @@ func TestETHKeysController_DeleteSuccess(t *testing.T) {
err := cltest.ParseJSONAPIResponse(t, resp, &deletedKey)
assert.NoError(t, err)
- assert.Equal(t, key0.ID(), deletedKey.ID)
+ assert.Equal(t, cltest.FormatWithPrefixedChainID(cltest.FixtureChainID.String(), key0.Address.String()), deletedKey.ID)
+ assert.Equal(t, key0.Address.String(), deletedKey.Address)
assert.Equal(t, cltest.FixtureChainID.String(), deletedKey.EVMChainID.String())
assert.Equal(t, false, deletedKey.Disabled)
diff --git a/core/web/health_controller.go b/core/web/health_controller.go
index 7ab07291b58..bd775671d73 100644
--- a/core/web/health_controller.go
+++ b/core/web/health_controller.go
@@ -125,12 +125,12 @@ func (hc *HealthController) Health(c *gin.Context) {
func writeTextTo(w io.Writer, checks []presenters.Check) error {
slices.SortFunc(checks, presenters.CmpCheckName)
for _, ch := range checks {
- status := "?"
+ status := "? "
switch ch.Status {
case HealthStatusPassing:
- status = "-"
+ status = "ok "
case HealthStatusFailing:
- status = "!"
+ status = "! "
}
if _, err := fmt.Fprintf(w, "%s%s\n", status, ch.Name); err != nil {
return err
diff --git a/core/web/jobs_controller_test.go b/core/web/jobs_controller_test.go
index eec58c30571..0dc04ff34e8 100644
--- a/core/web/jobs_controller_test.go
+++ b/core/web/jobs_controller_test.go
@@ -369,7 +369,7 @@ func TestJobController_Create_HappyPath(t *testing.T) {
{
name: "stream",
tomlTemplate: func(_ string) string {
- return testspecs.GenerateStreamSpec(testspecs.StreamSpecParams{Name: "ETH/USD"}).Toml()
+ return testspecs.GenerateStreamSpec(testspecs.StreamSpecParams{Name: "ETH/USD", StreamID: 32}).Toml()
},
assertion: func(t *testing.T, nameAndExternalJobID string, r *http.Response) {
require.Equal(t, http.StatusOK, r.StatusCode)
@@ -384,6 +384,7 @@ func TestJobController_Create_HappyPath(t *testing.T) {
assert.NotNil(t, resource.PipelineSpec.DotDAGSource)
assert.Equal(t, jb.Name.ValueOrZero(), resource.Name)
+ assert.Equal(t, jb.StreamID, resource.StreamID)
},
},
}
diff --git a/core/web/loader/chain.go b/core/web/loader/chain.go
index a12fef3d590..34ca4bd5f82 100644
--- a/core/web/loader/chain.go
+++ b/core/web/loader/chain.go
@@ -2,9 +2,11 @@ package loader
import (
"context"
+ "slices"
"github.com/graph-gophers/dataloader"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink/v2/core/chains"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
"github.com/smartcontractkit/chainlink/v2/core/services/relay"
@@ -14,7 +16,7 @@ type chainBatcher struct {
app chainlink.Application
}
-func (b *chainBatcher) loadByIDs(_ context.Context, keys dataloader.Keys) []*dataloader.Result {
+func (b *chainBatcher) loadByIDs(ctx context.Context, keys dataloader.Keys) []*dataloader.Result {
// Create a map for remembering the order of keys passed in
keyOrder := make(map[string]int, len(keys))
// Collect the keys to search for
@@ -24,13 +26,20 @@ func (b *chainBatcher) loadByIDs(_ context.Context, keys dataloader.Keys) []*dat
keyOrder[key.String()] = ix
}
- // Fetch the chains
- cs, _, err := b.app.EVMORM().Chains(chainIDs...)
- if err != nil {
- return []*dataloader.Result{{Data: nil, Error: err}}
+ var cs []types.ChainStatus
+ relayers := b.app.GetRelayers().Slice()
+
+ for _, r := range relayers {
+ s, err := r.GetChainStatus(ctx)
+ if err != nil {
+ return []*dataloader.Result{{Data: nil, Error: err}}
+ }
+
+ if slices.Contains(chainIDs, s.ID) {
+ cs = append(cs, s)
+ }
}
- // Construct the output array of dataloader results
results := make([]*dataloader.Result, len(keys))
for _, c := range cs {
ix, ok := keyOrder[c.ID]
diff --git a/core/web/loader/loader_test.go b/core/web/loader/loader_test.go
index a039834997e..b17c96ee206 100644
--- a/core/web/loader/loader_test.go
+++ b/core/web/loader/loader_test.go
@@ -11,23 +11,24 @@ import (
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-common/pkg/loop"
commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
-
"github.com/smartcontractkit/chainlink/v2/core/chains"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
evmtxmgrmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr/mocks"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
+ evmutils "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
+
ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
coremocks "github.com/smartcontractkit/chainlink/v2/core/internal/mocks"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/evmtest"
chainlinkmocks "github.com/smartcontractkit/chainlink/v2/core/services/chainlink/mocks"
"github.com/smartcontractkit/chainlink/v2/core/services/feeds"
feedsMocks "github.com/smartcontractkit/chainlink/v2/core/services/feeds/mocks"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
jobORMMocks "github.com/smartcontractkit/chainlink/v2/core/services/job/mocks"
"github.com/smartcontractkit/chainlink/v2/core/services/pipeline"
+ testutils2 "github.com/smartcontractkit/chainlink/v2/core/web/testutils"
)
func TestLoader_Chains(t *testing.T) {
@@ -40,21 +41,33 @@ func TestLoader_Chains(t *testing.T) {
chain := toml.EVMConfig{ChainID: one, Chain: toml.Defaults(one)}
two := ubig.NewI(2)
chain2 := toml.EVMConfig{ChainID: two, Chain: toml.Defaults(two)}
- evmORM := evmtest.NewTestConfigs(&chain, &chain2)
- app.On("EVMORM").Return(evmORM)
+ config1, err := chain.TOMLString()
+ require.NoError(t, err)
+ config2, err := chain2.TOMLString()
+ require.NoError(t, err)
- batcher := chainBatcher{app}
+ app.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{
+ testutils2.MockRelayer{ChainStatus: commontypes.ChainStatus{
+ ID: "1",
+ Enabled: true,
+ Config: config1,
+ }}, testutils2.MockRelayer{ChainStatus: commontypes.ChainStatus{
+ ID: "2",
+ Enabled: true,
+ Config: config2,
+ }},
+ }})
+ batcher := chainBatcher{app}
keys := dataloader.NewKeysFromStrings([]string{"2", "1", "3"})
results := batcher.loadByIDs(ctx, keys)
assert.Len(t, results, 3)
- config2, err := chain2.TOMLString()
+
require.NoError(t, err)
want2 := commontypes.ChainStatus{ID: "2", Enabled: true, Config: config2}
assert.Equal(t, want2, results[0].Data.(commontypes.ChainStatus))
- config1, err := chain.TOMLString()
- require.NoError(t, err)
+
want1 := commontypes.ChainStatus{ID: "1", Enabled: true, Config: config1}
assert.Equal(t, want1, results[1].Data.(commontypes.ChainStatus))
assert.Nil(t, results[2].Data)
@@ -367,7 +380,7 @@ func TestLoader_loadByEthTransactionID(t *testing.T) {
ctx := InjectDataloader(testutils.Context(t), app)
ethTxID := int64(3)
- ethTxHash := utils.NewHash()
+ ethTxHash := evmutils.NewHash()
receipt := txmgr.Receipt{
ID: int64(1),
diff --git a/core/web/presenters/chain_msg_test.go b/core/web/presenters/chain_msg_test.go
new file mode 100644
index 00000000000..58192caef71
--- /dev/null
+++ b/core/web/presenters/chain_msg_test.go
@@ -0,0 +1,69 @@
+package presenters
+
+import (
+ "fmt"
+ "testing"
+
+ "github.com/manyminds/api2go/jsonapi"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/cosmostest"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/solanatest"
+)
+
+func TestSolanaMessageResource(t *testing.T) {
+ id := "1"
+ chainID := solanatest.RandomChainID()
+ r := NewSolanaMsgResource(id, chainID)
+ assert.Equal(t, chainID, r.ChainID)
+
+ b, err := jsonapi.Marshal(r)
+ require.NoError(t, err)
+
+ expected := fmt.Sprintf(`
+ {
+ "data":{
+ "type":"solana_messages",
+ "id":"%s/%s",
+ "attributes":{
+ "ChainID":"%s",
+ "from":"",
+ "to":"",
+ "amount":0
+ }
+ }
+ }
+ `, chainID, id, chainID)
+
+ assert.JSONEq(t, expected, string(b))
+}
+
+func TestCosmosMessageResource(t *testing.T) {
+ id := "1"
+ chainID := cosmostest.RandomChainID()
+ contractID := "cosmos1p3ucd3ptpw902fluyjzkq3fflq4btddac9sa3s"
+ r := NewCosmosMsgResource(id, chainID, contractID)
+ assert.Equal(t, chainID, r.ChainID)
+ assert.Equal(t, contractID, r.ContractID)
+
+ b, err := jsonapi.Marshal(r)
+ require.NoError(t, err)
+
+ expected := fmt.Sprintf(`
+ {
+ "data":{
+ "type":"cosmos_messages",
+ "id":"%s/%s",
+ "attributes":{
+ "ChainID":"%s",
+ "ContractID":"%s",
+ "State":"",
+ "TxHash":null
+ }
+ }
+ }
+ `, chainID, id, chainID, contractID)
+
+ assert.JSONEq(t, expected, string(b))
+}
diff --git a/core/web/presenters/cosmos_chain.go b/core/web/presenters/cosmos_chain.go
index c3b006e5c7e..c2bc4b52b61 100644
--- a/core/web/presenters/cosmos_chain.go
+++ b/core/web/presenters/cosmos_chain.go
@@ -36,7 +36,7 @@ func (r CosmosNodeResource) GetName() string {
// NewCosmosNodeResource returns a new CosmosNodeResource for node.
func NewCosmosNodeResource(node types.NodeStatus) CosmosNodeResource {
return CosmosNodeResource{NodeResource{
- JAID: NewJAID(node.Name),
+ JAID: NewPrefixedJAID(node.Name, node.ChainID),
ChainID: node.ChainID,
Name: node.Name,
State: node.State,
diff --git a/core/web/presenters/cosmos_msg.go b/core/web/presenters/cosmos_msg.go
index 5bf0bb9b4f8..ab43d394ede 100644
--- a/core/web/presenters/cosmos_msg.go
+++ b/core/web/presenters/cosmos_msg.go
@@ -17,7 +17,7 @@ func (CosmosMsgResource) GetName() string {
// NewCosmosMsgResource returns a new partial CosmosMsgResource.
func NewCosmosMsgResource(id string, chainID string, contractID string) CosmosMsgResource {
return CosmosMsgResource{
- JAID: NewJAID(id),
+ JAID: NewPrefixedJAID(id, chainID),
ChainID: chainID,
ContractID: contractID,
}
diff --git a/core/web/presenters/eth_key.go b/core/web/presenters/eth_key.go
index d661d4334cd..812adeb13fa 100644
--- a/core/web/presenters/eth_key.go
+++ b/core/web/presenters/eth_key.go
@@ -40,7 +40,7 @@ type NewETHKeyOption func(*ETHKeyResource)
// Use the functional options to inject the ETH and LINK balances
func NewETHKeyResource(k ethkey.KeyV2, state ethkey.State, opts ...NewETHKeyOption) *ETHKeyResource {
r := ÐKeyResource{
- JAID: NewJAID(k.Address.Hex()),
+ JAID: NewPrefixedJAID(k.Address.Hex(), state.EVMChainID.String()),
EVMChainID: state.EVMChainID,
Address: k.Address.Hex(),
EthBalance: nil,
diff --git a/core/web/presenters/eth_key_test.go b/core/web/presenters/eth_key_test.go
index 8be13de74a1..46402141a4c 100644
--- a/core/web/presenters/eth_key_test.go
+++ b/core/web/presenters/eth_key_test.go
@@ -55,7 +55,7 @@ func TestETHKeyResource(t *testing.T) {
{
"data":{
"type":"eTHKeys",
- "id":"%s",
+ "id":"42/%s",
"attributes":{
"address":"%s",
"evmChainID":"42",
@@ -84,7 +84,7 @@ func TestETHKeyResource(t *testing.T) {
{
"data": {
"type":"eTHKeys",
- "id":"%s",
+ "id":"42/%s",
"attributes":{
"address":"%s",
"evmChainID":"42",
diff --git a/core/web/presenters/eth_tx.go b/core/web/presenters/eth_tx.go
index f944a99213f..65df01ef095 100644
--- a/core/web/presenters/eth_tx.go
+++ b/core/web/presenters/eth_tx.go
@@ -66,6 +66,7 @@ func NewEthTxResourceFromAttempt(txa txmgr.TxAttempt) EthTxResource {
if txa.Tx.ChainID != nil {
r.EVMChainID = *big.New(txa.Tx.ChainID)
+ r.JAID = NewPrefixedJAID(r.JAID.ID, txa.Tx.ChainID.String())
}
if tx.Sequence != nil {
diff --git a/core/web/presenters/eth_tx_test.go b/core/web/presenters/eth_tx_test.go
index 2ed8e23c76a..193fa774ce9 100644
--- a/core/web/presenters/eth_tx_test.go
+++ b/core/web/presenters/eth_tx_test.go
@@ -20,12 +20,14 @@ import (
func TestEthTxResource(t *testing.T) {
t.Parallel()
+ chainID := big.NewInt(54321)
tx := txmgr.Tx{
ID: 1,
EncodedPayload: []byte(`{"data": "is wilding out"}`),
FromAddress: common.HexToAddress("0x1"),
ToAddress: common.HexToAddress("0x2"),
FeeLimit: uint32(5000),
+ ChainID: chainID,
State: txmgrcommon.TxConfirmed,
Value: big.Int(assets.NewEthValue(1)),
}
@@ -52,7 +54,7 @@ func TestEthTxResource(t *testing.T) {
"sentAt": "",
"to": "0x0000000000000000000000000000000000000002",
"value": "0.000000000000000001",
- "evmChainID": "0"
+ "evmChainID": "54321"
}
}
}
@@ -85,7 +87,7 @@ func TestEthTxResource(t *testing.T) {
{
"data": {
"type": "evm_transactions",
- "id": "0x0000000000000000000000000000000000000000000000000000000000010203",
+ "id": "54321/0x0000000000000000000000000000000000000000000000000000000000010203",
"attributes": {
"state": "confirmed",
"data": "0x7b2264617461223a202269732077696c64696e67206f7574227d",
@@ -98,7 +100,7 @@ func TestEthTxResource(t *testing.T) {
"sentAt": "300",
"to": "0x0000000000000000000000000000000000000002",
"value": "0.000000000000000001",
- "evmChainID": "0"
+ "evmChainID": "54321"
}
}
}
diff --git a/core/web/presenters/evm_chain.go b/core/web/presenters/evm_chain.go
index 8cc6da46a77..adf399d4b01 100644
--- a/core/web/presenters/evm_chain.go
+++ b/core/web/presenters/evm_chain.go
@@ -34,7 +34,7 @@ func (r EVMNodeResource) GetName() string {
// NewEVMNodeResource returns a new EVMNodeResource for node.
func NewEVMNodeResource(node types.NodeStatus) EVMNodeResource {
return EVMNodeResource{NodeResource{
- JAID: NewJAID(node.Name),
+ JAID: NewPrefixedJAID(node.Name, node.ChainID),
ChainID: node.ChainID,
Name: node.Name,
State: node.State,
diff --git a/core/web/presenters/evm_forwarder_test.go b/core/web/presenters/evm_forwarder_test.go
new file mode 100644
index 00000000000..80eb6b190ef
--- /dev/null
+++ b/core/web/presenters/evm_forwarder_test.go
@@ -0,0 +1,64 @@
+package presenters
+
+import (
+ "fmt"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/manyminds/api2go/jsonapi"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/forwarders"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
+)
+
+func TestEVMForwarderResource(t *testing.T) {
+ var (
+ ID = int64(1)
+ address = utils.RandomAddress()
+ chainID = *big.NewI(4)
+ createdAt = time.Now()
+ updatedAt = time.Now().Add(time.Second)
+ )
+ fwd := forwarders.Forwarder{
+ ID: ID,
+ Address: address,
+ EVMChainID: chainID,
+ CreatedAt: createdAt,
+ UpdatedAt: updatedAt,
+ }
+
+ r := NewEVMForwarderResource(fwd)
+ assert.Equal(t, fmt.Sprint(ID), r.ID)
+ assert.Equal(t, address, r.Address)
+ assert.Equal(t, chainID, r.EVMChainID)
+ assert.Equal(t, createdAt, r.CreatedAt)
+ assert.Equal(t, updatedAt, r.UpdatedAt)
+
+ b, err := jsonapi.Marshal(r)
+ require.NoError(t, err)
+
+ createdAtMarshalled, err := createdAt.MarshalText()
+ require.NoError(t, err)
+ updatedAtMarshalled, err := updatedAt.MarshalText()
+ require.NoError(t, err)
+
+ expected := fmt.Sprintf(`
+ {
+ "data":{
+ "type":"evm_forwarder",
+ "id":"%d",
+ "attributes":{
+ "address":"%s",
+ "evmChainId":"%s",
+ "createdAt":"%s",
+ "updatedAt":"%s"
+ }
+ }
+ }
+ `, ID, strings.ToLower(address.String()), chainID.String(), string(createdAtMarshalled), string(updatedAtMarshalled))
+ assert.JSONEq(t, expected, string(b))
+}
diff --git a/core/web/presenters/job.go b/core/web/presenters/job.go
index d0a6cfb5ca9..7c8643015dd 100644
--- a/core/web/presenters/job.go
+++ b/core/web/presenters/job.go
@@ -452,6 +452,7 @@ func NewJobError(e job.SpecError) JobError {
type JobResource struct {
JAID
Name string `json:"name"`
+ StreamID *uint32 `json:"streamID,omitempty"`
Type JobSpecType `json:"type"`
SchemaVersion uint32 `json:"schemaVersion"`
GasLimit clnull.Uint32 `json:"gasLimit"`
@@ -479,6 +480,7 @@ func NewJobResource(j job.Job) *JobResource {
resource := &JobResource{
JAID: NewJAIDInt32(j.ID),
Name: j.Name.ValueOrZero(),
+ StreamID: j.StreamID,
Type: JobSpecType(j.Type),
SchemaVersion: j.SchemaVersion,
GasLimit: j.GasLimit,
@@ -515,6 +517,8 @@ func NewJobResource(j job.Job) *JobResource {
resource.GatewaySpec = NewGatewaySpec(j.GatewaySpec)
case job.Stream:
// no spec; nothing to do
+ case job.Workflow:
+ // no spec; nothing to do
case job.LegacyGasStationServer, job.LegacyGasStationSidecar:
// unsupported
}
diff --git a/core/web/presenters/jsonapi.go b/core/web/presenters/jsonapi.go
index ee3a2a7de8a..d14e24a7455 100644
--- a/core/web/presenters/jsonapi.go
+++ b/core/web/presenters/jsonapi.go
@@ -1,6 +1,7 @@
package presenters
import (
+ "fmt"
"strconv"
)
@@ -14,6 +15,11 @@ func NewJAID(id string) JAID {
return JAID{id}
}
+// NewPrefixedJAID prefixes JAID with chain id in %s/%s format.
+func NewPrefixedJAID(id string, chainID string) JAID {
+ return JAID{ID: fmt.Sprintf("%s/%s", chainID, id)}
+}
+
// NewJAIDInt32 converts an int32 into a JAID
func NewJAIDInt32(id int32) JAID {
return JAID{strconv.Itoa(int(id))}
diff --git a/core/web/presenters/node_test.go b/core/web/presenters/node_test.go
new file mode 100644
index 00000000000..34210a52166
--- /dev/null
+++ b/core/web/presenters/node_test.go
@@ -0,0 +1,92 @@
+package presenters
+
+import (
+ "fmt"
+ "testing"
+
+ "github.com/manyminds/api2go/jsonapi"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+)
+
+func TestNodeResource(t *testing.T) {
+ var nodeResource NodeResource
+ var r interface{}
+ state := "test"
+ cfg := "cfg"
+ testCases := []string{"solana", "cosmos", "starknet"}
+ for _, tc := range testCases {
+ chainID := fmt.Sprintf("%s chain ID", tc)
+ nodeName := fmt.Sprintf("%s_node", tc)
+
+ switch tc {
+ case "evm":
+ evmNodeResource := NewEVMNodeResource(
+ types.NodeStatus{
+ ChainID: chainID,
+ Name: nodeName,
+ Config: cfg,
+ State: state,
+ })
+ r = evmNodeResource
+ nodeResource = evmNodeResource.NodeResource
+ case "solana":
+ solanaNodeResource := NewSolanaNodeResource(
+ types.NodeStatus{
+ ChainID: chainID,
+ Name: nodeName,
+ Config: cfg,
+ State: state,
+ })
+ r = solanaNodeResource
+ nodeResource = solanaNodeResource.NodeResource
+ case "cosmos":
+ cosmosNodeResource := NewCosmosNodeResource(
+ types.NodeStatus{
+ ChainID: chainID,
+ Name: nodeName,
+ Config: cfg,
+ State: state,
+ })
+ r = cosmosNodeResource
+ nodeResource = cosmosNodeResource.NodeResource
+ case "starknet":
+ starknetNodeResource := NewStarkNetNodeResource(
+ types.NodeStatus{
+ ChainID: chainID,
+ Name: nodeName,
+ Config: cfg,
+ State: state,
+ })
+ r = starknetNodeResource
+ nodeResource = starknetNodeResource.NodeResource
+ default:
+ t.Fail()
+ }
+ assert.Equal(t, chainID, nodeResource.ChainID)
+ assert.Equal(t, nodeName, nodeResource.Name)
+ assert.Equal(t, cfg, nodeResource.Config)
+ assert.Equal(t, state, nodeResource.State)
+
+ b, err := jsonapi.Marshal(r)
+ require.NoError(t, err)
+
+ expected := fmt.Sprintf(`
+ {
+ "data":{
+ "type":"%s_node",
+ "id":"%s/%s",
+ "attributes":{
+ "chainID":"%s",
+ "name":"%s",
+ "config":"%s",
+ "state":"%s"
+ }
+ }
+ }
+ `, tc, chainID, nodeName, chainID, nodeName, cfg, state)
+ assert.JSONEq(t, expected, string(b))
+ }
+}
diff --git a/core/web/presenters/solana_chain.go b/core/web/presenters/solana_chain.go
index f04d2b65d55..798d98124a5 100644
--- a/core/web/presenters/solana_chain.go
+++ b/core/web/presenters/solana_chain.go
@@ -36,7 +36,7 @@ func (r SolanaNodeResource) GetName() string {
// NewSolanaNodeResource returns a new SolanaNodeResource for node.
func NewSolanaNodeResource(node types.NodeStatus) SolanaNodeResource {
return SolanaNodeResource{NodeResource{
- JAID: NewJAID(node.Name),
+ JAID: NewPrefixedJAID(node.Name, node.ChainID),
ChainID: node.ChainID,
Name: node.Name,
State: node.State,
diff --git a/core/web/presenters/solana_msg.go b/core/web/presenters/solana_msg.go
index b7330754e38..3acf2aac0dc 100644
--- a/core/web/presenters/solana_msg.go
+++ b/core/web/presenters/solana_msg.go
@@ -17,7 +17,7 @@ func (SolanaMsgResource) GetName() string {
// NewSolanaMsgResource returns a new partial SolanaMsgResource.
func NewSolanaMsgResource(id string, chainID string) SolanaMsgResource {
return SolanaMsgResource{
- JAID: NewJAID(id),
+ JAID: NewPrefixedJAID(id, chainID),
ChainID: chainID,
}
}
diff --git a/core/web/presenters/starknet_chain.go b/core/web/presenters/starknet_chain.go
index ec1cd453a55..addf798fe9f 100644
--- a/core/web/presenters/starknet_chain.go
+++ b/core/web/presenters/starknet_chain.go
@@ -36,7 +36,7 @@ func (r StarkNetNodeResource) GetName() string {
// NewStarkNetNodeResource returns a new StarkNetNodeResource for node.
func NewStarkNetNodeResource(node types.NodeStatus) StarkNetNodeResource {
return StarkNetNodeResource{NodeResource{
- JAID: NewJAID(node.Name),
+ JAID: NewPrefixedJAID(node.Name, node.ChainID),
ChainID: node.ChainID,
Name: node.Name,
State: node.State,
diff --git a/core/web/resolver/chain_test.go b/core/web/resolver/chain_test.go
index 700963cd4da..b7a4b7c8386 100644
--- a/core/web/resolver/chain_test.go
+++ b/core/web/resolver/chain_test.go
@@ -8,8 +8,12 @@ import (
"github.com/pelletier/go-toml/v2"
"github.com/stretchr/testify/require"
+ "github.com/smartcontractkit/chainlink-common/pkg/loop"
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
evmtoml "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
+ chainlinkmocks "github.com/smartcontractkit/chainlink/v2/core/services/chainlink/mocks"
+ "github.com/smartcontractkit/chainlink/v2/core/web/testutils"
)
func TestResolver_Chains(t *testing.T) {
@@ -70,13 +74,24 @@ ResendAfterThreshold = '1h0m0s'
name: "success",
authenticated: true,
before: func(f *gqlTestFramework) {
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
- f.Mocks.evmORM.PutChains(evmtoml.EVMConfig{
+ chainConf := evmtoml.EVMConfig{
ChainID: &chainID,
Enabled: chain.Enabled,
Chain: chain.Chain,
- })
+ }
+
+ chainConfToml, err2 := chainConf.TOMLString()
+ require.NoError(t, err2)
+
+ f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{
+ testutils.MockRelayer{ChainStatus: commontypes.ChainStatus{
+ ID: chainID.String(),
+ Enabled: *chain.Enabled,
+ Config: chainConfToml,
+ }},
+ }})
+
},
query: query,
result: fmt.Sprintf(`
@@ -93,6 +108,25 @@ ResendAfterThreshold = '1h0m0s'
}
}`, configTOMLEscaped),
},
+ unauthorizedTestCase(GQLTestCase{query: query}, "chains"),
+ {
+ name: "no chains",
+ authenticated: true,
+ before: func(f *gqlTestFramework) {
+ f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{}})
+
+ },
+ query: query,
+ result: `
+ {
+ "chains": {
+ "results": [],
+ "metadata": {
+ "total": 0
+ }
+ }
+ }`,
+ },
}
RunGQLTests(t, testCases)
diff --git a/core/web/resolver/eth_key_test.go b/core/web/resolver/eth_key_test.go
index 1874e4c68e0..f574c885ff9 100644
--- a/core/web/resolver/eth_key_test.go
+++ b/core/web/resolver/eth_key_test.go
@@ -10,6 +10,8 @@ import (
"github.com/stretchr/testify/mock"
commonassets "github.com/smartcontractkit/chainlink-common/pkg/assets"
+ "github.com/smartcontractkit/chainlink-common/pkg/loop"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/config"
mocks2 "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/mocks"
@@ -17,6 +19,7 @@ import (
"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/testutils/configtest"
+ "github.com/smartcontractkit/chainlink/v2/core/web/testutils"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
evmrelay "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
@@ -102,10 +105,18 @@ func TestResolver_ETHKeys(t *testing.T) {
f.Mocks.chain.On("BalanceMonitor").Return(f.Mocks.balM)
f.Mocks.chain.On("Config").Return(f.Mocks.scfg)
f.Mocks.relayerChainInterops.EVMChains = legacyEVMChains
+ f.Mocks.relayerChainInterops.Relayers = []loop.Relayer{
+ testutils.MockRelayer{
+ ChainStatus: types.ChainStatus{
+ ID: "12",
+ Enabled: true,
+ },
+ NodeStatuses: nil,
+ },
+ }
f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})
f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)
f.App.On("GetKeyStore").Return(f.Mocks.keystore)
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)
f.Mocks.scfg.On("EVM").Return(&evmMockConfig)
@@ -152,9 +163,17 @@ func TestResolver_ETHKeys(t *testing.T) {
f.Mocks.ethKs.On("GetAll").Return(keys, nil)
f.Mocks.relayerChainInterops.EVMChains = f.Mocks.legacyEVMChains
f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})
+ f.Mocks.relayerChainInterops.Relayers = []loop.Relayer{
+ testutils.MockRelayer{
+ ChainStatus: types.ChainStatus{
+ ID: "12",
+ Enabled: true,
+ },
+ NodeStatuses: nil,
+ },
+ }
f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)
f.App.On("GetKeyStore").Return(f.Mocks.keystore)
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)
},
query: query,
@@ -304,6 +323,15 @@ func TestResolver_ETHKeys(t *testing.T) {
f.Mocks.ethClient.On("LINKBalance", mock.Anything, address, linkAddr).Return(commonassets.NewLinkFromJuels(12), gError)
f.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String()).Return(f.Mocks.chain, nil)
f.Mocks.relayerChainInterops.EVMChains = f.Mocks.legacyEVMChains
+ f.Mocks.relayerChainInterops.Relayers = []loop.Relayer{
+ testutils.MockRelayer{
+ ChainStatus: types.ChainStatus{
+ ID: "12",
+ Enabled: true,
+ },
+ NodeStatuses: nil,
+ },
+ }
f.Mocks.chain.On("Client").Return(f.Mocks.ethClient)
f.Mocks.balM.On("GetEthBalance", address).Return(assets.NewEth(1))
f.Mocks.chain.On("BalanceMonitor").Return(f.Mocks.balM)
@@ -311,7 +339,6 @@ func TestResolver_ETHKeys(t *testing.T) {
f.Mocks.chain.On("Config").Return(f.Mocks.scfg)
f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})
f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
f.Mocks.scfg.On("EVM").Return(&evmMockConfig)
},
query: query,
@@ -361,9 +388,17 @@ func TestResolver_ETHKeys(t *testing.T) {
f.Mocks.legacyEVMChains.On("Get", states[0].EVMChainID.String()).Return(f.Mocks.chain, nil)
f.Mocks.relayerChainInterops.EVMChains = f.Mocks.legacyEVMChains
f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})
+ f.Mocks.relayerChainInterops.Relayers = []loop.Relayer{
+ testutils.MockRelayer{
+ ChainStatus: types.ChainStatus{
+ ID: "12",
+ Enabled: true,
+ },
+ NodeStatuses: nil,
+ },
+ }
f.Mocks.keystore.On("Eth").Return(f.Mocks.ethKs)
f.App.On("GetKeyStore").Return(f.Mocks.keystore)
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
f.App.On("GetRelayers").Return(f.Mocks.relayerChainInterops)
f.Mocks.scfg.On("EVM").Return(&evmMockConfig)
},
diff --git a/core/web/resolver/eth_transaction_test.go b/core/web/resolver/eth_transaction_test.go
index 238aa9d1679..5c50d60539e 100644
--- a/core/web/resolver/eth_transaction_test.go
+++ b/core/web/resolver/eth_transaction_test.go
@@ -9,6 +9,8 @@ import (
"github.com/ethereum/go-ethereum/common"
gqlerrors "github.com/graph-gophers/graphql-go/errors"
+ "github.com/smartcontractkit/chainlink-common/pkg/loop"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
txmgrcommon "github.com/smartcontractkit/chainlink/v2/common/txmgr"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
@@ -16,6 +18,8 @@ import (
"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"
+ chainlinkmocks "github.com/smartcontractkit/chainlink/v2/core/services/chainlink/mocks"
+ "github.com/smartcontractkit/chainlink/v2/core/web/testutils"
)
func TestResolver_EthTransaction(t *testing.T) {
@@ -85,7 +89,15 @@ func TestResolver_EthTransaction(t *testing.T) {
}, nil)
f.App.On("TxmStorageService").Return(f.Mocks.txmStore)
f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
+ f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{
+ Relayers: []loop.Relayer{
+ testutils.MockRelayer{ChainStatus: types.ChainStatus{
+ ID: "22",
+ Enabled: true,
+ Config: "",
+ }},
+ },
+ })
},
query: query,
variables: variables,
@@ -142,7 +154,15 @@ func TestResolver_EthTransaction(t *testing.T) {
}, nil)
f.App.On("TxmStorageService").Return(f.Mocks.txmStore)
f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
+ f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{
+ Relayers: []loop.Relayer{
+ testutils.MockRelayer{ChainStatus: types.ChainStatus{
+ ID: "22",
+ Enabled: true,
+ Config: "",
+ }},
+ },
+ })
},
query: query,
variables: variables,
diff --git a/core/web/resolver/node_test.go b/core/web/resolver/node_test.go
index 7f4e69ac4ae..62e964a6820 100644
--- a/core/web/resolver/node_test.go
+++ b/core/web/resolver/node_test.go
@@ -6,19 +6,16 @@ import (
gqlerrors "github.com/graph-gophers/graphql-go/errors"
"github.com/pkg/errors"
- commonconfig "github.com/smartcontractkit/chainlink-common/pkg/config"
+ "github.com/smartcontractkit/chainlink-common/pkg/loop"
"github.com/smartcontractkit/chainlink-common/pkg/types"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/config/toml"
- "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
- "github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
+ chainlinkmocks "github.com/smartcontractkit/chainlink/v2/core/services/chainlink/mocks"
+ "github.com/smartcontractkit/chainlink/v2/core/web/testutils"
)
func TestResolver_Nodes(t *testing.T) {
t.Parallel()
var (
- chainID = *big.NewI(1)
-
query = `
query GetNodes {
nodes {
@@ -43,16 +40,24 @@ func TestResolver_Nodes(t *testing.T) {
name: "success",
authenticated: true,
before: func(f *gqlTestFramework) {
- f.App.On("GetRelayers").Return(chainlink.RelayerChainInteroperators(f.Mocks.relayerChainInterops))
- f.Mocks.relayerChainInterops.Nodes = []types.NodeStatus{
- {
- Name: "node-name",
- ChainID: chainID.String(),
- Config: `Name = 'node-name'`,
+ f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{
+ Nodes: []types.NodeStatus{
+ {
+ ChainID: "1",
+ Name: "node-name",
+ Config: "Name='node-name'\nOrder=11\nHTTPURL='http://some-url'\nWSURL='ws://some-url'",
+ State: "alive",
+ },
},
- }
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
- f.Mocks.evmORM.PutChains(toml.EVMConfig{ChainID: &chainID})
+ Relayers: []loop.Relayer{
+ testutils.MockRelayer{ChainStatus: types.ChainStatus{
+ ID: "1",
+ Enabled: true,
+ Config: "",
+ }},
+ },
+ })
+
},
query: query,
result: `
@@ -113,21 +118,20 @@ func Test_NodeQuery(t *testing.T) {
}
}`
- var name = "node-name"
-
testCases := []GQLTestCase{
unauthorizedTestCase(GQLTestCase{query: query}, "node"),
{
name: "success",
authenticated: true,
before: func(f *gqlTestFramework) {
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
- f.Mocks.evmORM.PutChains(toml.EVMConfig{Nodes: []*toml.Node{{
- Name: &name,
- WSURL: commonconfig.MustParseURL("ws://some-url"),
- HTTPURL: commonconfig.MustParseURL("http://some-url"),
- Order: ptr(int32(11)),
- }}})
+ f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{
+ testutils.MockRelayer{NodeStatuses: []types.NodeStatus{
+ {
+ Name: "node-name",
+ Config: "Name='node-name'\nOrder=11\nHTTPURL='http://some-url'\nWSURL='ws://some-url'",
+ },
+ }},
+ }})
},
query: query,
result: `
@@ -144,7 +148,7 @@ func Test_NodeQuery(t *testing.T) {
name: "not found error",
authenticated: true,
before: func(f *gqlTestFramework) {
- f.App.On("EVMORM").Return(f.Mocks.evmORM)
+ f.App.On("GetRelayers").Return(&chainlinkmocks.FakeRelayerChainInteroperators{Relayers: []loop.Relayer{}})
},
query: query,
result: `
@@ -159,5 +163,3 @@ func Test_NodeQuery(t *testing.T) {
RunGQLTests(t, testCases)
}
-
-func ptr[T any](t T) *T { return &t }
diff --git a/core/web/resolver/query.go b/core/web/resolver/query.go
index da15b7f7c26..ccc9da2ab91 100644
--- a/core/web/resolver/query.go
+++ b/core/web/resolver/query.go
@@ -95,10 +95,21 @@ func (r *Resolver) Chains(ctx context.Context, args struct {
offset := pageOffset(args.Offset)
limit := pageLimit(args.Limit)
- chains, count, err := r.App.EVMORM().Chains()
- if err != nil {
- return nil, err
+ var chains []types.ChainStatus
+ for _, rel := range r.App.GetRelayers().Slice() {
+ status, err := rel.GetChainStatus(ctx)
+ if err != nil {
+ return nil, err
+ }
+ chains = append(chains, status)
+ }
+ count := len(chains)
+
+ if count == 0 {
+ //No chains are configured, return an empty ChainsPayload, so we don't break the UI
+ return NewChainsPayload(nil, 0), nil
}
+
// bound the chain results
if offset >= len(chains) {
return nil, fmt.Errorf("offset %d out of range", offset)
@@ -238,25 +249,25 @@ func (r *Resolver) Node(ctx context.Context, args struct{ ID graphql.ID }) (*Nod
r.App.GetLogger().Debug("resolver Node args %v", args)
name := string(args.ID)
r.App.GetLogger().Debug("resolver Node name %s", name)
- node, err := r.App.EVMORM().NodeStatus(name)
- if err != nil {
- r.App.GetLogger().Errorw("resolver getting node status", "err", err)
- if errors.Is(err, chains.ErrNotFound) {
- npr, warn := NewNodePayloadResolver(nil, err)
- if warn != nil {
- r.App.GetLogger().Warnw("Error creating NodePayloadResolver", "name", name, "err", warn)
+ for _, relayer := range r.App.GetRelayers().Slice() {
+ statuses, _, _, err := relayer.ListNodeStatuses(ctx, 0, "")
+ if err != nil {
+ return nil, err
+ }
+ for i, s := range statuses {
+ if s.Name == name {
+ npr, err2 := NewNodePayloadResolver(&statuses[i], nil)
+ if err2 != nil {
+ return nil, err2
+ }
+ return npr, nil
}
- return npr, nil
}
- return nil, err
}
- npr, warn := NewNodePayloadResolver(&node, nil)
- if warn != nil {
- r.App.GetLogger().Warnw("Error creating NodePayloadResolver", "name", name, "err", warn)
- }
- return npr, nil
+ r.App.GetLogger().Errorw("resolver getting node status", "err", chains.ErrNotFound)
+ return NewNodePayloadResolver(nil, chains.ErrNotFound)
}
func (r *Resolver) P2PKeys(ctx context.Context) (*P2PKeysPayloadResolver, error) {
diff --git a/core/web/resolver/testdata/config-multi-chain-effective.toml b/core/web/resolver/testdata/config-multi-chain-effective.toml
index bd64ae04812..03990b02a50 100644
--- a/core/web/resolver/testdata/config-multi-chain-effective.toml
+++ b/core/web/resolver/testdata/config-multi-chain-effective.toml
@@ -305,7 +305,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'primary'
@@ -392,7 +392,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'foo'
@@ -413,7 +413,7 @@ MinIncomingConfirmations = 5
MinContractPayment = '0.00001 link'
NonceAutoSync = true
NoNewHeadsThreshold = '30s'
-RPCDefaultBatchSize = 250
+RPCDefaultBatchSize = 100
RPCBlockQueryDelay = 10
[EVM.Transactions]
@@ -473,7 +473,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'bar'
diff --git a/core/web/testdata/body/health.txt b/core/web/testdata/body/health.txt
index 59f63c26413..03a78c22c28 100644
--- a/core/web/testdata/body/health.txt
+++ b/core/web/testdata/body/health.txt
@@ -1,20 +1,20 @@
--EVM.0
--EVM.0.BalanceMonitor
--EVM.0.HeadBroadcaster
--EVM.0.HeadTracker
-!EVM.0.HeadTracker.HeadListener
+ok EVM.0
+ok EVM.0.BalanceMonitor
+ok EVM.0.HeadBroadcaster
+ok EVM.0.HeadTracker
+! EVM.0.HeadTracker.HeadListener
Listener is not connected
--EVM.0.LogBroadcaster
--EVM.0.Txm
--EVM.0.Txm.BlockHistoryEstimator
--EVM.0.Txm.Broadcaster
--EVM.0.Txm.Confirmer
--EVM.0.Txm.WrappedEvmEstimator
--JobSpawner
--Mailbox.Monitor
--Mercury.WSRPCPool
--Mercury.WSRPCPool.CacheSet
--PipelineORM
--PipelineRunner
--PromReporter
--TelemetryManager
+ok EVM.0.LogBroadcaster
+ok EVM.0.Txm
+ok EVM.0.Txm.BlockHistoryEstimator
+ok EVM.0.Txm.Broadcaster
+ok EVM.0.Txm.Confirmer
+ok EVM.0.Txm.WrappedEvmEstimator
+ok JobSpawner
+ok Mailbox.Monitor
+ok Mercury.WSRPCPool
+ok Mercury.WSRPCPool.CacheSet
+ok PipelineORM
+ok PipelineRunner
+ok PromReporter
+ok TelemetryManager
diff --git a/core/web/testdata/health.txt b/core/web/testdata/health.txt
index f155d6c0212..89882cc1159 100644
--- a/core/web/testdata/health.txt
+++ b/core/web/testdata/health.txt
@@ -1,15 +1,15 @@
--foo
-!foo.bar
+ok foo
+! foo.bar
example error message
--foo.bar.1
--foo.bar.1.A
--foo.bar.1.B
-!foo.bar.2
+ok foo.bar.1
+ok foo.bar.1.A
+ok foo.bar.1.B
+! foo.bar.2
error:
this is a multi-line error:
new line:
original error
-!foo.bar.2.A
+! foo.bar.2.A
failure!
--foo.bar.2.B
--foo.baz
+ok foo.bar.2.B
+ok foo.baz
diff --git a/core/web/testutils/mock_relayer.go b/core/web/testutils/mock_relayer.go
new file mode 100644
index 00000000000..d6a44a2379d
--- /dev/null
+++ b/core/web/testutils/mock_relayer.go
@@ -0,0 +1,57 @@
+package testutils
+
+import (
+ "context"
+ "math/big"
+
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+)
+
+type MockRelayer struct {
+ ChainStatus commontypes.ChainStatus
+ NodeStatuses []commontypes.NodeStatus
+}
+
+func (m MockRelayer) Name() string {
+ panic("not implemented")
+}
+
+func (m MockRelayer) Start(ctx context.Context) error {
+ panic("not implemented")
+}
+
+func (m MockRelayer) Close() error {
+ panic("not implemented")
+}
+
+func (m MockRelayer) Ready() error {
+ panic("not implemented")
+}
+
+func (m MockRelayer) HealthReport() map[string]error {
+ panic("not implemented")
+}
+
+func (m MockRelayer) GetChainStatus(ctx context.Context) (commontypes.ChainStatus, error) {
+ return m.ChainStatus, nil
+}
+
+func (m MockRelayer) ListNodeStatuses(ctx context.Context, pageSize int32, pageToken string) (stats []commontypes.NodeStatus, nextPageToken string, total int, err error) {
+ return m.NodeStatuses, "", len(m.NodeStatuses), nil
+}
+
+func (m MockRelayer) Transact(ctx context.Context, from, to string, amount *big.Int, balanceCheck bool) error {
+ panic("not implemented")
+}
+
+func (m MockRelayer) NewConfigProvider(ctx context.Context, args commontypes.RelayArgs) (commontypes.ConfigProvider, error) {
+ panic("not implemented")
+}
+
+func (m MockRelayer) NewPluginProvider(ctx context.Context, args commontypes.RelayArgs, args2 commontypes.PluginArgs) (commontypes.PluginProvider, error) {
+ panic("not implemented")
+}
+
+func (m MockRelayer) NewLLOProvider(ctx context.Context, rargs commontypes.RelayArgs, pargs commontypes.PluginArgs) (commontypes.LLOProvider, error) {
+ panic("not implemented")
+}
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index cb4a24e0b69..e7a303d7ab1 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -9,7 +9,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [dev]
-...
+### Added
+
+- Gas bumping logic to the `SuggestedPriceEstimator`. The bumping mechanism for this estimator refetches the price from the RPC and adds a buffer on top using the greater of `BumpPercent` and `BumpMin`.
## 2.9.0 - UNRELEASED
@@ -23,7 +25,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
echo "Baz=Val" >> median.env
CL_MEDIAN_ENV="median.env"
```
-- Gas bumping logic to the `SuggestedPriceEstimator`
### Fixed
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 98259fd5962..3bf68bbe6d0 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -1668,7 +1668,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -1749,7 +1749,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -1830,7 +1830,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -1911,7 +1911,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2074,7 +2074,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2155,7 +2155,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2237,7 +2237,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2318,7 +2318,7 @@ ObservationGracePeriod = '500ms'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2398,7 +2398,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2478,7 +2478,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2559,7 +2559,7 @@ ObservationGracePeriod = '500ms'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2641,7 +2641,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2722,7 +2722,7 @@ ObservationGracePeriod = '500ms'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2743,7 +2743,7 @@ MinIncomingConfirmations = 5
MinContractPayment = '0.00001 link'
NonceAutoSync = true
NoNewHeadsThreshold = '30s'
-RPCDefaultBatchSize = 250
+RPCDefaultBatchSize = 100
RPCBlockQueryDelay = 10
[Transactions]
@@ -2803,7 +2803,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -2965,7 +2965,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3046,7 +3046,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3127,7 +3127,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3290,7 +3290,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3370,7 +3370,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3451,7 +3451,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3471,7 +3471,7 @@ MinIncomingConfirmations = 1
MinContractPayment = '0.00001 link'
NonceAutoSync = true
NoNewHeadsThreshold = '6m0s'
-RPCDefaultBatchSize = 250
+RPCDefaultBatchSize = 100
RPCBlockQueryDelay = 15
[Transactions]
@@ -3531,7 +3531,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3612,7 +3612,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3693,7 +3693,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3773,7 +3773,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3793,7 +3793,7 @@ MinIncomingConfirmations = 1
MinContractPayment = '0.00001 link'
NonceAutoSync = true
NoNewHeadsThreshold = '12m0s'
-RPCDefaultBatchSize = 250
+RPCDefaultBatchSize = 100
RPCBlockQueryDelay = 1
[Transactions]
@@ -3853,7 +3853,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -3934,7 +3934,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4095,7 +4095,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4339,7 +4339,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4420,7 +4420,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4501,7 +4501,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4582,7 +4582,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4662,7 +4662,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4742,7 +4742,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4763,7 +4763,7 @@ MinIncomingConfirmations = 5
MinContractPayment = '0.00001 link'
NonceAutoSync = true
NoNewHeadsThreshold = '30s'
-RPCDefaultBatchSize = 250
+RPCDefaultBatchSize = 100
RPCBlockQueryDelay = 10
[Transactions]
@@ -4823,7 +4823,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4909,6 +4909,87 @@ GasLimit = 6500000
+Base Sepolia (84532)
+
+```toml
+AutoCreateKey = true
+BlockBackfillDepth = 10
+BlockBackfillSkip = false
+ChainType = 'optimismBedrock'
+FinalityDepth = 200
+FinalityTagEnabled = false
+LogBackfillBatchSize = 1000
+LogPollInterval = '2s'
+LogKeepBlocksDepth = 100000
+MinIncomingConfirmations = 1
+MinContractPayment = '0.00001 link'
+NonceAutoSync = true
+NoNewHeadsThreshold = '40s'
+RPCDefaultBatchSize = 250
+RPCBlockQueryDelay = 1
+
+[Transactions]
+ForwardersEnabled = false
+MaxInFlight = 16
+MaxQueued = 250
+ReaperInterval = '1h0m0s'
+ReaperThreshold = '168h0m0s'
+ResendAfterThreshold = '30s'
+
+[BalanceMonitor]
+Enabled = true
+
+[GasEstimator]
+Mode = 'BlockHistory'
+PriceDefault = '20 gwei'
+PriceMax = '115792089237316195423570985008687907853269984665.640564039457584007913129639935 tether'
+PriceMin = '1 wei'
+LimitDefault = 500000
+LimitMax = 500000
+LimitMultiplier = '1'
+LimitTransfer = 21000
+BumpMin = '100 wei'
+BumpPercent = 20
+BumpThreshold = 3
+EIP1559DynamicFees = true
+FeeCapDefault = '100 gwei'
+TipCapDefault = '1 wei'
+TipCapMin = '1 wei'
+
+[GasEstimator.BlockHistory]
+BatchSize = 25
+BlockHistorySize = 60
+CheckInclusionBlocks = 12
+CheckInclusionPercentile = 90
+TransactionPercentile = 60
+
+[HeadTracker]
+HistoryDepth = 300
+MaxBufferSize = 3
+SamplingInterval = '1s'
+
+[NodePool]
+PollFailureThreshold = 5
+PollInterval = '10s'
+SelectionMode = 'HighestHead'
+SyncThreshold = 10
+LeaseDuration = '0s'
+
+[OCR]
+ContractConfirmations = 1
+ContractTransmitterTransmitTimeout = '10s'
+DatabaseTimeout = '10s'
+DeltaCOverride = '168h0m0s'
+DeltaCJitterOverride = '1h0m0s'
+ObservationGracePeriod = '1s'
+
+[OCR2]
+[OCR2.Automation]
+GasLimit = 6500000
+```
+
+
+
Arbitrum Rinkeby (421611)
```toml
@@ -4986,7 +5067,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5230,7 +5311,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5311,7 +5392,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5392,7 +5473,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5473,7 +5554,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5554,7 +5635,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -6316,13 +6397,13 @@ Order of the node in the pool, will takes effect if `SelectionMode` is `Priority
## EVM.OCR2.Automation
```toml
[EVM.OCR2.Automation]
-GasLimit = 5300000 # Default
+GasLimit = 5400000 # Default
```
### GasLimit
```toml
-GasLimit = 5300000 # Default
+GasLimit = 5400000 # Default
```
GasLimit controls the gas limit for transmit transactions from ocr2automation job.
diff --git a/fuzz/.gitignore b/fuzz/.gitignore
new file mode 100644
index 00000000000..600ab25dfaf
--- /dev/null
+++ b/fuzz/.gitignore
@@ -0,0 +1 @@
+*/fuzzer
\ No newline at end of file
diff --git a/fuzz/fuzz_all_native.py b/fuzz/fuzz_all_native.py
new file mode 100755
index 00000000000..41588b090b7
--- /dev/null
+++ b/fuzz/fuzz_all_native.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python3
+
+import argparse
+import itertools
+import os
+import re
+import subprocess
+import sys
+
+LIBROOT = "../"
+
+def main():
+ parser = argparse.ArgumentParser(
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ description="\n".join([
+ "Fuzz helper to run all native go fuzzers in chainlink",
+ "",
+ ]),
+ )
+ parser.add_argument("--ci", required=False, help="In CI mode we run each parser only briefly once", action="store_true")
+ parser.add_argument("--seconds", required=False, help="Run for this many seconds of total fuzz time before exiting")
+ args = parser.parse_args()
+
+ # use float for remaining_seconds so we can represent infinity
+ if args.seconds:
+ remaining_seconds = float(args.seconds)
+ else:
+ remaining_seconds = float("inf")
+
+ fuzzers = discover_fuzzers()
+ print(f"🐝 Discovered fuzzers:", file=sys.stderr)
+ for fuzzfn, path in fuzzers.items():
+ print(f"{fuzzfn} in {path}", file=sys.stderr)
+
+ if args.ci:
+ # only run each fuzzer once for 60 seconds in CI
+ durations_seconds = [60]
+ else:
+ # run forever or until --seconds, with increasingly longer durations per fuzz run
+ durations_seconds = itertools.chain([5, 10, 30, 90, 270], itertools.repeat(600))
+
+ for duration_seconds in durations_seconds:
+ print(f"🐝 Running each fuzzer for {duration_seconds}s before switching to next fuzzer", file=sys.stderr)
+ for fuzzfn, path in fuzzers.items():
+ if remaining_seconds <= 0:
+ print(f"🐝 Time budget of {args.seconds}s is exhausted. Exiting.", file=sys.stderr)
+ return
+
+ next_duration_seconds = min(remaining_seconds, duration_seconds)
+ remaining_seconds -= next_duration_seconds
+
+ print(f"🐝 Running {fuzzfn} in {path} for {next_duration_seconds}s before switching to next fuzzer", file=sys.stderr)
+ run_fuzzer(fuzzfn, path, next_duration_seconds)
+ print(f"🐝 Completed running {fuzzfn} in {path} for {next_duration_seconds}s. Total remaining time is {remaining_seconds}s", file=sys.stderr)
+
+def discover_fuzzers():
+ fuzzers = {}
+ for root, dirs, files in os.walk(LIBROOT):
+ for file in files:
+ if not file.endswith("test.go"): continue
+ with open(os.path.join(root, file), "r") as f:
+ text = f.read()
+ # ignore multiline comments
+ text = re.sub(r"(?s)/[*].*?[*]/", "", text)
+ # ignore single line comments *except* build tags
+ text = re.sub(r"//.*", "", text)
+ # Find every function with a name like FuzzXXX
+ for fuzzfn in re.findall(r"func\s+(Fuzz\w+)", text):
+ if fuzzfn in fuzzers:
+ raise Exception(f"Duplicate fuzz function: {fuzzfn}")
+ fuzzers[fuzzfn] = os.path.relpath(root, LIBROOT)
+ return fuzzers
+
+def run_fuzzer(fuzzfn, dir, duration_seconds):
+ subprocess.check_call(["go", "test", "-run=^$", f"-fuzz=^{fuzzfn}$", f"-fuzztime={duration_seconds}s", f"./{dir}"], cwd=LIBROOT)
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/go.md b/go.md
index 2a893c2a55e..97330440a54 100644
--- a/go.md
+++ b/go.md
@@ -51,6 +51,8 @@ flowchart LR
chainlink-common --> libocr
chainlink-cosmos --> chainlink-common
chainlink-cosmos --> libocr
+ chainlink-data-streams --> chain-selectors
+ click chain-selectors href "https://github.com/smartcontractkit/chain-selectors"
chainlink-data-streams --> chainlink-common
chainlink-data-streams --> libocr
chainlink-feeds --> chainlink-common
diff --git a/go.mod b/go.mod
index e0e7f5144a0..97888716f2a 100644
--- a/go.mod
+++ b/go.mod
@@ -34,12 +34,13 @@ require (
github.com/graph-gophers/graphql-go v1.3.0
github.com/hashicorp/consul/sdk v0.14.1
github.com/hashicorp/go-envparse v0.1.0
- github.com/hashicorp/go-plugin v1.5.2
+ github.com/hashicorp/go-plugin v1.6.0
github.com/hdevalence/ed25519consensus v0.1.0
github.com/jackc/pgconn v1.14.1
github.com/jackc/pgtype v1.14.0
github.com/jackc/pgx/v4 v4.18.1
github.com/jmoiron/sqlx v1.3.5
+ github.com/jonboulle/clockwork v0.4.0
github.com/jpillora/backoff v1.0.0
github.com/kylelemons/godebug v1.1.0
github.com/leanovate/gopter v0.2.10-0.20210127095200-9abe2343507a
@@ -66,12 +67,12 @@ require (
github.com/shopspring/decimal v1.3.1
github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429
- github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa
- github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0
- github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1
+ github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4
+ github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8
+ github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8
- github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba
- github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007
+ github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0
+ github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868
github.com/smartcontractkit/libocr v0.0.0-20240112202000-6359502d2ff1
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1
@@ -91,16 +92,16 @@ require (
go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.46.1
go.uber.org/multierr v1.11.0
go.uber.org/zap v1.26.0
- golang.org/x/crypto v0.17.0
- golang.org/x/exp v0.0.0-20231127185646-65229373498e
- golang.org/x/sync v0.5.0
- golang.org/x/term v0.15.0
+ golang.org/x/crypto v0.19.0
+ golang.org/x/exp v0.0.0-20240213143201-ec583247a57a
+ golang.org/x/sync v0.6.0
+ golang.org/x/term v0.17.0
golang.org/x/text v0.14.0
golang.org/x/time v0.5.0
- golang.org/x/tools v0.16.0
+ golang.org/x/tools v0.18.0
gonum.org/v1/gonum v0.14.0
google.golang.org/grpc v1.59.0
- google.golang.org/protobuf v1.31.0
+ google.golang.org/protobuf v1.32.0
gopkg.in/guregu/null.v2 v2.1.2
gopkg.in/guregu/null.v4 v4.0.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
@@ -219,7 +220,7 @@ require (
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
github.com/hashicorp/golang-lru v0.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
- github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce // indirect
+ github.com/hashicorp/yamux v0.1.1 // indirect
github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 // indirect
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
github.com/holiman/uint256 v1.2.4 // indirect
@@ -311,10 +312,11 @@ require (
go.opentelemetry.io/otel/trace v1.21.0 // indirect
go.opentelemetry.io/proto/otlp v1.0.0 // indirect
go.uber.org/ratelimit v0.2.0 // indirect
- golang.org/x/arch v0.6.0 // indirect
- golang.org/x/mod v0.14.0 // indirect
- golang.org/x/net v0.19.0 // indirect
- golang.org/x/sys v0.15.0 // indirect
+ golang.org/x/arch v0.7.0 // indirect
+ golang.org/x/mod v0.15.0 // indirect
+ golang.org/x/net v0.21.0 // indirect
+ golang.org/x/oauth2 v0.17.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
google.golang.org/api v0.149.0 // indirect
google.golang.org/genproto v0.0.0-20231030173426-d783a09b4405 // indirect
@@ -334,7 +336,7 @@ replace (
github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
// until merged upstream: https://github.com/hashicorp/go-plugin/pull/257
- github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306
+ github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16
// until merged upstream: https://github.com/mwitkow/grpc-proxy/pull/69
github.com/mwitkow/grpc-proxy => github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f
diff --git a/go.sum b/go.sum
index c8f6620af85..2df7a8d7c46 100644
--- a/go.sum
+++ b/go.sum
@@ -721,8 +721,8 @@ github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
-github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce h1:7UnVY3T/ZnHUrfviiAgIUjg2PXxsQfs5bphsG8F7Keo=
-github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
+github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
+github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU=
github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo=
github.com/holiman/billy v0.0.0-20230718173358-1c7e68d277a7 h1:3JQNjnMRil1yD0IfZKHF9GxxWKDJGj8I0IqOUol//sw=
@@ -1164,22 +1164,22 @@ github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704 h1:T3lFWumv
github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704/go.mod h1:2QuJdEouTWjh5BDy5o/vgGXQtR4Gz8yH1IYB5eT7u4M=
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429 h1:xkejUBZhcBpBrTSfxc91Iwzadrb6SXw8ks69bHIQ9Ww=
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429/go.mod h1:wJmVvDf4XSjsahWtfUq3wvIAYEAuhr7oxmxYnEL/LGQ=
-github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa h1:9g7e1C3295ALDK8Gs42fIKSSJfI+H1RoBmivGWTvIZo=
-github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa/go.mod h1:05rRF84QKlIOF5LfTBPkHdw4UpBI2G3zxRcuZ65bPjk=
-github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0 h1:NALwENz6vQ972DuD9AZjqRjyNSxH9ptNapizQGLI+2s=
-github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0/go.mod h1:NcVAT/GETDBvIoAej5K6OYqAtDOkF6vO5pYw/hLuYVU=
-github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1 h1:xYqRgZO0nMSO8CBCMR0r3WA+LZ4kNL8a6bnbyk/oBtQ=
-github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1/go.mod h1:GuPvyXryvbiUZIHmPeLBz4L+yJKeyGUjrDfd1KNne+o=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4 h1:Yk0RK9WV59ISOZZMsdtxZBAKaBfdgb05oXyca/qSqcw=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4/go.mod h1:pRlQrvcizMmuHAUV4N96oO2e3XbA99JCQELLc6ES160=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8 h1:I326nw5GwHQHsLKHwtu5Sb9EBLylC8CfUd7BFAS0jtg=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8/go.mod h1:a65NtrK4xZb01mf0dDNghPkN2wXgcqFQ55ADthVBgMc=
+github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336 h1:j00D0/EqE9HRu+63v7KwUOe4ZxLc4AN5SOJFiinkkH0=
+github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336/go.mod h1:umLyYLRGqyIuFfGpEREZP3So6+O8iL35cCCqW+OxX5w=
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8 h1:1BcjXuviSAKttOX7BZoVHRZZGfxqoA2+AL8tykmkdoc=
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8/go.mod h1:vy1L7NybTy2F/Yv7BOh+oZBa1MACD6gzd1+DkcSkfp8=
-github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba h1:6rnQrD8NaLfLOPHszW1hbpviqpU8011gzdZk6wKP1xY=
-github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba/go.mod h1:OZfzyayUdwsVBqxvbEMqwUntQT8HbFbgyqoudvwfVN0=
-github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007 h1:KwB0H2P/gxJgt823Ku1fTcFLDKMj6zsP3wbQGlBOm4U=
-github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007/go.mod h1:EbZAlb/2K6mKr26u3+3cLBe/caJaqCHw786On94C43g=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0 h1:9IxmR+1NH1WxaX44+t553fOrrZRfxwMVvnDuBIy0tgs=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0/go.mod h1:JiykN+8W5TA4UD2ClrzQCVvcH3NcyLEVv7RwY0busrw=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0 h1:7m9PVtccb8/pvKTXMaGuyceFno1icRyC2SFH7KG7+70=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0/go.mod h1:SZ899lZYQ0maUulWbZg+SWqabHQ1wTbyk3jT8wJfyo8=
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868 h1:FFdvEzlYwcuVHkdZ8YnZR/XomeMGbz5E2F2HZI3I3w8=
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868/go.mod h1:Kn1Hape05UzFZ7bOUnm3GVsHzP0TNrVmpfXYNHdqGGs=
-github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 h1:ko88+ZznniNJZbZPWAvHQU8SwKAdHngdDZ+pvVgB5ss=
-github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4=
+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=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0=
github.com/smartcontractkit/libocr v0.0.0-20240112202000-6359502d2ff1 h1:3y9WsXkZ5lxFrmfH7DQHs/q308lylKId5l/3VC0QAdM=
@@ -1412,8 +1412,8 @@ go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/arch v0.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=
-golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
+golang.org/x/arch v0.7.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=
@@ -1441,8 +1441,8 @@ golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1453,8 +1453,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-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=
-golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
+golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE=
+golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
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=
@@ -1482,8 +1482,8 @@ golang.org/x/mod v0.4.1/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.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
-golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
+golang.org/x/mod v0.15.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=
@@ -1540,8 +1540,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
-golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
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=
@@ -1552,8 +1552,8 @@ golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
-golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
+golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
+golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
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=
@@ -1567,8 +1567,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
-golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1654,8 +1654,9 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.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=
@@ -1664,8 +1665,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1753,8 +1754,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
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.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM=
-golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
+golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
+golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg=
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=
@@ -1888,8 +1889,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
-google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
-google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/integration-tests/actions/actions.go b/integration-tests/actions/actions.go
index 95b538129c7..6f820247535 100644
--- a/integration-tests/actions/actions.go
+++ b/integration-tests/actions/actions.go
@@ -2,14 +2,18 @@
package actions
import (
+ "context"
"crypto/ecdsa"
"encoding/json"
"errors"
"fmt"
"math/big"
"strings"
+ "sync"
"testing"
+ "time"
+ "github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/core/types"
"github.com/ethereum/go-ethereum/crypto"
@@ -26,7 +30,7 @@ import (
"github.com/smartcontractkit/chainlink-testing-framework/logging"
"github.com/smartcontractkit/chainlink-testing-framework/testreporters"
"github.com/smartcontractkit/chainlink-testing-framework/utils/conversions"
-
+ "github.com/smartcontractkit/chainlink-testing-framework/utils/testcontext"
"github.com/smartcontractkit/chainlink/integration-tests/client"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
)
@@ -484,3 +488,75 @@ func GetTxFromAddress(tx *types.Transaction) (string, error) {
from, err := types.Sender(types.LatestSignerForChainID(tx.ChainId()), tx)
return from.String(), err
}
+
+// todo - move to CTF
+func GetTxByHash(ctx context.Context, client blockchain.EVMClient, hash common.Hash) (*types.Transaction, bool, error) {
+ return client.(*blockchain.EthereumMultinodeClient).
+ DefaultClient.(*blockchain.EthereumClient).
+ Client.
+ TransactionByHash(ctx, hash)
+}
+
+// todo - move to CTF
+func DecodeTxInputData(abiString string, data []byte) (map[string]interface{}, error) {
+ jsonABI, err := abi.JSON(strings.NewReader(abiString))
+ if err != nil {
+ return nil, err
+ }
+ methodSigData := data[:4]
+ inputsSigData := data[4:]
+ method, err := jsonABI.MethodById(methodSigData)
+ if err != nil {
+ return nil, err
+ }
+ inputsMap := make(map[string]interface{})
+ if err := method.Inputs.UnpackIntoMap(inputsMap, inputsSigData); err != nil {
+ return nil, err
+ }
+ return inputsMap, nil
+}
+
+// todo - move to EVMClient
+func WaitForBlockNumberToBe(
+ waitForBlockNumberToBe uint64,
+ client blockchain.EVMClient,
+ wg *sync.WaitGroup,
+ timeout time.Duration,
+ t testing.TB,
+) (uint64, error) {
+ blockNumberChannel := make(chan uint64)
+ errorChannel := make(chan error)
+ testContext, testCancel := context.WithTimeout(context.Background(), timeout)
+ defer testCancel()
+
+ ticker := time.NewTicker(time.Second * 1)
+ var blockNumber uint64
+ for {
+ select {
+ case <-testContext.Done():
+ ticker.Stop()
+ wg.Done()
+ return blockNumber,
+ fmt.Errorf("timeout waiting for Block Number to be: %d. Last recorded block number was: %d",
+ waitForBlockNumberToBe, blockNumber)
+ case <-ticker.C:
+ go func() {
+ currentBlockNumber, err := client.LatestBlockNumber(testcontext.Get(t))
+ if err != nil {
+ errorChannel <- err
+ }
+ blockNumberChannel <- currentBlockNumber
+ }()
+ case blockNumber = <-blockNumberChannel:
+ if blockNumber == waitForBlockNumberToBe {
+ ticker.Stop()
+ wg.Done()
+ return blockNumber, nil
+ }
+ case err := <-errorChannel:
+ ticker.Stop()
+ wg.Done()
+ return 0, err
+ }
+ }
+}
diff --git a/integration-tests/actions/vrf/common/actions.go b/integration-tests/actions/vrf/common/actions.go
new file mode 100644
index 00000000000..0c779ea90e5
--- /dev/null
+++ b/integration-tests/actions/vrf/common/actions.go
@@ -0,0 +1,137 @@
+package common
+
+import (
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/google/uuid"
+ "github.com/rs/zerolog"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/blockchain"
+ "github.com/smartcontractkit/chainlink/integration-tests/actions"
+ "github.com/smartcontractkit/chainlink/integration-tests/client"
+ "github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"
+ testconfig "github.com/smartcontractkit/chainlink/integration-tests/testconfig/vrfv2"
+)
+
+func CreateFundAndGetSendingKeys(
+ client blockchain.EVMClient,
+ node *VRFNode,
+ chainlinkNodeFunding float64,
+ numberOfTxKeysToCreate int,
+ chainID *big.Int,
+) ([]string, []common.Address, error) {
+ newNativeTokenKeyAddresses, err := CreateAndFundSendingKeys(client, node, chainlinkNodeFunding, numberOfTxKeysToCreate, chainID)
+ if err != nil {
+ return nil, nil, err
+ }
+ nativeTokenPrimaryKeyAddress, err := node.CLNode.API.PrimaryEthAddress()
+ if err != nil {
+ return nil, nil, fmt.Errorf("%s, err %w", ErrNodePrimaryKey, err)
+ }
+ allNativeTokenKeyAddressStrings := append(newNativeTokenKeyAddresses, nativeTokenPrimaryKeyAddress)
+ allNativeTokenKeyAddresses := make([]common.Address, len(allNativeTokenKeyAddressStrings))
+ for _, addressString := range allNativeTokenKeyAddressStrings {
+ allNativeTokenKeyAddresses = append(allNativeTokenKeyAddresses, common.HexToAddress(addressString))
+ }
+ return allNativeTokenKeyAddressStrings, allNativeTokenKeyAddresses, nil
+}
+
+func CreateAndFundSendingKeys(
+ client blockchain.EVMClient,
+ node *VRFNode,
+ chainlinkNodeFunding float64,
+ numberOfNativeTokenAddressesToCreate int,
+ chainID *big.Int,
+) ([]string, error) {
+ var newNativeTokenKeyAddresses []string
+ for i := 0; i < numberOfNativeTokenAddressesToCreate; i++ {
+ newTxKey, response, err := node.CLNode.API.CreateTxKey("evm", chainID.String())
+ if err != nil {
+ return nil, fmt.Errorf("%s, err %w", ErrNodeNewTxKey, err)
+ }
+ if response.StatusCode != 200 {
+ return nil, fmt.Errorf("error creating transaction key - response code, err %d", response.StatusCode)
+ }
+ newNativeTokenKeyAddresses = append(newNativeTokenKeyAddresses, newTxKey.Data.Attributes.Address)
+ err = actions.FundAddress(client, newTxKey.Data.Attributes.Address, big.NewFloat(chainlinkNodeFunding))
+ if err != nil {
+ return nil, err
+ }
+ }
+ return newNativeTokenKeyAddresses, nil
+}
+
+func SetupBHSNode(
+ env *test_env.CLClusterTestEnv,
+ config *testconfig.General,
+ numberOfTxKeysToCreate int,
+ chainID *big.Int,
+ coordinatorAddress string,
+ BHSAddress string,
+ txKeyFunding float64,
+ l zerolog.Logger,
+ bhsNode *VRFNode,
+) error {
+ bhsTXKeyAddressStrings, _, err := CreateFundAndGetSendingKeys(
+ env.EVMClient,
+ bhsNode,
+ txKeyFunding,
+ numberOfTxKeysToCreate,
+ chainID,
+ )
+ if err != nil {
+ return err
+ }
+ bhsNode.TXKeyAddressStrings = bhsTXKeyAddressStrings
+ bhsSpec := client.BlockhashStoreJobSpec{
+ ForwardingAllowed: false,
+ CoordinatorV2Address: coordinatorAddress,
+ CoordinatorV2PlusAddress: coordinatorAddress,
+ BlockhashStoreAddress: BHSAddress,
+ FromAddresses: bhsTXKeyAddressStrings,
+ EVMChainID: chainID.String(),
+ WaitBlocks: *config.BHSJobWaitBlocks,
+ LookbackBlocks: *config.BHSJobLookBackBlocks,
+ PollPeriod: config.BHSJobPollPeriod.Duration,
+ RunTimeout: config.BHSJobRunTimeout.Duration,
+ }
+ l.Info().Msg("Creating BHS Job")
+ bhsJob, err := CreateBHSJob(
+ bhsNode.CLNode.API,
+ bhsSpec,
+ )
+ if err != nil {
+ return fmt.Errorf("%s, err %w", "", err)
+ }
+ bhsNode.Job = bhsJob
+ return nil
+}
+
+func CreateBHSJob(
+ chainlinkNode *client.ChainlinkClient,
+ bhsJobSpecConfig client.BlockhashStoreJobSpec,
+) (*client.Job, error) {
+ jobUUID := uuid.New()
+ spec := &client.BlockhashStoreJobSpec{
+ Name: fmt.Sprintf("bhs-%s", jobUUID),
+ ForwardingAllowed: bhsJobSpecConfig.ForwardingAllowed,
+ CoordinatorV2Address: bhsJobSpecConfig.CoordinatorV2Address,
+ CoordinatorV2PlusAddress: bhsJobSpecConfig.CoordinatorV2PlusAddress,
+ BlockhashStoreAddress: bhsJobSpecConfig.BlockhashStoreAddress,
+ FromAddresses: bhsJobSpecConfig.FromAddresses,
+ EVMChainID: bhsJobSpecConfig.EVMChainID,
+ ExternalJobID: jobUUID.String(),
+ WaitBlocks: bhsJobSpecConfig.WaitBlocks,
+ LookbackBlocks: bhsJobSpecConfig.LookbackBlocks,
+ PollPeriod: bhsJobSpecConfig.PollPeriod,
+ RunTimeout: bhsJobSpecConfig.RunTimeout,
+ }
+
+ job, err := chainlinkNode.MustCreateJob(spec)
+ if err != nil {
+ return nil, fmt.Errorf("%s, err %w", ErrCreatingBHSJob, err)
+ }
+ return job, nil
+}
diff --git a/integration-tests/actions/vrf/common/errors.go b/integration-tests/actions/vrf/common/errors.go
new file mode 100644
index 00000000000..36530428468
--- /dev/null
+++ b/integration-tests/actions/vrf/common/errors.go
@@ -0,0 +1,27 @@
+package common
+
+const (
+ ErrNodePrimaryKey = "error getting node's primary ETH key"
+ ErrNodeNewTxKey = "error creating node's EVM transaction key"
+ ErrCreatingProvingKeyHash = "error creating a keyHash from the proving key"
+ ErrRegisteringProvingKey = "error registering a proving key on Coordinator contract"
+ ErrRegisterProvingKey = "error registering proving keys"
+ ErrEncodingProvingKey = "error encoding proving key"
+ ErrDeployBlockHashStore = "error deploying blockhash store"
+ ErrDeployCoordinator = "error deploying VRF CoordinatorV2"
+ ErrABIEncodingFunding = "error Abi encoding subscriptionID"
+ ErrSendingLinkToken = "error sending Link token"
+ ErrCreatingBHSJob = "error creating BHS job"
+ ErrParseJob = "error parsing job definition"
+ ErrSetVRFCoordinatorConfig = "error setting config for VRF Coordinator contract"
+ ErrCreateVRFSubscription = "error creating VRF Subscription"
+ ErrAddConsumerToSub = "error adding consumer to VRF Subscription"
+ ErrFundSubWithLinkToken = "error funding subscription with Link tokens"
+ ErrRestartCLNode = "error restarting CL node"
+ ErrWaitTXsComplete = "error waiting for TXs to complete"
+ ErrRequestRandomness = "error requesting randomness"
+ ErrLoadingCoordinator = "error loading coordinator contract"
+
+ ErrWaitRandomWordsRequestedEvent = "error waiting for RandomWordsRequested event"
+ ErrWaitRandomWordsFulfilledEvent = "error waiting for RandomWordsFulfilled event"
+)
diff --git a/integration-tests/actions/vrf/common/models.go b/integration-tests/actions/vrf/common/models.go
new file mode 100644
index 00000000000..ab6ca034800
--- /dev/null
+++ b/integration-tests/actions/vrf/common/models.go
@@ -0,0 +1,70 @@
+package common
+
+import (
+ "math/big"
+ "time"
+
+ "github.com/smartcontractkit/chainlink/integration-tests/client"
+ "github.com/smartcontractkit/chainlink/integration-tests/contracts"
+ "github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"
+)
+
+type VRFEncodedProvingKey [2]*big.Int
+
+// VRFV2PlusKeyData defines a jobs into and proving key info
+type VRFKeyData struct {
+ VRFKey *client.VRFKey
+ EncodedProvingKey VRFEncodedProvingKey
+ KeyHash [32]byte
+}
+
+type VRFNodeType int
+
+const (
+ VRF VRFNodeType = iota + 1
+ BHS
+)
+
+func (n VRFNodeType) String() string {
+ return [...]string{"VRF", "BHS"}[n-1]
+}
+
+func (n VRFNodeType) Index() int {
+ return int(n)
+}
+
+type VRFNode struct {
+ CLNode *test_env.ClNode
+ Job *client.Job
+ TXKeyAddressStrings []string
+}
+
+type VRFContracts struct {
+ CoordinatorV2 contracts.VRFCoordinatorV2
+ CoordinatorV2Plus contracts.VRFCoordinatorV2_5
+ VRFOwner contracts.VRFOwner
+ BHS contracts.BlockHashStore
+ VRFV2Consumer []contracts.VRFv2LoadTestConsumer
+ VRFV2PlusConsumer []contracts.VRFv2PlusLoadTestConsumer
+}
+
+type VRFOwnerConfig struct {
+ OwnerAddress string
+ UseVRFOwner bool
+}
+
+type VRFJobSpecConfig struct {
+ ForwardingAllowed bool
+ CoordinatorAddress string
+ FromAddresses []string
+ EVMChainID string
+ MinIncomingConfirmations int
+ PublicKey string
+ BatchFulfillmentEnabled bool
+ BatchFulfillmentGasMultiplier float64
+ EstimateGasMultiplier float64
+ PollPeriod time.Duration
+ RequestTimeout time.Duration
+ VRFOwnerConfig *VRFOwnerConfig
+ SimulationBlock *string
+}
diff --git a/integration-tests/actions/vrf/vrfv2/errors.go b/integration-tests/actions/vrf/vrfv2/errors.go
new file mode 100644
index 00000000000..d6b24fe9e07
--- /dev/null
+++ b/integration-tests/actions/vrf/vrfv2/errors.go
@@ -0,0 +1,10 @@
+package vrfv2
+
+const (
+ ErrCreatingVRFv2Key = "error creating VRFv2 key"
+ ErrDeployVRFV2Wrapper = "error deploying VRFV2Wrapper"
+ ErrCreateVRFV2Jobs = "error creating VRF V2 Jobs"
+ ErrDeployVRFV2Contracts = "error deploying VRFV2 contracts"
+ ErrCreatingVRFv2Job = "error creating VRFv2 job"
+ ErrAdvancedConsumer = "error deploying VRFv2 Advanced Consumer"
+)
diff --git a/integration-tests/actions/vrf/vrfv2/vrfv2_models.go b/integration-tests/actions/vrf/vrfv2/vrfv2_models.go
index be627b43e4f..3216af49904 100644
--- a/integration-tests/actions/vrf/vrfv2/vrfv2_models.go
+++ b/integration-tests/actions/vrf/vrfv2/vrfv2_models.go
@@ -1,44 +1,10 @@
package vrfv2
import (
- "math/big"
-
- "github.com/smartcontractkit/chainlink/integration-tests/client"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
)
-type VRFV2EncodedProvingKey [2]*big.Int
-
-// VRFV2JobInfo defines a jobs into and proving key info
-type VRFV2JobInfo struct {
- Job *client.Job
- VRFKey *client.VRFKey
- EncodedProvingKey VRFV2EncodedProvingKey
- KeyHash [32]byte
-}
-
-type VRFV2Contracts struct {
- Coordinator contracts.VRFCoordinatorV2
- VRFOwner contracts.VRFOwner
- BHS contracts.BlockHashStore
- LoadTestConsumers []contracts.VRFv2LoadTestConsumer
-}
-
type VRFV2WrapperContracts struct {
VRFV2Wrapper contracts.VRFV2Wrapper
LoadTestConsumers []contracts.VRFv2WrapperLoadTestConsumer
}
-
-// VRFV2PlusKeyData defines a jobs into and proving key info
-type VRFV2KeyData struct {
- VRFKey *client.VRFKey
- EncodedProvingKey VRFV2EncodedProvingKey
- KeyHash [32]byte
-}
-
-type VRFV2Data struct {
- VRFV2KeyData
- VRFJob *client.Job
- PrimaryEthAddress string
- ChainID *big.Int
-}
diff --git a/integration-tests/actions/vrf/vrfv2/vrfv2_steps.go b/integration-tests/actions/vrf/vrfv2/vrfv2_steps.go
index 276105d20ef..39d7133dd46 100644
--- a/integration-tests/actions/vrf/vrfv2/vrfv2_steps.go
+++ b/integration-tests/actions/vrf/vrfv2/vrfv2_steps.go
@@ -9,10 +9,12 @@ import (
"github.com/ethereum/go-ethereum/common"
"github.com/rs/zerolog"
+ "golang.org/x/sync/errgroup"
commonassets "github.com/smartcontractkit/chainlink-common/pkg/assets"
"github.com/smartcontractkit/chainlink-testing-framework/utils/conversions"
"github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"
+ testconfig "github.com/smartcontractkit/chainlink/integration-tests/testconfig/vrfv2"
"github.com/smartcontractkit/chainlink/integration-tests/types/config/node"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_owner"
@@ -23,6 +25,7 @@ import (
chainlinkutils "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
"github.com/smartcontractkit/chainlink/integration-tests/actions"
+ vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
"github.com/smartcontractkit/chainlink/integration-tests/client"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
@@ -30,57 +33,6 @@ import (
"github.com/smartcontractkit/chainlink/integration-tests/types"
)
-var (
- ErrNodePrimaryKey = "error getting node's primary ETH key"
- ErrNodeNewTxKey = "error creating node's EVM transaction key"
- ErrCreatingProvingKeyHash = "error creating a keyHash from the proving key"
- ErrRegisteringProvingKey = "error registering a proving key on Coordinator contract"
- ErrRegisterProvingKey = "error registering proving keys"
- ErrEncodingProvingKey = "error encoding proving key"
- ErrCreatingVRFv2Key = "error creating VRFv2 key"
- ErrDeployBlockHashStore = "error deploying blockhash store"
- ErrDeployCoordinator = "error deploying VRF CoordinatorV2"
- ErrAdvancedConsumer = "error deploying VRFv2 Advanced Consumer"
- ErrABIEncodingFunding = "error Abi encoding subscriptionID"
- ErrSendingLinkToken = "error sending Link token"
- ErrCreatingVRFv2Job = "error creating VRFv2 job"
- ErrParseJob = "error parsing job definition"
- ErrDeployVRFV2Contracts = "error deploying VRFV2 contracts"
- ErrSetVRFCoordinatorConfig = "error setting config for VRF Coordinator contract"
- ErrCreateVRFSubscription = "error creating VRF Subscription"
- ErrAddConsumerToSub = "error adding consumer to VRF Subscription"
- ErrFundSubWithLinkToken = "error funding subscription with Link tokens"
- ErrCreateVRFV2Jobs = "error creating VRF V2 Jobs"
- ErrRestartCLNode = "error restarting CL node"
- ErrWaitTXsComplete = "error waiting for TXs to complete"
- ErrRequestRandomness = "error requesting randomness"
- ErrLoadingCoordinator = "error loading coordinator contract"
-
- ErrWaitRandomWordsRequestedEvent = "error waiting for RandomWordsRequested event"
- ErrWaitRandomWordsFulfilledEvent = "error waiting for RandomWordsFulfilled event"
- ErrDeployWrapper = "error deploying VRFV2PlusWrapper"
-)
-
-type VRFOwnerConfig struct {
- OwnerAddress string
- useVRFOwner bool
-}
-
-type VRFJobSpecConfig struct {
- ForwardingAllowed bool
- CoordinatorAddress string
- FromAddresses []string
- EVMChainID string
- MinIncomingConfirmations int
- PublicKey string
- BatchFulfillmentEnabled bool
- BatchFulfillmentGasMultiplier float64
- EstimateGasMultiplier float64
- PollPeriod time.Duration
- RequestTimeout time.Duration
- VRFOwnerConfig VRFOwnerConfig
-}
-
func DeployVRFV2Contracts(
env *test_env.CLClusterTestEnv,
linkTokenContract contracts.LinkToken,
@@ -88,35 +40,35 @@ func DeployVRFV2Contracts(
consumerContractsAmount int,
useVRFOwner bool,
useTestCoordinator bool,
-) (*VRFV2Contracts, error) {
+) (*vrfcommon.VRFContracts, error) {
bhs, err := env.ContractDeployer.DeployBlockhashStore()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrDeployBlockHashStore, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrDeployBlockHashStore, err)
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
var coordinatorAddress string
if useTestCoordinator {
testCoordinator, err := env.ContractDeployer.DeployVRFCoordinatorTestV2(linkTokenContract.Address(), bhs.Address(), linkEthFeedContract.Address())
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrDeployCoordinator, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrDeployCoordinator, err)
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
coordinatorAddress = testCoordinator.Address()
} else {
coordinator, err := env.ContractDeployer.DeployVRFCoordinatorV2(linkTokenContract.Address(), bhs.Address(), linkEthFeedContract.Address())
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrDeployCoordinator, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrDeployCoordinator, err)
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
coordinatorAddress = coordinator.Address()
}
@@ -126,25 +78,35 @@ func DeployVRFV2Contracts(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
coordinator, err := env.ContractLoader.LoadVRFCoordinatorV2(coordinatorAddress)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrLoadingCoordinator, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrLoadingCoordinator, err)
}
if useVRFOwner {
vrfOwner, err := env.ContractDeployer.DeployVRFOwner(coordinatorAddress)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrDeployCoordinator, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrDeployCoordinator, err)
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
- return &VRFV2Contracts{coordinator, vrfOwner, bhs, consumers}, nil
- }
- return &VRFV2Contracts{coordinator, nil, bhs, consumers}, nil
+ return &vrfcommon.VRFContracts{
+ CoordinatorV2: coordinator,
+ VRFOwner: vrfOwner,
+ BHS: bhs,
+ VRFV2Consumer: consumers,
+ }, nil
+ }
+ return &vrfcommon.VRFContracts{
+ CoordinatorV2: coordinator,
+ VRFOwner: nil,
+ BHS: bhs,
+ VRFV2Consumer: consumers,
+ }, nil
}
func DeployVRFV2Consumers(contractDeployer contracts.ContractDeployer, coordinatorAddress string, consumerContractsAmount int) ([]contracts.VRFv2LoadTestConsumer, error) {
@@ -181,11 +143,11 @@ func DeployVRFV2DirectFundingContracts(
) (*VRFV2WrapperContracts, error) {
vrfv2Wrapper, err := contractDeployer.DeployVRFV2Wrapper(linkTokenAddress, linkEthFeedAddress, coordinator.Address())
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrDeployWrapper, err)
+ return nil, fmt.Errorf("%s, err %w", ErrDeployVRFV2Wrapper, err)
}
err = chainClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
consumers, err := DeployVRFV2WrapperConsumers(contractDeployer, linkTokenAddress, vrfv2Wrapper, consumerContractsAmount)
@@ -194,24 +156,25 @@ func DeployVRFV2DirectFundingContracts(
}
err = chainClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return &VRFV2WrapperContracts{vrfv2Wrapper, consumers}, nil
}
func CreateVRFV2Job(
chainlinkNode *client.ChainlinkClient,
- vrfJobSpecConfig VRFJobSpecConfig,
+ vrfJobSpecConfig vrfcommon.VRFJobSpecConfig,
) (*client.Job, error) {
jobUUID := uuid.New()
os := &client.VRFV2TxPipelineSpec{
Address: vrfJobSpecConfig.CoordinatorAddress,
EstimateGasMultiplier: vrfJobSpecConfig.EstimateGasMultiplier,
FromAddress: vrfJobSpecConfig.FromAddresses[0],
+ SimulationBlock: vrfJobSpecConfig.SimulationBlock,
}
ost, err := os.String()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrParseJob, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrParseJob, err)
}
spec := &client.VRFV2JobSpec{
@@ -229,13 +192,13 @@ func CreateVRFV2Job(
PollPeriod: vrfJobSpecConfig.PollPeriod,
RequestTimeout: vrfJobSpecConfig.RequestTimeout,
}
- if vrfJobSpecConfig.VRFOwnerConfig.useVRFOwner {
+ if vrfJobSpecConfig.VRFOwnerConfig.UseVRFOwner {
spec.VRFOwner = vrfJobSpecConfig.VRFOwnerConfig.OwnerAddress
spec.UseVRFOwner = true
}
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrParseJob, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrParseJob, err)
}
job, err := chainlinkNode.MustCreateJob(spec)
@@ -249,17 +212,17 @@ func VRFV2RegisterProvingKey(
vrfKey *client.VRFKey,
oracleAddress string,
coordinator contracts.VRFCoordinatorV2,
-) (VRFV2EncodedProvingKey, error) {
+) (vrfcommon.VRFEncodedProvingKey, error) {
provingKey, err := actions.EncodeOnChainVRFProvingKey(*vrfKey)
if err != nil {
- return VRFV2EncodedProvingKey{}, fmt.Errorf("%s, err %w", ErrEncodingProvingKey, err)
+ return vrfcommon.VRFEncodedProvingKey{}, fmt.Errorf("%s, err %w", vrfcommon.ErrEncodingProvingKey, err)
}
err = coordinator.RegisterProvingKey(
oracleAddress,
provingKey,
)
if err != nil {
- return VRFV2EncodedProvingKey{}, fmt.Errorf("%s, err %w", ErrRegisterProvingKey, err)
+ return vrfcommon.VRFEncodedProvingKey{}, fmt.Errorf("%s, err %w", vrfcommon.ErrRegisterProvingKey, err)
}
return provingKey, nil
}
@@ -273,11 +236,11 @@ func FundVRFCoordinatorV2Subscription(
) error {
encodedSubId, err := chainlinkutils.ABIEncode(`[{"type":"uint64"}]`, subscriptionID)
if err != nil {
- return fmt.Errorf("%s, err %w", ErrABIEncodingFunding, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrABIEncodingFunding, err)
}
_, err = linkToken.TransferAndCall(coordinator.Address(), linkFundingAmountJuels, encodedSubId)
if err != nil {
- return fmt.Errorf("%s, err %w", ErrSendingLinkToken, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrSendingLinkToken, err)
}
return chainClient.WaitForEvents()
}
@@ -285,6 +248,7 @@ func FundVRFCoordinatorV2Subscription(
// SetupVRFV2Environment will create specified number of subscriptions and add the same conumer/s to each of them
func SetupVRFV2Environment(
env *test_env.CLClusterTestEnv,
+ nodesToCreate []vrfcommon.VRFNodeType,
vrfv2TestConfig types.VRFv2TestConfig,
useVRFOwner bool,
useTestCoordinator bool,
@@ -295,170 +259,244 @@ func SetupVRFV2Environment(
numberOfConsumers int,
numberOfSubToCreate int,
l zerolog.Logger,
-) (*VRFV2Contracts, []uint64, *VRFV2Data, error) {
+) (*vrfcommon.VRFContracts, []uint64, *vrfcommon.VRFKeyData, map[vrfcommon.VRFNodeType]*vrfcommon.VRFNode, error) {
l.Info().Msg("Starting VRFV2 environment setup")
- l.Info().Msg("Deploying VRFV2 contracts")
- vrfv2Contracts, err := DeployVRFV2Contracts(
+ vrfv2Config := vrfv2TestConfig.GetVRFv2Config().General
+
+ vrfContracts, subIDs, err := SetupContracts(
env,
linkToken,
mockNativeLINKFeed,
numberOfConsumers,
useVRFOwner,
useTestCoordinator,
+ vrfv2Config,
+ numberOfSubToCreate,
+ l,
)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrDeployVRFV2Contracts, err)
+ return nil, nil, nil, nil, err
}
- vrfv2Config := vrfv2TestConfig.GetVRFv2Config().General
- vrfCoordinatorV2FeeConfig := vrf_coordinator_v2.VRFCoordinatorV2FeeConfig{
- FulfillmentFlatFeeLinkPPMTier1: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier1,
- FulfillmentFlatFeeLinkPPMTier2: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier2,
- FulfillmentFlatFeeLinkPPMTier3: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier3,
- FulfillmentFlatFeeLinkPPMTier4: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier4,
- FulfillmentFlatFeeLinkPPMTier5: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier5,
- ReqsForTier2: big.NewInt(*vrfv2Config.ReqsForTier2),
- ReqsForTier3: big.NewInt(*vrfv2Config.ReqsForTier3),
- ReqsForTier4: big.NewInt(*vrfv2Config.ReqsForTier4),
- ReqsForTier5: big.NewInt(*vrfv2Config.ReqsForTier5)}
- l.Info().Str("Coordinator", vrfv2Contracts.Coordinator.Address()).Msg("Setting Coordinator Config")
- err = vrfv2Contracts.Coordinator.SetConfig(
- *vrfv2Config.MinimumConfirmations,
- *vrfv2Config.MaxGasLimitCoordinatorConfig,
- *vrfv2Config.StalenessSeconds,
- *vrfv2Config.GasAfterPaymentCalculation,
- big.NewInt(*vrfv2Config.FallbackWeiPerUnitLink),
- vrfCoordinatorV2FeeConfig,
- )
- if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrSetVRFCoordinatorConfig, err)
- }
- err = env.EVMClient.WaitForEvents()
- if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
- }
- l.Info().
- Str("Coordinator", vrfv2Contracts.Coordinator.Address()).
- Int("Number of Subs to create", numberOfSubToCreate).
- Msg("Creating and funding subscriptions, adding consumers")
- subIDs, err := CreateFundSubsAndAddConsumers(
- env,
- big.NewFloat(*vrfv2Config.SubscriptionFundingAmountLink),
- linkToken,
- vrfv2Contracts.Coordinator, vrfv2Contracts.LoadTestConsumers, numberOfSubToCreate)
- if err != nil {
- return nil, nil, nil, err
+ var nodesMap = make(map[vrfcommon.VRFNodeType]*vrfcommon.VRFNode)
+ for i, nodeType := range nodesToCreate {
+ nodesMap[nodeType] = &vrfcommon.VRFNode{
+ CLNode: env.ClCluster.Nodes[i],
+ }
}
- l.Info().Str("Node URL", env.ClCluster.NodeAPIs()[0].URL()).Msg("Creating VRF Key on the Node")
- vrfKey, err := env.ClCluster.NodeAPIs()[0].MustCreateVRFKey()
+ l.Info().Str("Node URL", nodesMap[vrfcommon.VRF].CLNode.API.URL()).Msg("Creating VRF Key on the Node")
+ vrfKey, err := nodesMap[vrfcommon.VRF].CLNode.API.MustCreateVRFKey()
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrCreatingVRFv2Key, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", ErrCreatingVRFv2Key, err)
}
pubKeyCompressed := vrfKey.Data.ID
-
- l.Info().Str("Coordinator", vrfv2Contracts.Coordinator.Address()).Msg("Registering Proving Key")
- provingKey, err := VRFV2RegisterProvingKey(vrfKey, registerProvingKeyAgainstAddress, vrfv2Contracts.Coordinator)
+ l.Info().
+ Str("Node URL", nodesMap[vrfcommon.VRF].CLNode.API.URL()).
+ Str("Keyhash", vrfKey.Data.Attributes.Hash).
+ Str("VRF Compressed Key", vrfKey.Data.Attributes.Compressed).
+ Str("VRF Uncompressed Key", vrfKey.Data.Attributes.Uncompressed).
+ Msg("VRF Key created on the Node")
+
+ l.Info().Str("Coordinator", vrfContracts.CoordinatorV2.Address()).Msg("Registering Proving Key")
+ provingKey, err := VRFV2RegisterProvingKey(vrfKey, registerProvingKeyAgainstAddress, vrfContracts.CoordinatorV2)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrRegisteringProvingKey, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrRegisteringProvingKey, err)
}
- keyHash, err := vrfv2Contracts.Coordinator.HashOfKey(context.Background(), provingKey)
+ keyHash, err := vrfContracts.CoordinatorV2.HashOfKey(context.Background(), provingKey)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrCreatingProvingKeyHash, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrCreatingProvingKeyHash, err)
}
chainID := env.EVMClient.GetChainID()
- newNativeTokenKeyAddresses, err := CreateAndFundSendingKeys(env, vrfv2TestConfig, numberOfTxKeysToCreate, chainID)
- if err != nil {
- return nil, nil, nil, err
- }
- nativeTokenPrimaryKeyAddress, err := env.ClCluster.NodeAPIs()[0].PrimaryEthAddress()
+ vrfTXKeyAddressStrings, vrfTXKeyAddresses, err := vrfcommon.CreateFundAndGetSendingKeys(
+ env.EVMClient,
+ nodesMap[vrfcommon.VRF],
+ *vrfv2TestConfig.GetCommonConfig().ChainlinkNodeFunding,
+ numberOfTxKeysToCreate,
+ chainID,
+ )
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrNodePrimaryKey, err)
+ return nil, nil, nil, nil, err
}
- allNativeTokenKeyAddressStrings := append(newNativeTokenKeyAddresses, nativeTokenPrimaryKeyAddress)
- allNativeTokenKeyAddresses := make([]common.Address, len(allNativeTokenKeyAddressStrings))
+ nodesMap[vrfcommon.VRF].TXKeyAddressStrings = vrfTXKeyAddressStrings
- for _, addressString := range allNativeTokenKeyAddressStrings {
- allNativeTokenKeyAddresses = append(allNativeTokenKeyAddresses, common.HexToAddress(addressString))
- }
-
- var vrfOwnerConfig VRFOwnerConfig
+ var vrfOwnerConfig *vrfcommon.VRFOwnerConfig
if useVRFOwner {
- err := setupVRFOwnerContract(env, vrfv2Contracts, allNativeTokenKeyAddressStrings, allNativeTokenKeyAddresses, l)
+ err := setupVRFOwnerContract(env, vrfContracts, vrfTXKeyAddressStrings, vrfTXKeyAddresses, l)
if err != nil {
- return nil, nil, nil, err
+ return nil, nil, nil, nil, err
}
- vrfOwnerConfig = VRFOwnerConfig{
- OwnerAddress: vrfv2Contracts.VRFOwner.Address(),
- useVRFOwner: useVRFOwner,
+ vrfOwnerConfig = &vrfcommon.VRFOwnerConfig{
+ OwnerAddress: vrfContracts.VRFOwner.Address(),
+ UseVRFOwner: useVRFOwner,
}
} else {
- vrfOwnerConfig = VRFOwnerConfig{
+ vrfOwnerConfig = &vrfcommon.VRFOwnerConfig{
OwnerAddress: "",
- useVRFOwner: useVRFOwner,
+ UseVRFOwner: useVRFOwner,
}
}
- vrfJobSpecConfig := VRFJobSpecConfig{
- ForwardingAllowed: false,
- CoordinatorAddress: vrfv2Contracts.Coordinator.Address(),
- FromAddresses: allNativeTokenKeyAddressStrings,
+ g := errgroup.Group{}
+ if vrfNode, exists := nodesMap[vrfcommon.VRF]; exists {
+ g.Go(func() error {
+ err := setupVRFNode(vrfContracts, chainID, vrfv2Config, pubKeyCompressed, vrfOwnerConfig, l, vrfNode)
+ if err != nil {
+ return err
+ }
+ return nil
+ })
+ }
+
+ if bhsNode, exists := nodesMap[vrfcommon.BHS]; exists {
+ g.Go(func() error {
+ err := vrfcommon.SetupBHSNode(
+ env,
+ vrfv2TestConfig.GetVRFv2Config().General,
+ numberOfTxKeysToCreate,
+ chainID,
+ vrfContracts.CoordinatorV2.Address(),
+ vrfContracts.BHS.Address(),
+ *vrfv2TestConfig.GetCommonConfig().ChainlinkNodeFunding,
+ l,
+ bhsNode,
+ )
+ if err != nil {
+ return err
+ }
+ return nil
+ })
+ }
+
+ if err := g.Wait(); err != nil {
+ return nil, nil, nil, nil, fmt.Errorf("VRF node setup ended up with an error: %w", err)
+ }
+
+ vrfKeyData := vrfcommon.VRFKeyData{
+ VRFKey: vrfKey,
+ EncodedProvingKey: provingKey,
+ KeyHash: keyHash,
+ }
+
+ l.Info().Msg("VRFV2 environment setup is finished")
+ return vrfContracts, subIDs, &vrfKeyData, nodesMap, nil
+}
+
+func setupVRFNode(contracts *vrfcommon.VRFContracts, chainID *big.Int, vrfv2Config *testconfig.General, pubKeyCompressed string, vrfOwnerConfig *vrfcommon.VRFOwnerConfig, l zerolog.Logger, vrfNode *vrfcommon.VRFNode) error {
+ vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{
+ ForwardingAllowed: *vrfv2Config.VRFJobForwardingAllowed,
+ CoordinatorAddress: contracts.CoordinatorV2.Address(),
+ FromAddresses: vrfNode.TXKeyAddressStrings,
EVMChainID: chainID.String(),
MinIncomingConfirmations: int(*vrfv2Config.MinimumConfirmations),
PublicKey: pubKeyCompressed,
- EstimateGasMultiplier: 1,
- BatchFulfillmentEnabled: false,
- BatchFulfillmentGasMultiplier: 1.15,
- PollPeriod: time.Second * 1,
- RequestTimeout: time.Hour * 24,
+ EstimateGasMultiplier: *vrfv2Config.VRFJobEstimateGasMultiplier,
+ BatchFulfillmentEnabled: *vrfv2Config.VRFJobBatchFulfillmentEnabled,
+ BatchFulfillmentGasMultiplier: *vrfv2Config.VRFJobBatchFulfillmentGasMultiplier,
+ PollPeriod: vrfv2Config.VRFJobPollPeriod.Duration,
+ RequestTimeout: vrfv2Config.VRFJobRequestTimeout.Duration,
+ SimulationBlock: vrfv2Config.VRFJobSimulationBlock,
VRFOwnerConfig: vrfOwnerConfig,
}
l.Info().Msg("Creating VRFV2 Job")
vrfV2job, err := CreateVRFV2Job(
- env.ClCluster.NodeAPIs()[0],
+ vrfNode.CLNode.API,
vrfJobSpecConfig,
)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrCreateVRFV2Jobs, err)
+ return fmt.Errorf("%s, err %w", ErrCreateVRFV2Jobs, err)
}
+ vrfNode.Job = vrfV2job
// this part is here because VRFv2 can work with only a specific key
// [[EVM.KeySpecific]]
// Key = '...'
- nodeConfig := node.NewConfig(env.ClCluster.Nodes[0].NodeConfig,
- node.WithVRFv2EVMEstimator(allNativeTokenKeyAddressStrings, *vrfv2Config.CLNodeMaxGasPriceGWei),
+ nodeConfig := node.NewConfig(vrfNode.CLNode.NodeConfig,
+ node.WithLogPollInterval(1*time.Second),
+ node.WithVRFv2EVMEstimator(vrfNode.TXKeyAddressStrings, *vrfv2Config.CLNodeMaxGasPriceGWei),
)
l.Info().Msg("Restarting Node with new sending key PriceMax configuration")
- err = env.ClCluster.Nodes[0].Restart(nodeConfig)
+ err = vrfNode.CLNode.Restart(nodeConfig)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrRestartCLNode, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrRestartCLNode, err)
}
+ return nil
+}
- vrfv2KeyData := VRFV2KeyData{
- VRFKey: vrfKey,
- EncodedProvingKey: provingKey,
- KeyHash: keyHash,
+func SetupContracts(
+ env *test_env.CLClusterTestEnv,
+ linkToken contracts.LinkToken,
+ mockNativeLINKFeed contracts.MockETHLINKFeed,
+ numberOfConsumers int,
+ useVRFOwner bool,
+ useTestCoordinator bool,
+ vrfv2Config *testconfig.General,
+ numberOfSubToCreate int,
+ l zerolog.Logger,
+) (*vrfcommon.VRFContracts, []uint64, error) {
+ l.Info().Msg("Deploying VRFV2 contracts")
+ vrfContracts, err := DeployVRFV2Contracts(
+ env,
+ linkToken,
+ mockNativeLINKFeed,
+ numberOfConsumers,
+ useVRFOwner,
+ useTestCoordinator,
+ )
+ if err != nil {
+ return nil, nil, fmt.Errorf("%s, err %w", ErrDeployVRFV2Contracts, err)
}
- data := VRFV2Data{
- vrfv2KeyData,
- vrfV2job,
- nativeTokenPrimaryKeyAddress,
- chainID,
- }
+ vrfCoordinatorV2FeeConfig := vrf_coordinator_v2.VRFCoordinatorV2FeeConfig{
+ FulfillmentFlatFeeLinkPPMTier1: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier1,
+ FulfillmentFlatFeeLinkPPMTier2: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier2,
+ FulfillmentFlatFeeLinkPPMTier3: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier3,
+ FulfillmentFlatFeeLinkPPMTier4: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier4,
+ FulfillmentFlatFeeLinkPPMTier5: *vrfv2Config.FulfillmentFlatFeeLinkPPMTier5,
+ ReqsForTier2: big.NewInt(*vrfv2Config.ReqsForTier2),
+ ReqsForTier3: big.NewInt(*vrfv2Config.ReqsForTier3),
+ ReqsForTier4: big.NewInt(*vrfv2Config.ReqsForTier4),
+ ReqsForTier5: big.NewInt(*vrfv2Config.ReqsForTier5)}
- l.Info().Msg("VRFV2 environment setup is finished")
- return vrfv2Contracts, subIDs, &data, nil
+ l.Info().Str("Coordinator", vrfContracts.CoordinatorV2.Address()).Msg("Setting Coordinator Config")
+ err = vrfContracts.CoordinatorV2.SetConfig(
+ *vrfv2Config.MinimumConfirmations,
+ *vrfv2Config.MaxGasLimitCoordinatorConfig,
+ *vrfv2Config.StalenessSeconds,
+ *vrfv2Config.GasAfterPaymentCalculation,
+ big.NewInt(*vrfv2Config.FallbackWeiPerUnitLink),
+ vrfCoordinatorV2FeeConfig,
+ )
+ if err != nil {
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrSetVRFCoordinatorConfig, err)
+ }
+ err = env.EVMClient.WaitForEvents()
+ if err != nil {
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
+ }
+ l.Info().
+ Str("Coordinator", vrfContracts.CoordinatorV2.Address()).
+ Int("Number of Subs to create", numberOfSubToCreate).
+ Msg("Creating and funding subscriptions, adding consumers")
+ subIDs, err := CreateFundSubsAndAddConsumers(
+ env,
+ big.NewFloat(*vrfv2Config.SubscriptionFundingAmountLink),
+ linkToken,
+ vrfContracts.CoordinatorV2, vrfContracts.VRFV2Consumer, numberOfSubToCreate)
+ if err != nil {
+ return nil, nil, err
+ }
+ return vrfContracts, subIDs, nil
}
-func setupVRFOwnerContract(env *test_env.CLClusterTestEnv, vrfv2Contracts *VRFV2Contracts, allNativeTokenKeyAddressStrings []string, allNativeTokenKeyAddresses []common.Address, l zerolog.Logger) error {
+func setupVRFOwnerContract(env *test_env.CLClusterTestEnv, contracts *vrfcommon.VRFContracts, allNativeTokenKeyAddressStrings []string, allNativeTokenKeyAddresses []common.Address, l zerolog.Logger) error {
l.Info().Msg("Setting up VRFOwner contract")
l.Info().
- Str("Coordinator", vrfv2Contracts.Coordinator.Address()).
- Str("VRFOwner", vrfv2Contracts.VRFOwner.Address()).
+ Str("Coordinator", contracts.CoordinatorV2.Address()).
+ Str("VRFOwner", contracts.VRFOwner.Address()).
Msg("Transferring ownership of Coordinator to VRFOwner")
- err := vrfv2Contracts.Coordinator.TransferOwnership(common.HexToAddress(vrfv2Contracts.VRFOwner.Address()))
+ err := contracts.CoordinatorV2.TransferOwnership(common.HexToAddress(contracts.VRFOwner.Address()))
if err != nil {
return nil
}
@@ -467,9 +505,9 @@ func setupVRFOwnerContract(env *test_env.CLClusterTestEnv, vrfv2Contracts *VRFV2
return nil
}
l.Info().
- Str("VRFOwner", vrfv2Contracts.VRFOwner.Address()).
+ Str("VRFOwner", contracts.VRFOwner.Address()).
Msg("Accepting VRF Ownership")
- err = vrfv2Contracts.VRFOwner.AcceptVRFOwnership()
+ err = contracts.VRFOwner.AcceptVRFOwnership()
if err != nil {
return nil
}
@@ -479,15 +517,15 @@ func setupVRFOwnerContract(env *test_env.CLClusterTestEnv, vrfv2Contracts *VRFV2
}
l.Info().
Strs("Authorized Senders", allNativeTokenKeyAddressStrings).
- Str("VRFOwner", vrfv2Contracts.VRFOwner.Address()).
+ Str("VRFOwner", contracts.VRFOwner.Address()).
Msg("Setting authorized senders for VRFOwner contract")
- err = vrfv2Contracts.VRFOwner.SetAuthorizedSenders(allNativeTokenKeyAddresses)
+ err = contracts.VRFOwner.SetAuthorizedSenders(allNativeTokenKeyAddresses)
if err != nil {
return nil
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return err
}
@@ -515,7 +553,7 @@ func SetupVRFV2WrapperEnvironment(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
vrfv2Config := vrfv2TestConfig.GetVRFv2Config()
@@ -533,7 +571,7 @@ func SetupVRFV2WrapperEnvironment(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
// Fetch wrapper subscription ID
@@ -543,7 +581,7 @@ func SetupVRFV2WrapperEnvironment(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
// Fund wrapper subscription
@@ -562,31 +600,12 @@ func SetupVRFV2WrapperEnvironment(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return wrapperContracts, &wrapperSubID, nil
}
-func CreateAndFundSendingKeys(env *test_env.CLClusterTestEnv, testConfig tc.CommonTestConfig, numberOfNativeTokenAddressesToCreate int, chainID *big.Int) ([]string, error) {
- var newNativeTokenKeyAddresses []string
- for i := 0; i < numberOfNativeTokenAddressesToCreate; i++ {
- newTxKey, response, err := env.ClCluster.NodeAPIs()[0].CreateTxKey("evm", chainID.String())
- if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrNodeNewTxKey, err)
- }
- if response.StatusCode != 200 {
- return nil, fmt.Errorf("error creating transaction key - response code, err %d", response.StatusCode)
- }
- newNativeTokenKeyAddresses = append(newNativeTokenKeyAddresses, newTxKey.Data.ID)
- err = actions.FundAddress(env.EVMClient, newTxKey.Data.ID, big.NewFloat(*testConfig.GetCommonConfig().ChainlinkNodeFunding))
- if err != nil {
- return nil, err
- }
- }
- return newNativeTokenKeyAddresses, nil
-}
-
func CreateFundSubsAndAddConsumers(
env *test_env.CLClusterTestEnv,
subscriptionFundingAmountLink *big.Float,
@@ -616,7 +635,7 @@ func CreateFundSubsAndAddConsumers(
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return subIDs, nil
}
@@ -634,7 +653,7 @@ func CreateSubsAndFund(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
err = FundSubscriptions(env, subscriptionFundingAmountLink, linkToken, coordinator, subs)
if err != nil {
@@ -668,7 +687,7 @@ func AddConsumersToSubs(
for _, consumer := range consumers {
err := coordinator.AddConsumer(subID, consumer.Address())
if err != nil {
- return fmt.Errorf("%s, err %w", ErrAddConsumerToSub, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrAddConsumerToSub, err)
}
}
}
@@ -678,16 +697,16 @@ func AddConsumersToSubs(
func CreateSubAndFindSubID(env *test_env.CLClusterTestEnv, coordinator contracts.VRFCoordinatorV2) (uint64, error) {
tx, err := coordinator.CreateSubscription()
if err != nil {
- return 0, fmt.Errorf("%s, err %w", ErrCreateVRFSubscription, err)
+ return 0, fmt.Errorf("%s, err %w", vrfcommon.ErrCreateVRFSubscription, err)
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return 0, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return 0, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
receipt, err := env.EVMClient.GetTxReceipt(tx.Hash())
if err != nil {
- return 0, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return 0, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
//SubscriptionsCreated Log should be emitted with the subscription ID
@@ -708,12 +727,12 @@ func FundSubscriptions(
amountJuels := conversions.EtherToWei(subscriptionFundingAmountLink)
err := FundVRFCoordinatorV2Subscription(linkAddress, coordinator, env.EVMClient, subID, amountJuels)
if err != nil {
- return fmt.Errorf("%s, err %w", ErrFundSubWithLinkToken, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrFundSubWithLinkToken, err)
}
}
err := env.EVMClient.WaitForEvents()
if err != nil {
- return fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return nil
}
@@ -723,7 +742,7 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
consumer contracts.VRFv2WrapperLoadTestConsumer,
coordinator contracts.VRFCoordinatorV2,
subID uint64,
- vrfv2Data *VRFV2Data,
+ vrfv2KeyData *vrfcommon.VRFKeyData,
minimumConfirmations uint16,
callbackGasLimit uint32,
numberOfWords uint32,
@@ -739,7 +758,7 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
randomnessRequestCountPerRequest,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrRequestRandomness, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrRequestRandomness, err)
}
wrapperAddress, err := consumer.GetWrapper(context.Background())
if err != nil {
@@ -748,7 +767,7 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
fulfillmentEvents, err := WaitForRequestAndFulfillmentEvents(
wrapperAddress.String(),
coordinator,
- vrfv2Data,
+ vrfv2KeyData,
subID,
randomWordsFulfilledEventTimeout,
l,
@@ -761,7 +780,7 @@ func RequestRandomnessAndWaitForFulfillment(
consumer contracts.VRFv2LoadTestConsumer,
coordinator contracts.VRFCoordinatorV2,
subID uint64,
- vrfv2Data *VRFV2Data,
+ vrfKeyData *vrfcommon.VRFKeyData,
minimumConfirmations uint16,
callbackGasLimit uint32,
numberOfWords uint32,
@@ -771,7 +790,7 @@ func RequestRandomnessAndWaitForFulfillment(
) (*vrf_coordinator_v2.VRFCoordinatorV2RandomWordsFulfilled, error) {
logRandRequest(l, consumer.Address(), coordinator.Address(), subID, minimumConfirmations, callbackGasLimit, numberOfWords, randomnessRequestCountPerRequest, randomnessRequestCountPerRequestDeviation)
_, err := consumer.RequestRandomness(
- vrfv2Data.KeyHash,
+ vrfKeyData.KeyHash,
subID,
minimumConfirmations,
callbackGasLimit,
@@ -779,13 +798,13 @@ func RequestRandomnessAndWaitForFulfillment(
randomnessRequestCountPerRequest,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrRequestRandomness, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrRequestRandomness, err)
}
fulfillmentEvents, err := WaitForRequestAndFulfillmentEvents(
consumer.Address(),
coordinator,
- vrfv2Data,
+ vrfKeyData,
subID,
randomWordsFulfilledEventTimeout,
l,
@@ -798,7 +817,7 @@ func RequestRandomnessWithForceFulfillAndWaitForFulfillment(
consumer contracts.VRFv2LoadTestConsumer,
coordinator contracts.VRFCoordinatorV2,
vrfOwner contracts.VRFOwner,
- vrfv2Data *VRFV2Data,
+ vrfv2KeyData *vrfcommon.VRFKeyData,
minimumConfirmations uint16,
callbackGasLimit uint32,
numberOfWords uint32,
@@ -810,7 +829,7 @@ func RequestRandomnessWithForceFulfillAndWaitForFulfillment(
) (*vrf_coordinator_v2.VRFCoordinatorV2ConfigSet, *vrf_coordinator_v2.VRFCoordinatorV2RandomWordsFulfilled, *vrf_owner.VRFOwnerRandomWordsForced, error) {
logRandRequest(l, consumer.Address(), coordinator.Address(), 0, minimumConfirmations, callbackGasLimit, numberOfWords, randomnessRequestCountPerRequest, randomnessRequestCountPerRequestDeviation)
_, err := consumer.RequestRandomWordsWithForceFulfill(
- vrfv2Data.KeyHash,
+ vrfv2KeyData.KeyHash,
minimumConfirmations,
callbackGasLimit,
numberOfWords,
@@ -819,17 +838,17 @@ func RequestRandomnessWithForceFulfillAndWaitForFulfillment(
linkAddress,
)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrRequestRandomness, err)
+ return nil, nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrRequestRandomness, err)
}
randomWordsRequestedEvent, err := coordinator.WaitForRandomWordsRequestedEvent(
- [][32]byte{vrfv2Data.KeyHash},
+ [][32]byte{vrfv2KeyData.KeyHash},
nil,
[]common.Address{common.HexToAddress(consumer.Address())},
time.Minute*1,
)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrWaitRandomWordsRequestedEvent, err)
+ return nil, nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitRandomWordsRequestedEvent, err)
}
LogRandomnessRequestedEvent(l, coordinator, randomWordsRequestedEvent)
@@ -888,7 +907,7 @@ func RequestRandomnessWithForceFulfillAndWaitForFulfillment(
case randomWordsForcedEvent = <-randWordsForcedEventChannel:
LogRandomWordsForcedEvent(l, vrfOwner, randomWordsForcedEvent)
case <-time.After(randomWordsFulfilledEventTimeout):
- return nil, nil, nil, fmt.Errorf("timeout waiting for ConfigSet, RandomWordsFulfilled and RandomWordsForced events")
+ err = fmt.Errorf("timeout waiting for ConfigSet, RandomWordsFulfilled and RandomWordsForced events")
}
}
return configSetEvent, randomWordsFulfilledEvent, randomWordsForcedEvent, err
@@ -897,30 +916,29 @@ func RequestRandomnessWithForceFulfillAndWaitForFulfillment(
func WaitForRequestAndFulfillmentEvents(
consumerAddress string,
coordinator contracts.VRFCoordinatorV2,
- vrfv2Data *VRFV2Data,
+ vrfv2KeyData *vrfcommon.VRFKeyData,
subID uint64,
randomWordsFulfilledEventTimeout time.Duration,
l zerolog.Logger,
) (*vrf_coordinator_v2.VRFCoordinatorV2RandomWordsFulfilled, error) {
randomWordsRequestedEvent, err := coordinator.WaitForRandomWordsRequestedEvent(
- [][32]byte{vrfv2Data.KeyHash},
+ [][32]byte{vrfv2KeyData.KeyHash},
[]uint64{subID},
[]common.Address{common.HexToAddress(consumerAddress)},
time.Minute*1,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitRandomWordsRequestedEvent, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitRandomWordsRequestedEvent, err)
}
-
LogRandomnessRequestedEvent(l, coordinator, randomWordsRequestedEvent)
+
randomWordsFulfilledEvent, err := coordinator.WaitForRandomWordsFulfilledEvent(
[]*big.Int{randomWordsRequestedEvent.RequestId},
randomWordsFulfilledEventTimeout,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitRandomWordsFulfilledEvent, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitRandomWordsFulfilledEvent, err)
}
-
LogRandomWordsFulfilledEvent(l, coordinator, randomWordsFulfilledEvent)
return randomWordsFulfilledEvent, err
}
@@ -985,7 +1003,7 @@ func LogRandomnessRequestedEvent(
coordinator contracts.VRFCoordinatorV2,
randomWordsRequestedEvent *vrf_coordinator_v2.VRFCoordinatorV2RandomWordsRequested,
) {
- l.Debug().
+ l.Info().
Str("Coordinator", coordinator.Address()).
Str("Request ID", randomWordsRequestedEvent.RequestId.String()).
Uint64("Subscription ID", randomWordsRequestedEvent.SubId).
@@ -1002,7 +1020,7 @@ func LogRandomWordsFulfilledEvent(
coordinator contracts.VRFCoordinatorV2,
randomWordsFulfilledEvent *vrf_coordinator_v2.VRFCoordinatorV2RandomWordsFulfilled,
) {
- l.Debug().
+ l.Info().
Str("Coordinator", coordinator.Address()).
Str("Total Payment", randomWordsFulfilledEvent.Payment.String()).
Str("TX Hash", randomWordsFulfilledEvent.Raw.TxHash.String()).
@@ -1036,7 +1054,7 @@ func logRandRequest(
randomnessRequestCountPerRequest uint16,
randomnessRequestCountPerRequestDeviation uint16,
) {
- l.Debug().
+ l.Info().
Str("Consumer", consumer).
Str("Coordinator", coordinator).
Uint64("SubID", subID).
diff --git a/integration-tests/actions/vrf/vrfv2plus/errors.go b/integration-tests/actions/vrf/vrfv2plus/errors.go
new file mode 100644
index 00000000000..d39e2002c13
--- /dev/null
+++ b/integration-tests/actions/vrf/vrfv2plus/errors.go
@@ -0,0 +1,17 @@
+package vrfv2plus
+
+const (
+ ErrCreatingVRFv2PlusKey = "error creating VRFv2Plus key"
+ ErrAdvancedConsumer = "error deploying VRFv2Plus Advanced Consumer"
+ ErrCreatingVRFv2PlusJob = "error creating VRFv2Plus job"
+ ErrDeployVRFV2_5Contracts = "error deploying VRFV2_5 contracts"
+ ErrAddConsumerToSub = "error adding consumer to VRF Subscription"
+ ErrFundSubWithNativeToken = "error funding subscription with native token"
+ ErrSetLinkNativeLinkFeed = "error setting Link and ETH/LINK feed for VRF Coordinator contract"
+ ErrCreateVRFV2PlusJobs = "error creating VRF V2 Plus Jobs"
+ ErrRequestRandomnessDirectFundingLinkPayment = "error requesting randomness with direct funding and link payment"
+ ErrRequestRandomnessDirectFundingNativePayment = "error requesting randomness with direct funding and native payment"
+ ErrLinkTotalBalance = "error waiting for RandomWordsFulfilled event"
+ ErrNativeTokenBalance = "error waiting for RandomWordsFulfilled event"
+ ErrDeployWrapper = "error deploying VRFV2PlusWrapper"
+)
diff --git a/integration-tests/actions/vrf/vrfv2plus/vrfv2plus_models.go b/integration-tests/actions/vrf/vrfv2plus/vrfv2plus_models.go
index c227d490eb9..a2ca8ec582b 100644
--- a/integration-tests/actions/vrf/vrfv2plus/vrfv2plus_models.go
+++ b/integration-tests/actions/vrf/vrfv2plus/vrfv2plus_models.go
@@ -1,34 +1,9 @@
package vrfv2plus
import (
- "math/big"
-
- "github.com/smartcontractkit/chainlink/integration-tests/client"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
)
-type VRFV2PlusEncodedProvingKey [2]*big.Int
-
-// VRFV2PlusKeyData defines a jobs into and proving key info
-type VRFV2PlusKeyData struct {
- VRFKey *client.VRFKey
- EncodedProvingKey VRFV2PlusEncodedProvingKey
- KeyHash [32]byte
-}
-
-type VRFV2PlusData struct {
- VRFV2PlusKeyData
- VRFJob *client.Job
- PrimaryEthAddress string
- ChainID *big.Int
-}
-
-type VRFV2_5Contracts struct {
- Coordinator contracts.VRFCoordinatorV2_5
- BHS contracts.BlockHashStore
- LoadTestConsumers []contracts.VRFv2PlusLoadTestConsumer
-}
-
type VRFV2PlusWrapperContracts struct {
VRFV2PlusWrapper contracts.VRFV2PlusWrapper
LoadTestConsumers []contracts.VRFv2PlusWrapperLoadTestConsumer
diff --git a/integration-tests/actions/vrf/vrfv2plus/vrfv2plus_steps.go b/integration-tests/actions/vrf/vrfv2plus/vrfv2plus_steps.go
index fc2a47f53ef..a3c6352bf37 100644
--- a/integration-tests/actions/vrf/vrfv2plus/vrfv2plus_steps.go
+++ b/integration-tests/actions/vrf/vrfv2plus/vrfv2plus_steps.go
@@ -7,8 +7,13 @@ import (
"sync"
"time"
+ "golang.org/x/sync/errgroup"
+
commonassets "github.com/smartcontractkit/chainlink-common/pkg/assets"
"github.com/smartcontractkit/chainlink-testing-framework/utils/conversions"
+ vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
+ testconfig "github.com/smartcontractkit/chainlink/integration-tests/testconfig/vrfv2"
+ "github.com/smartcontractkit/chainlink/integration-tests/types/config/node"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrfv2plus_wrapper_load_test_consumer"
@@ -21,86 +26,33 @@ import (
"github.com/smartcontractkit/chainlink/integration-tests/client"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
"github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"
- tc "github.com/smartcontractkit/chainlink/integration-tests/testconfig"
vrfv2plus_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/vrfv2plus"
"github.com/smartcontractkit/chainlink/integration-tests/types"
- "github.com/smartcontractkit/chainlink/integration-tests/types/config/node"
chainlinkutils "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_coordinator_v2_5"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_v2plus_upgraded_version"
)
-var (
- ErrNodePrimaryKey = "error getting node's primary ETH key"
- ErrNodeNewTxKey = "error creating node's EVM transaction key"
- ErrCreatingProvingKeyHash = "error creating a keyHash from the proving key"
- ErrRegisteringProvingKey = "error registering a proving key on Coordinator contract"
- ErrRegisterProvingKey = "error registering proving keys"
- ErrEncodingProvingKey = "error encoding proving key"
- ErrCreatingVRFv2PlusKey = "error creating VRFv2Plus key"
- ErrDeployBlockHashStore = "error deploying blockhash store"
- ErrDeployCoordinator = "error deploying VRF CoordinatorV2Plus"
- ErrAdvancedConsumer = "error deploying VRFv2Plus Advanced Consumer"
- ErrABIEncodingFunding = "error Abi encoding subscriptionID"
- ErrSendingLinkToken = "error sending Link token"
- ErrCreatingVRFv2PlusJob = "error creating VRFv2Plus job"
- ErrParseJob = "error parsing job definition"
- ErrDeployVRFV2_5Contracts = "error deploying VRFV2_5 contracts"
- ErrSetVRFCoordinatorConfig = "error setting config for VRF Coordinator contract"
- ErrCreateVRFSubscription = "error creating VRF Subscription"
- ErrAddConsumerToSub = "error adding consumer to VRF Subscription"
- ErrFundSubWithNativeToken = "error funding subscription with native token"
- ErrSetLinkNativeLinkFeed = "error setting Link and ETH/LINK feed for VRF Coordinator contract"
- ErrFundSubWithLinkToken = "error funding subscription with Link tokens"
- ErrCreateVRFV2PlusJobs = "error creating VRF V2 Plus Jobs"
- ErrGetPrimaryKey = "error getting primary ETH key address"
- ErrRestartCLNode = "error restarting CL node"
- ErrWaitTXsComplete = "error waiting for TXs to complete"
- ErrRequestRandomness = "error requesting randomness"
- ErrRequestRandomnessDirectFundingLinkPayment = "error requesting randomness with direct funding and link payment"
- ErrRequestRandomnessDirectFundingNativePayment = "error requesting randomness with direct funding and native payment"
-
- ErrWaitRandomWordsRequestedEvent = "error waiting for RandomWordsRequested event"
- ErrWaitRandomWordsFulfilledEvent = "error waiting for RandomWordsFulfilled event"
- ErrLinkTotalBalance = "error waiting for RandomWordsFulfilled event"
- ErrNativeTokenBalance = "error waiting for RandomWordsFulfilled event"
- ErrDeployWrapper = "error deploying VRFV2PlusWrapper"
-)
-
-type VRFJobSpecConfig struct {
- ForwardingAllowed bool
- CoordinatorAddress string
- FromAddresses []string
- EVMChainID string
- MinIncomingConfirmations int
- PublicKey string
- BatchFulfillmentEnabled bool
- BatchFulfillmentGasMultiplier float64
- EstimateGasMultiplier float64
- PollPeriod time.Duration
- RequestTimeout time.Duration
-}
-
func DeployVRFV2_5Contracts(
contractDeployer contracts.ContractDeployer,
chainClient blockchain.EVMClient,
consumerContractsAmount int,
-) (*VRFV2_5Contracts, error) {
+) (*vrfcommon.VRFContracts, error) {
bhs, err := contractDeployer.DeployBlockhashStore()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrDeployBlockHashStore, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrDeployBlockHashStore, err)
}
err = chainClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
coordinator, err := contractDeployer.DeployVRFCoordinatorV2_5(bhs.Address())
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrDeployCoordinator, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrDeployCoordinator, err)
}
err = chainClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
consumers, err := DeployVRFV2PlusConsumers(contractDeployer, coordinator, consumerContractsAmount)
if err != nil {
@@ -108,9 +60,13 @@ func DeployVRFV2_5Contracts(
}
err = chainClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
- return &VRFV2_5Contracts{coordinator, bhs, consumers}, nil
+ return &vrfcommon.VRFContracts{
+ CoordinatorV2Plus: coordinator,
+ BHS: bhs,
+ VRFV2PlusConsumer: consumers,
+ }, nil
}
func DeployVRFV2PlusConsumers(contractDeployer contracts.ContractDeployer, coordinator contracts.VRFCoordinatorV2_5, consumerContractsAmount int) ([]contracts.VRFv2PlusLoadTestConsumer, error) {
@@ -127,17 +83,18 @@ func DeployVRFV2PlusConsumers(contractDeployer contracts.ContractDeployer, coord
func CreateVRFV2PlusJob(
chainlinkNode *client.ChainlinkClient,
- vrfJobSpecConfig VRFJobSpecConfig,
+ vrfJobSpecConfig vrfcommon.VRFJobSpecConfig,
) (*client.Job, error) {
jobUUID := uuid.New()
os := &client.VRFV2PlusTxPipelineSpec{
Address: vrfJobSpecConfig.CoordinatorAddress,
EstimateGasMultiplier: vrfJobSpecConfig.EstimateGasMultiplier,
FromAddress: vrfJobSpecConfig.FromAddresses[0],
+ SimulationBlock: vrfJobSpecConfig.SimulationBlock,
}
ost, err := os.String()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrParseJob, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrParseJob, err)
}
job, err := chainlinkNode.MustCreateJob(&client.VRFV2PlusJobSpec{
@@ -164,16 +121,18 @@ func CreateVRFV2PlusJob(
func VRFV2_5RegisterProvingKey(
vrfKey *client.VRFKey,
coordinator contracts.VRFCoordinatorV2_5,
-) (VRFV2PlusEncodedProvingKey, error) {
+ gasLaneMaxGas uint64,
+) (vrfcommon.VRFEncodedProvingKey, error) {
provingKey, err := actions.EncodeOnChainVRFProvingKey(*vrfKey)
if err != nil {
- return VRFV2PlusEncodedProvingKey{}, fmt.Errorf("%s, err %w", ErrEncodingProvingKey, err)
+ return vrfcommon.VRFEncodedProvingKey{}, fmt.Errorf("%s, err %w", vrfcommon.ErrEncodingProvingKey, err)
}
err = coordinator.RegisterProvingKey(
provingKey,
+ gasLaneMaxGas,
)
if err != nil {
- return VRFV2PlusEncodedProvingKey{}, fmt.Errorf("%s, err %w", ErrRegisterProvingKey, err)
+ return vrfcommon.VRFEncodedProvingKey{}, fmt.Errorf("%s, err %w", vrfcommon.ErrRegisterProvingKey, err)
}
return provingKey, nil
}
@@ -181,16 +140,16 @@ func VRFV2_5RegisterProvingKey(
func VRFV2PlusUpgradedVersionRegisterProvingKey(
vrfKey *client.VRFKey,
coordinator contracts.VRFCoordinatorV2PlusUpgradedVersion,
-) (VRFV2PlusEncodedProvingKey, error) {
+) (vrfcommon.VRFEncodedProvingKey, error) {
provingKey, err := actions.EncodeOnChainVRFProvingKey(*vrfKey)
if err != nil {
- return VRFV2PlusEncodedProvingKey{}, fmt.Errorf("%s, err %w", ErrEncodingProvingKey, err)
+ return vrfcommon.VRFEncodedProvingKey{}, fmt.Errorf("%s, err %w", vrfcommon.ErrEncodingProvingKey, err)
}
err = coordinator.RegisterProvingKey(
provingKey,
)
if err != nil {
- return VRFV2PlusEncodedProvingKey{}, fmt.Errorf("%s, err %w", ErrRegisterProvingKey, err)
+ return vrfcommon.VRFEncodedProvingKey{}, fmt.Errorf("%s, err %w", vrfcommon.ErrRegisterProvingKey, err)
}
return provingKey, nil
}
@@ -204,11 +163,11 @@ func FundVRFCoordinatorV2_5Subscription(
) error {
encodedSubId, err := chainlinkutils.ABIEncode(`[{"type":"uint256"}]`, subscriptionID)
if err != nil {
- return fmt.Errorf("%s, err %w", ErrABIEncodingFunding, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrABIEncodingFunding, err)
}
_, err = linkToken.TransferAndCall(coordinator.Address(), linkFundingAmountJuels, encodedSubId)
if err != nil {
- return fmt.Errorf("%s, err %w", ErrSendingLinkToken, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrSendingLinkToken, err)
}
return chainClient.WaitForEvents()
}
@@ -216,6 +175,7 @@ func FundVRFCoordinatorV2_5Subscription(
// SetupVRFV2_5Environment will create specified number of subscriptions and add the same conumer/s to each of them
func SetupVRFV2_5Environment(
env *test_env.CLClusterTestEnv,
+ nodesToCreate []vrfcommon.VRFNodeType,
vrfv2PlusTestConfig types.VRFv2PlusTestConfig,
linkToken contracts.LinkToken,
mockNativeLINKFeed contracts.MockETHLINKFeed,
@@ -223,42 +183,42 @@ func SetupVRFV2_5Environment(
numberOfConsumers int,
numberOfSubToCreate int,
l zerolog.Logger,
-) (*VRFV2_5Contracts, []*big.Int, *VRFV2PlusData, error) {
+) (*vrfcommon.VRFContracts, []*big.Int, *vrfcommon.VRFKeyData, map[vrfcommon.VRFNodeType]*vrfcommon.VRFNode, error) {
l.Info().Msg("Starting VRFV2 Plus environment setup")
l.Info().Msg("Deploying VRFV2 Plus contracts")
- vrfv2_5Contracts, err := DeployVRFV2_5Contracts(env.ContractDeployer, env.EVMClient, numberOfConsumers)
+ vrfContracts, err := DeployVRFV2_5Contracts(env.ContractDeployer, env.EVMClient, numberOfConsumers)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrDeployVRFV2_5Contracts, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", ErrDeployVRFV2_5Contracts, err)
}
- l.Info().Str("Coordinator", vrfv2_5Contracts.Coordinator.Address()).Msg("Setting Coordinator Config")
+ l.Info().Str("Coordinator", vrfContracts.CoordinatorV2Plus.Address()).Msg("Setting Coordinator Config")
vrfv2PlusConfig := vrfv2PlusTestConfig.GetVRFv2PlusConfig().General
- err = vrfv2_5Contracts.Coordinator.SetConfig(
+ err = vrfContracts.CoordinatorV2Plus.SetConfig(
*vrfv2PlusConfig.MinimumConfirmations,
*vrfv2PlusConfig.MaxGasLimitCoordinatorConfig,
*vrfv2PlusConfig.StalenessSeconds,
*vrfv2PlusConfig.GasAfterPaymentCalculation,
big.NewInt(*vrfv2PlusConfig.FallbackWeiPerUnitLink),
- vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig{
- FulfillmentFlatFeeLinkPPM: *vrfv2PlusConfig.FulfillmentFlatFeeLinkPPM,
- FulfillmentFlatFeeNativePPM: *vrfv2PlusConfig.FulfillmentFlatFeeNativePPM,
- },
+ *vrfv2PlusConfig.FulfillmentFlatFeeNativePPM,
+ *vrfv2PlusConfig.FulfillmentFlatFeeLinkDiscountPPM,
+ *vrfv2PlusConfig.NativePremiumPercentage,
+ *vrfv2PlusConfig.LinkPremiumPercentage,
)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrSetVRFCoordinatorConfig, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrSetVRFCoordinatorConfig, err)
}
- l.Info().Str("Coordinator", vrfv2_5Contracts.Coordinator.Address()).Msg("Setting Link and ETH/LINK feed")
- err = vrfv2_5Contracts.Coordinator.SetLINKAndLINKNativeFeed(linkToken.Address(), mockNativeLINKFeed.Address())
+ l.Info().Str("Coordinator", vrfContracts.CoordinatorV2Plus.Address()).Msg("Setting Link and ETH/LINK feed")
+ err = vrfContracts.CoordinatorV2Plus.SetLINKAndLINKNativeFeed(linkToken.Address(), mockNativeLINKFeed.Address())
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrSetLinkNativeLinkFeed, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", ErrSetLinkNativeLinkFeed, err)
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
l.Info().
- Str("Coordinator", vrfv2_5Contracts.Coordinator.Address()).
+ Str("Coordinator", vrfContracts.CoordinatorV2Plus.Address()).
Int("Number of Subs to create", numberOfSubToCreate).
Msg("Creating and funding subscriptions, adding consumers")
subIDs, err := CreateFundSubsAndAddConsumers(
@@ -266,110 +226,140 @@ func SetupVRFV2_5Environment(
big.NewFloat(*vrfv2PlusConfig.SubscriptionFundingAmountNative),
big.NewFloat(*vrfv2PlusConfig.SubscriptionFundingAmountLink),
linkToken,
- vrfv2_5Contracts.Coordinator, vrfv2_5Contracts.LoadTestConsumers,
+ vrfContracts.CoordinatorV2Plus, vrfContracts.VRFV2PlusConsumer,
numberOfSubToCreate,
vrfv2plus_config.BillingType(*vrfv2PlusConfig.SubscriptionBillingType))
if err != nil {
- return nil, nil, nil, err
+ return nil, nil, nil, nil, err
+ }
+
+ var nodesMap = make(map[vrfcommon.VRFNodeType]*vrfcommon.VRFNode)
+ for i, nodeType := range nodesToCreate {
+ nodesMap[nodeType] = &vrfcommon.VRFNode{
+ CLNode: env.ClCluster.Nodes[i],
+ }
}
- l.Info().Str("Node URL", env.ClCluster.NodeAPIs()[0].URL()).Msg("Creating VRF Key on the Node")
- vrfKey, err := env.ClCluster.NodeAPIs()[0].MustCreateVRFKey()
+ l.Info().Str("Node URL", nodesMap[vrfcommon.VRF].CLNode.API.URL()).Msg("Creating VRF Key on the Node")
+ vrfKey, err := nodesMap[vrfcommon.VRF].CLNode.API.MustCreateVRFKey()
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrCreatingVRFv2PlusKey, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", ErrCreatingVRFv2PlusKey, err)
}
pubKeyCompressed := vrfKey.Data.ID
+ l.Info().
+ Str("Node URL", nodesMap[vrfcommon.VRF].CLNode.API.URL()).
+ Str("Keyhash", vrfKey.Data.Attributes.Hash).
+ Str("VRF Compressed Key", vrfKey.Data.Attributes.Compressed).
+ Str("VRF Uncompressed Key", vrfKey.Data.Attributes.Uncompressed).
+ Msg("VRF Key created on the Node")
- l.Info().Str("Coordinator", vrfv2_5Contracts.Coordinator.Address()).Msg("Registering Proving Key")
- provingKey, err := VRFV2_5RegisterProvingKey(vrfKey, vrfv2_5Contracts.Coordinator)
+ l.Info().Str("Coordinator", vrfContracts.CoordinatorV2Plus.Address()).Msg("Registering Proving Key")
+ provingKey, err := VRFV2_5RegisterProvingKey(vrfKey, vrfContracts.CoordinatorV2Plus, uint64(*vrfv2PlusConfig.CLNodeMaxGasPriceGWei)*1e9)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrRegisteringProvingKey, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrRegisteringProvingKey, err)
}
- keyHash, err := vrfv2_5Contracts.Coordinator.HashOfKey(context.Background(), provingKey)
+ keyHash, err := vrfContracts.CoordinatorV2Plus.HashOfKey(context.Background(), provingKey)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrCreatingProvingKeyHash, err)
+ return nil, nil, nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrCreatingProvingKeyHash, err)
}
chainID := env.EVMClient.GetChainID()
- newNativeTokenKeyAddresses, err := CreateAndFundSendingKeys(env, vrfv2PlusTestConfig, numberOfTxKeysToCreate, chainID)
+ vrfTXKeyAddressStrings, _, err := vrfcommon.CreateFundAndGetSendingKeys(
+ env.EVMClient,
+ nodesMap[vrfcommon.VRF],
+ *vrfv2PlusTestConfig.GetCommonConfig().ChainlinkNodeFunding,
+ numberOfTxKeysToCreate,
+ chainID,
+ )
if err != nil {
- return nil, nil, nil, err
+ return nil, nil, nil, nil, err
}
- nativeTokenPrimaryKeyAddress, err := env.ClCluster.NodeAPIs()[0].PrimaryEthAddress()
- if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrNodePrimaryKey, err)
+ nodesMap[vrfcommon.VRF].TXKeyAddressStrings = vrfTXKeyAddressStrings
+
+ g := errgroup.Group{}
+ if vrfNode, exists := nodesMap[vrfcommon.VRF]; exists {
+ g.Go(func() error {
+ err := setupVRFNode(vrfContracts, chainID, vrfv2PlusConfig.General, pubKeyCompressed, l, vrfNode)
+ if err != nil {
+ return err
+ }
+ return nil
+ })
+ }
+
+ if bhsNode, exists := nodesMap[vrfcommon.BHS]; exists {
+ g.Go(func() error {
+ err := vrfcommon.SetupBHSNode(
+ env,
+ vrfv2PlusConfig.General,
+ numberOfTxKeysToCreate,
+ chainID,
+ vrfContracts.CoordinatorV2Plus.Address(),
+ vrfContracts.BHS.Address(),
+ *vrfv2PlusTestConfig.GetCommonConfig().ChainlinkNodeFunding,
+ l,
+ bhsNode,
+ )
+ if err != nil {
+ return err
+ }
+ return nil
+ })
+ }
+
+ if err := g.Wait(); err != nil {
+ return nil, nil, nil, nil, fmt.Errorf("VRF node setup ended up with an error: %w", err)
}
- allNativeTokenKeyAddresses := append(newNativeTokenKeyAddresses, nativeTokenPrimaryKeyAddress)
- vrfJobSpecConfig := VRFJobSpecConfig{
- ForwardingAllowed: false,
- CoordinatorAddress: vrfv2_5Contracts.Coordinator.Address(),
- FromAddresses: allNativeTokenKeyAddresses,
+ vrfKeyData := vrfcommon.VRFKeyData{
+ VRFKey: vrfKey,
+ EncodedProvingKey: provingKey,
+ KeyHash: keyHash,
+ }
+
+ l.Info().Msg("VRFV2 Plus environment setup is finished")
+ return vrfContracts, subIDs, &vrfKeyData, nodesMap, nil
+}
+
+func setupVRFNode(contracts *vrfcommon.VRFContracts, chainID *big.Int, vrfv2Config *testconfig.General, pubKeyCompressed string, l zerolog.Logger, vrfNode *vrfcommon.VRFNode) error {
+ vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{
+ ForwardingAllowed: *vrfv2Config.VRFJobForwardingAllowed,
+ CoordinatorAddress: contracts.CoordinatorV2Plus.Address(),
+ FromAddresses: vrfNode.TXKeyAddressStrings,
EVMChainID: chainID.String(),
- MinIncomingConfirmations: int(*vrfv2PlusConfig.MinimumConfirmations),
+ MinIncomingConfirmations: int(*vrfv2Config.MinimumConfirmations),
PublicKey: pubKeyCompressed,
- EstimateGasMultiplier: 1,
- BatchFulfillmentEnabled: false,
- BatchFulfillmentGasMultiplier: 1.15,
- PollPeriod: time.Second * 1,
- RequestTimeout: time.Hour * 24,
+ EstimateGasMultiplier: *vrfv2Config.VRFJobEstimateGasMultiplier,
+ BatchFulfillmentEnabled: *vrfv2Config.VRFJobBatchFulfillmentEnabled,
+ BatchFulfillmentGasMultiplier: *vrfv2Config.VRFJobBatchFulfillmentGasMultiplier,
+ PollPeriod: vrfv2Config.VRFJobPollPeriod.Duration,
+ RequestTimeout: vrfv2Config.VRFJobRequestTimeout.Duration,
+ SimulationBlock: vrfv2Config.VRFJobSimulationBlock,
+ VRFOwnerConfig: nil,
}
l.Info().Msg("Creating VRFV2 Plus Job")
job, err := CreateVRFV2PlusJob(
- env.ClCluster.NodeAPIs()[0],
+ vrfNode.CLNode.API,
vrfJobSpecConfig,
)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrCreateVRFV2PlusJobs, err)
+ return fmt.Errorf("%s, err %w", ErrCreateVRFV2PlusJobs, err)
}
+ vrfNode.Job = job
// this part is here because VRFv2 can work with only a specific key
// [[EVM.KeySpecific]]
// Key = '...'
- nodeConfig := node.NewConfig(env.ClCluster.Nodes[0].NodeConfig,
+ nodeConfig := node.NewConfig(vrfNode.CLNode.NodeConfig,
node.WithLogPollInterval(1*time.Second),
- node.WithVRFv2EVMEstimator(allNativeTokenKeyAddresses, *vrfv2PlusConfig.CLNodeMaxGasPriceGWei),
+ node.WithVRFv2EVMEstimator(vrfNode.TXKeyAddressStrings, *vrfv2Config.CLNodeMaxGasPriceGWei),
)
- l.Info().Msg("Restarting Node with new sending key PriceMax configuration and log poll period configuration")
- err = env.ClCluster.Nodes[0].Restart(nodeConfig)
+ l.Info().Msg("Restarting Node with new sending key PriceMax configuration")
+ err = vrfNode.CLNode.Restart(nodeConfig)
if err != nil {
- return nil, nil, nil, fmt.Errorf("%s, err %w", ErrRestartCLNode, err)
- }
-
- vrfv2PlusKeyData := VRFV2PlusKeyData{
- VRFKey: vrfKey,
- EncodedProvingKey: provingKey,
- KeyHash: keyHash,
- }
-
- data := VRFV2PlusData{
- vrfv2PlusKeyData,
- job,
- nativeTokenPrimaryKeyAddress,
- chainID,
- }
-
- l.Info().Msg("VRFV2 Plus environment setup is finished")
- return vrfv2_5Contracts, subIDs, &data, nil
-}
-
-func CreateAndFundSendingKeys(env *test_env.CLClusterTestEnv, commonTestConfig tc.CommonTestConfig, numberOfNativeTokenAddressesToCreate int, chainID *big.Int) ([]string, error) {
- var newNativeTokenKeyAddresses []string
- for i := 0; i < numberOfNativeTokenAddressesToCreate; i++ {
- newTxKey, response, err := env.ClCluster.NodeAPIs()[0].CreateTxKey("evm", chainID.String())
- if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrNodeNewTxKey, err)
- }
- if response.StatusCode != 200 {
- return nil, fmt.Errorf("error creating transaction key - response code, err %d", response.StatusCode)
- }
- newNativeTokenKeyAddresses = append(newNativeTokenKeyAddresses, newTxKey.Data.ID)
- err = actions.FundAddress(env.EVMClient, newTxKey.Data.ID, big.NewFloat(*commonTestConfig.GetCommonConfig().ChainlinkNodeFunding))
- if err != nil {
- return nil, err
- }
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrRestartCLNode, err)
}
- return newNativeTokenKeyAddresses, nil
+ return nil
}
func CreateFundSubsAndAddConsumers(
@@ -411,7 +401,7 @@ func CreateFundSubsAndAddConsumers(
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return subIDs, nil
}
@@ -431,7 +421,7 @@ func CreateSubsAndFund(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
err = FundSubscriptions(
env,
@@ -483,16 +473,16 @@ func AddConsumersToSubs(
func CreateSubAndFindSubID(env *test_env.CLClusterTestEnv, coordinator contracts.VRFCoordinatorV2_5) (*big.Int, error) {
tx, err := coordinator.CreateSubscription()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrCreateVRFSubscription, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrCreateVRFSubscription, err)
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
receipt, err := env.EVMClient.GetTxReceipt(tx.Hash())
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
//SubscriptionsCreated Log should be emitted with the subscription ID
@@ -527,7 +517,7 @@ func FundSubscriptions(
amountJuels := conversions.EtherToWei(subscriptionFundingAmountLink)
err := FundVRFCoordinatorV2_5Subscription(linkAddress, coordinator, env.EVMClient, subID, amountJuels)
if err != nil {
- return fmt.Errorf("%s, err %w", ErrFundSubWithLinkToken, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrFundSubWithLinkToken, err)
}
case vrfv2plus_config.BillingType_Link_and_Native:
//Native Billing
@@ -543,7 +533,7 @@ func FundSubscriptions(
amountJuels := conversions.EtherToWei(subscriptionFundingAmountLink)
err = FundVRFCoordinatorV2_5Subscription(linkAddress, coordinator, env.EVMClient, subID, amountJuels)
if err != nil {
- return fmt.Errorf("%s, err %w", ErrFundSubWithLinkToken, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrFundSubWithLinkToken, err)
}
default:
return fmt.Errorf("invalid billing type: %s", subscriptionBillingType)
@@ -551,7 +541,7 @@ func FundSubscriptions(
}
err := env.EVMClient.WaitForEvents()
if err != nil {
- return fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return nil
}
@@ -583,7 +573,7 @@ func GetCoordinatorTotalBalance(coordinator contracts.VRFCoordinatorV2_5) (linkT
func RequestRandomnessAndWaitForFulfillment(
consumer contracts.VRFv2PlusLoadTestConsumer,
coordinator contracts.VRFCoordinatorV2_5,
- vrfv2PlusData *VRFV2PlusData,
+ vrfKeyData *vrfcommon.VRFKeyData,
subID *big.Int,
isNativeBilling bool,
minimumConfirmations uint16,
@@ -594,9 +584,21 @@ func RequestRandomnessAndWaitForFulfillment(
randomWordsFulfilledEventTimeout time.Duration,
l zerolog.Logger,
) (*vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsFulfilled, error) {
- logRandRequest(l, consumer.Address(), coordinator.Address(), subID, isNativeBilling, minimumConfirmations, callbackGasLimit, numberOfWords, randomnessRequestCountPerRequest, randomnessRequestCountPerRequestDeviation)
+ logRandRequest(
+ l,
+ consumer.Address(),
+ coordinator.Address(),
+ subID,
+ isNativeBilling,
+ minimumConfirmations,
+ callbackGasLimit,
+ numberOfWords,
+ vrfKeyData.KeyHash,
+ randomnessRequestCountPerRequest,
+ randomnessRequestCountPerRequestDeviation,
+ )
_, err := consumer.RequestRandomness(
- vrfv2PlusData.KeyHash,
+ vrfKeyData.KeyHash,
subID,
minimumConfirmations,
callbackGasLimit,
@@ -605,13 +607,13 @@ func RequestRandomnessAndWaitForFulfillment(
randomnessRequestCountPerRequest,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrRequestRandomness, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrRequestRandomness, err)
}
return WaitForRequestAndFulfillmentEvents(
consumer.Address(),
coordinator,
- vrfv2PlusData,
+ vrfKeyData,
subID,
isNativeBilling,
randomWordsFulfilledEventTimeout,
@@ -622,7 +624,7 @@ func RequestRandomnessAndWaitForFulfillment(
func RequestRandomnessAndWaitForFulfillmentUpgraded(
consumer contracts.VRFv2PlusLoadTestConsumer,
coordinator contracts.VRFCoordinatorV2PlusUpgradedVersion,
- vrfv2PlusData *VRFV2PlusData,
+ vrfKeyData *vrfcommon.VRFKeyData,
subID *big.Int,
isNativeBilling bool,
minimumConfirmations uint16,
@@ -632,9 +634,21 @@ func RequestRandomnessAndWaitForFulfillmentUpgraded(
randomnessRequestCountPerRequestDeviation uint16,
l zerolog.Logger,
) (*vrf_v2plus_upgraded_version.VRFCoordinatorV2PlusUpgradedVersionRandomWordsFulfilled, error) {
- logRandRequest(l, consumer.Address(), coordinator.Address(), subID, isNativeBilling, minimumConfirmations, callbackGasLimit, numberOfWords, randomnessRequestCountPerRequest, randomnessRequestCountPerRequestDeviation)
+ logRandRequest(
+ l,
+ consumer.Address(),
+ coordinator.Address(),
+ subID,
+ isNativeBilling,
+ minimumConfirmations,
+ callbackGasLimit,
+ numberOfWords,
+ vrfKeyData.KeyHash,
+ randomnessRequestCountPerRequest,
+ randomnessRequestCountPerRequestDeviation,
+ )
_, err := consumer.RequestRandomness(
- vrfv2PlusData.KeyHash,
+ vrfKeyData.KeyHash,
subID,
minimumConfirmations,
callbackGasLimit,
@@ -643,17 +657,17 @@ func RequestRandomnessAndWaitForFulfillmentUpgraded(
randomnessRequestCountPerRequest,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrRequestRandomness, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrRequestRandomness, err)
}
randomWordsRequestedEvent, err := coordinator.WaitForRandomWordsRequestedEvent(
- [][32]byte{vrfv2PlusData.KeyHash},
+ [][32]byte{vrfKeyData.KeyHash},
[]*big.Int{subID},
[]common.Address{common.HexToAddress(consumer.Address())},
time.Minute*1,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitRandomWordsRequestedEvent, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitRandomWordsRequestedEvent, err)
}
LogRandomnessRequestedEventUpgraded(l, coordinator, randomWordsRequestedEvent)
@@ -664,7 +678,7 @@ func RequestRandomnessAndWaitForFulfillmentUpgraded(
time.Minute*2,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitRandomWordsFulfilledEvent, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitRandomWordsFulfilledEvent, err)
}
LogRandomWordsFulfilledEventUpgraded(l, coordinator, randomWordsFulfilledEvent)
@@ -696,7 +710,7 @@ func SetupVRFV2PlusWrapperEnvironment(
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
err = wrapperContracts.VRFV2PlusWrapper.SetConfig(
*vrfv2PlusConfig.WrapperGasOverhead,
@@ -715,7 +729,7 @@ func SetupVRFV2PlusWrapperEnvironment(
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
//fund sub
@@ -726,7 +740,7 @@ func SetupVRFV2PlusWrapperEnvironment(
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
err = FundSubscriptions(env, big.NewFloat(*vrfv2PlusTestConfig.GetVRFv2PlusConfig().General.SubscriptionFundingAmountNative), big.NewFloat(*vrfv2PlusTestConfig.GetVRFv2PlusConfig().General.SubscriptionFundingAmountLink), linkToken, coordinator, []*big.Int{wrapperSubID}, vrfv2plus_config.BillingType(*vrfv2PlusTestConfig.GetVRFv2PlusConfig().General.SubscriptionBillingType))
@@ -744,7 +758,7 @@ func SetupVRFV2PlusWrapperEnvironment(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
//fund consumer with Eth
@@ -754,7 +768,7 @@ func SetupVRFV2PlusWrapperEnvironment(
}
err = env.EVMClient.WaitForEvents()
if err != nil {
- return nil, nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return wrapperContracts, wrapperSubID, nil
}
@@ -786,7 +800,7 @@ func DeployVRFV2PlusDirectFundingContracts(
}
err = chainClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
consumers, err := DeployVRFV2PlusWrapperConsumers(contractDeployer, linkTokenAddress, vrfv2PlusWrapper, consumerContractsAmount)
@@ -795,7 +809,7 @@ func DeployVRFV2PlusDirectFundingContracts(
}
err = chainClient.WaitForEvents()
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitTXsComplete, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitTXsComplete, err)
}
return &VRFV2PlusWrapperContracts{vrfv2PlusWrapper, consumers}, nil
}
@@ -803,7 +817,7 @@ func DeployVRFV2PlusDirectFundingContracts(
func DirectFundingRequestRandomnessAndWaitForFulfillment(
consumer contracts.VRFv2PlusWrapperLoadTestConsumer,
coordinator contracts.VRFCoordinatorV2_5,
- vrfv2PlusData *VRFV2PlusData,
+ vrfKeyData *vrfcommon.VRFKeyData,
subID *big.Int,
isNativeBilling bool,
minimumConfirmations uint16,
@@ -814,7 +828,19 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
randomWordsFulfilledEventTimeout time.Duration,
l zerolog.Logger,
) (*vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsFulfilled, error) {
- logRandRequest(l, consumer.Address(), coordinator.Address(), subID, isNativeBilling, minimumConfirmations, callbackGasLimit, numberOfWords, randomnessRequestCountPerRequest, randomnessRequestCountPerRequestDeviation)
+ logRandRequest(
+ l,
+ consumer.Address(),
+ coordinator.Address(),
+ subID,
+ isNativeBilling,
+ minimumConfirmations,
+ callbackGasLimit,
+ numberOfWords,
+ vrfKeyData.KeyHash,
+ randomnessRequestCountPerRequest,
+ randomnessRequestCountPerRequestDeviation,
+ )
if isNativeBilling {
_, err := consumer.RequestRandomnessNative(
minimumConfirmations,
@@ -843,7 +869,7 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
return WaitForRequestAndFulfillmentEvents(
wrapperAddress.String(),
coordinator,
- vrfv2PlusData,
+ vrfKeyData,
subID,
isNativeBilling,
randomWordsFulfilledEventTimeout,
@@ -854,20 +880,20 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
func WaitForRequestAndFulfillmentEvents(
consumerAddress string,
coordinator contracts.VRFCoordinatorV2_5,
- vrfv2PlusData *VRFV2PlusData,
+ vrfKeyData *vrfcommon.VRFKeyData,
subID *big.Int,
isNativeBilling bool,
randomWordsFulfilledEventTimeout time.Duration,
l zerolog.Logger,
) (*vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsFulfilled, error) {
randomWordsRequestedEvent, err := coordinator.WaitForRandomWordsRequestedEvent(
- [][32]byte{vrfv2PlusData.KeyHash},
+ [][32]byte{vrfKeyData.KeyHash},
[]*big.Int{subID},
[]common.Address{common.HexToAddress(consumerAddress)},
time.Minute*1,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitRandomWordsRequestedEvent, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitRandomWordsRequestedEvent, err)
}
LogRandomnessRequestedEvent(l, coordinator, randomWordsRequestedEvent, isNativeBilling)
@@ -878,7 +904,7 @@ func WaitForRequestAndFulfillmentEvents(
randomWordsFulfilledEventTimeout,
)
if err != nil {
- return nil, fmt.Errorf("%s, err %w", ErrWaitRandomWordsFulfilledEvent, err)
+ return nil, fmt.Errorf("%s, err %w", vrfcommon.ErrWaitRandomWordsFulfilledEvent, err)
}
LogRandomWordsFulfilledEvent(l, coordinator, randomWordsFulfilledEvent, isNativeBilling)
@@ -984,7 +1010,7 @@ func LogRandomnessRequestedEventUpgraded(
Str("Request ID", randomWordsRequestedEvent.RequestId.String()).
Str("Subscription ID", randomWordsRequestedEvent.SubId.String()).
Str("Sender Address", randomWordsRequestedEvent.Sender.String()).
- Interface("Keyhash", randomWordsRequestedEvent.KeyHash).
+ Interface("Keyhash", fmt.Sprintf("0x%x", randomWordsRequestedEvent.KeyHash)).
Uint32("Callback Gas Limit", randomWordsRequestedEvent.CallbackGasLimit).
Uint32("Number of Words", randomWordsRequestedEvent.NumWords).
Uint16("Minimum Request Confirmations", randomWordsRequestedEvent.MinimumRequestConfirmations).
@@ -1012,13 +1038,13 @@ func LogRandomnessRequestedEvent(
randomWordsRequestedEvent *vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsRequested,
isNativeBilling bool,
) {
- l.Debug().
+ l.Info().
Str("Coordinator", coordinator.Address()).
Bool("Native Billing", isNativeBilling).
Str("Request ID", randomWordsRequestedEvent.RequestId.String()).
Str("Subscription ID", randomWordsRequestedEvent.SubId.String()).
Str("Sender Address", randomWordsRequestedEvent.Sender.String()).
- Interface("Keyhash", randomWordsRequestedEvent.KeyHash).
+ Interface("Keyhash", fmt.Sprintf("0x%x", randomWordsRequestedEvent.KeyHash)).
Uint32("Callback Gas Limit", randomWordsRequestedEvent.CallbackGasLimit).
Uint32("Number of Words", randomWordsRequestedEvent.NumWords).
Uint16("Minimum Request Confirmations", randomWordsRequestedEvent.MinimumRequestConfirmations).
@@ -1031,7 +1057,7 @@ func LogRandomWordsFulfilledEvent(
randomWordsFulfilledEvent *vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsFulfilled,
isNativeBilling bool,
) {
- l.Debug().
+ l.Info().
Bool("Native Billing", isNativeBilling).
Str("Coordinator", coordinator.Address()).
Str("Total Payment", randomWordsFulfilledEvent.Payment.String()).
@@ -1042,16 +1068,16 @@ func LogRandomWordsFulfilledEvent(
Msg("RandomWordsFulfilled Event (TX metadata)")
}
-func LogMigrationCompletedEvent(l zerolog.Logger, migrationCompletedEvent *vrf_coordinator_v2_5.VRFCoordinatorV25MigrationCompleted, vrfv2PlusContracts *VRFV2_5Contracts) {
- l.Debug().
+func LogMigrationCompletedEvent(l zerolog.Logger, migrationCompletedEvent *vrf_coordinator_v2_5.VRFCoordinatorV25MigrationCompleted, vrfv2PlusContracts *vrfcommon.VRFContracts) {
+ l.Info().
Str("Subscription ID", migrationCompletedEvent.SubId.String()).
- Str("Migrated From Coordinator", vrfv2PlusContracts.Coordinator.Address()).
+ Str("Migrated From Coordinator", vrfv2PlusContracts.CoordinatorV2Plus.Address()).
Str("Migrated To Coordinator", migrationCompletedEvent.NewCoordinator.String()).
Msg("MigrationCompleted Event")
}
func LogSubDetailsAfterMigration(l zerolog.Logger, newCoordinator contracts.VRFCoordinatorV2PlusUpgradedVersion, subID *big.Int, migratedSubscription vrf_v2plus_upgraded_version.GetSubscription) {
- l.Debug().
+ l.Info().
Str("New Coordinator", newCoordinator.Address()).
Str("Subscription ID", subID.String()).
Str("Juels Balance", migratedSubscription.Balance.String()).
@@ -1068,7 +1094,7 @@ func LogFulfillmentDetailsLinkBilling(
consumerStatus vrfv2plus_wrapper_load_test_consumer.GetRequestStatus,
randomWordsFulfilledEvent *vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsFulfilled,
) {
- l.Debug().
+ l.Info().
Str("Consumer Balance Before Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceBeforeRequest).Link()).
Str("Consumer Balance After Request (Link)", (*commonassets.Link)(wrapperConsumerJuelsBalanceAfterRequest).Link()).
Bool("Fulfilment Status", consumerStatus.Fulfilled).
@@ -1089,7 +1115,7 @@ func LogFulfillmentDetailsNativeBilling(
consumerStatus vrfv2plus_wrapper_load_test_consumer.GetRequestStatus,
randomWordsFulfilledEvent *vrf_coordinator_v2_5.VRFCoordinatorV25RandomWordsFulfilled,
) {
- l.Debug().
+ l.Info().
Str("Consumer Balance Before Request", assets.FormatWei(wrapperConsumerBalanceBeforeRequestWei)).
Str("Consumer Balance After Request", assets.FormatWei(wrapperConsumerBalanceAfterRequestWei)).
Bool("Fulfilment Status", consumerStatus.Fulfilled).
@@ -1112,9 +1138,10 @@ func logRandRequest(
minimumConfirmations uint16,
callbackGasLimit uint32,
numberOfWords uint32,
+ keyHash [32]byte,
randomnessRequestCountPerRequest uint16,
randomnessRequestCountPerRequestDeviation uint16) {
- l.Debug().
+ l.Info().
Str("Consumer", consumer).
Str("Coordinator", coordinator).
Str("SubID", subID.String()).
@@ -1122,6 +1149,7 @@ func logRandRequest(
Uint16("MinimumConfirmations", minimumConfirmations).
Uint32("CallbackGasLimit", callbackGasLimit).
Uint32("NumberOfWords", numberOfWords).
+ Str("KeyHash", fmt.Sprintf("0x%x", keyHash)).
Uint16("RandomnessRequestCountPerRequest", randomnessRequestCountPerRequest).
Uint16("RandomnessRequestCountPerRequestDeviation", randomnessRequestCountPerRequestDeviation).
Msg("Requesting randomness")
diff --git a/integration-tests/client/chainlink_models.go b/integration-tests/client/chainlink_models.go
index 665ff3c7465..0e144d3ab39 100644
--- a/integration-tests/client/chainlink_models.go
+++ b/integration-tests/client/chainlink_models.go
@@ -380,8 +380,8 @@ type TxKeyData struct {
// TxKeyAttributes is the model that represents the created keys when read
type TxKeyAttributes struct {
PublicKey string `json:"publicKey"`
-
- StarkKey string `json:"starkPubKey,omitempty"`
+ Address string `json:"address"`
+ StarkKey string `json:"starkPubKey,omitempty"`
}
type SingleTransactionDataWrapper struct {
@@ -627,11 +627,23 @@ func (d *PipelineSpec) String() (string, error) {
return MarshallTemplate(d, "API call pipeline template", sourceString)
}
+func getOptionalSimBlock(simBlock *string) (string, error) {
+ optionalSimBlock := ""
+ if simBlock != nil {
+ if *simBlock != "latest" && *simBlock != "pending" {
+ return "", fmt.Errorf("invalid simulation block value: %s", *simBlock)
+ }
+ optionalSimBlock = fmt.Sprintf("block=\"%s\"", *simBlock)
+ }
+ return optionalSimBlock, nil
+}
+
// VRFV2TxPipelineSpec VRFv2 request with tx callback
type VRFV2PlusTxPipelineSpec struct {
Address string
EstimateGasMultiplier float64
FromAddress string
+ SimulationBlock *string // can be nil, "latest" or "pending".
}
// Type returns the type of the pipeline
@@ -641,7 +653,11 @@ func (d *VRFV2PlusTxPipelineSpec) Type() string {
// String representation of the pipeline
func (d *VRFV2PlusTxPipelineSpec) String() (string, error) {
- sourceString := `
+ optionalSimBlock, err := getOptionalSimBlock(d.SimulationBlock)
+ if err != nil {
+ return "", err
+ }
+ sourceTemplate := `
decode_log [type=ethabidecodelog
abi="RandomWordsRequested(bytes32 indexed keyHash,uint256 requestId,uint256 preSeed,uint256 indexed subId,uint16 minimumRequestConfirmations,uint32 callbackGasLimit,uint32 numWords,bytes extraArgs,address indexed sender)"
data="$(jobRun.logData)"
@@ -654,7 +670,8 @@ generate_proof [type=vrfv2plus
estimate_gas [type=estimategaslimit
to="{{ .Address }}"
multiplier="{{ .EstimateGasMultiplier }}"
- data="$(generate_proof.output)"]
+ data="$(generate_proof.output)"
+ %s]
simulate_fulfillment [type=ethcall
from="{{ .FromAddress }}"
to="{{ .Address }}"
@@ -662,8 +679,11 @@ simulate_fulfillment [type=ethcall
gasPrice="$(jobSpec.maxGasPrice)"
extractRevertReason=true
contract="{{ .Address }}"
- data="$(generate_proof.output)"]
+ data="$(generate_proof.output)"
+ %s]
decode_log->generate_proof->estimate_gas->simulate_fulfillment`
+
+ sourceString := fmt.Sprintf(sourceTemplate, optionalSimBlock, optionalSimBlock)
return MarshallTemplate(d, "VRFV2 Plus pipeline template", sourceString)
}
@@ -672,6 +692,7 @@ type VRFV2TxPipelineSpec struct {
Address string
EstimateGasMultiplier float64
FromAddress string
+ SimulationBlock *string // can be nil, "latest" or "pending".
}
// Type returns the type of the pipeline
@@ -681,7 +702,11 @@ func (d *VRFV2TxPipelineSpec) Type() string {
// String representation of the pipeline
func (d *VRFV2TxPipelineSpec) String() (string, error) {
- sourceString := `
+ optionalSimBlock, err := getOptionalSimBlock(d.SimulationBlock)
+ if err != nil {
+ return "", err
+ }
+ sourceTemplate := `
decode_log [type=ethabidecodelog
abi="RandomWordsRequested(bytes32 indexed keyHash,uint256 requestId,uint256 preSeed,uint64 indexed subId,uint16 minimumRequestConfirmations,uint32 callbackGasLimit,uint32 numWords,address indexed sender)"
data="$(jobRun.logData)"
@@ -694,7 +719,8 @@ vrf [type=vrfv2
estimate_gas [type=estimategaslimit
to="{{ .Address }}"
multiplier="{{ .EstimateGasMultiplier }}"
- data="$(vrf.output)"]
+ data="$(vrf.output)"
+ %s]
simulate [type=ethcall
from="{{ .FromAddress }}"
to="{{ .Address }}"
@@ -702,8 +728,11 @@ simulate [type=ethcall
gasPrice="$(jobSpec.maxGasPrice)"
extractRevertReason=true
contract="{{ .Address }}"
- data="$(vrf.output)"]
+ data="$(vrf.output)"
+ %s]
decode_log->vrf->estimate_gas->simulate`
+
+ sourceString := fmt.Sprintf(sourceTemplate, optionalSimBlock, optionalSimBlock)
return MarshallTemplate(d, "VRFV2 pipeline template", sourceString)
}
@@ -1261,14 +1290,18 @@ observationSource = """
// BlockhashStoreJobSpec represents a blockhashstore job
type BlockhashStoreJobSpec struct {
- Name string `toml:"name"`
- CoordinatorV2Address string `toml:"coordinatorV2Address"` // Address of the VRF CoordinatorV2 contract
- WaitBlocks int `toml:"waitBlocks"`
- LookbackBlocks int `toml:"lookbackBlocks"`
- BlockhashStoreAddress string `toml:"blockhashStoreAddress"`
- PollPeriod string `toml:"pollPeriod"`
- RunTimeout string `toml:"runTimeout"`
- EVMChainID string `toml:"evmChainID"`
+ Name string `toml:"name"`
+ CoordinatorV2Address string `toml:"coordinatorV2Address"`
+ CoordinatorV2PlusAddress string `toml:"coordinatorV2PlusAddress"`
+ BlockhashStoreAddress string `toml:"blockhashStoreAddress"`
+ ExternalJobID string `toml:"externalJobID"`
+ FromAddresses []string `toml:"fromAddresses"`
+ EVMChainID string `toml:"evmChainID"`
+ ForwardingAllowed bool `toml:"forwardingAllowed"`
+ PollPeriod time.Duration `toml:"pollPeriod"`
+ RunTimeout time.Duration `toml:"runTimeout"`
+ WaitBlocks int `toml:"waitBlocks"`
+ LookbackBlocks int `toml:"lookbackBlocks"`
}
// Type returns the type of the job
@@ -1280,13 +1313,17 @@ func (b *BlockhashStoreJobSpec) String() (string, error) {
type = "blockhashstore"
schemaVersion = 1
name = "{{.Name}}"
-coordinatorV2Address = "{{.CoordinatorV2Address}}"
-waitBlocks = {{.WaitBlocks}}
-lookbackBlocks = {{.LookbackBlocks}}
-blockhashStoreAddress = "{{.BlockhashStoreAddress}}"
-pollPeriod = "{{.PollPeriod}}"
-runTimeout = "{{.RunTimeout}}"
+forwardingAllowed = {{.ForwardingAllowed}}
+coordinatorV2Address = "{{.CoordinatorV2Address}}"
+coordinatorV2PlusAddress = "{{.CoordinatorV2PlusAddress}}"
+blockhashStoreAddress = "{{.BlockhashStoreAddress}}"
+fromAddresses = [{{range .FromAddresses}}"{{.}}",{{end}}]
evmChainID = "{{.EVMChainID}}"
+externalJobID = "{{.ExternalJobID}}"
+waitBlocks = {{.WaitBlocks}}
+lookbackBlocks = {{.LookbackBlocks}}
+pollPeriod = "{{.PollPeriod}}"
+runTimeout = "{{.RunTimeout}}"
`
return MarshallTemplate(b, "BlockhashStore Job", vrfTemplateString)
}
diff --git a/integration-tests/contracts/contract_models.go b/integration-tests/contracts/contract_models.go
index 3d738033d68..979a9b1d954 100644
--- a/integration-tests/contracts/contract_models.go
+++ b/integration-tests/contracts/contract_models.go
@@ -210,6 +210,7 @@ type MockGasFeed interface {
type BlockHashStore interface {
Address() string
+ GetBlockHash(ctx context.Context, blockNumber *big.Int) ([32]byte, error)
}
type Staking interface {
@@ -386,6 +387,7 @@ type MercuryVerifierProxy interface {
type MercuryFeeManager interface {
Address() common.Address
+ UpdateSubscriberDiscount(subscriber common.Address, feedId [32]byte, token common.Address, discount uint64) (*types.Transaction, error)
}
type MercuryRewardManager interface {
diff --git a/integration-tests/contracts/contract_vrf_models.go b/integration-tests/contracts/contract_vrf_models.go
index 2faf97df16f..7775df798be 100644
--- a/integration-tests/contracts/contract_vrf_models.go
+++ b/integration-tests/contracts/contract_vrf_models.go
@@ -87,10 +87,14 @@ type VRFCoordinatorV2_5 interface {
stalenessSeconds uint32,
gasAfterPaymentCalculation uint32,
fallbackWeiPerUnitLink *big.Int,
- feeConfig vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig,
+ fulfillmentFlatFeeNativePPM uint32,
+ fulfillmentFlatFeeLinkDiscountPPM uint32,
+ nativePremiumPercentage uint8,
+ linkPremiumPercentage uint8,
) error
RegisterProvingKey(
publicProvingKey [2]*big.Int,
+ gasLaneMaxGas uint64,
) error
HashOfKey(ctx context.Context, pubKey [2]*big.Int) ([32]byte, error)
CreateSubscription() (*types.Transaction, error)
@@ -127,7 +131,10 @@ type VRFCoordinatorV2PlusUpgradedVersion interface {
stalenessSeconds uint32,
gasAfterPaymentCalculation uint32,
fallbackWeiPerUnitLink *big.Int,
- feeConfig vrf_v2plus_upgraded_version.VRFCoordinatorV2PlusUpgradedVersionFeeConfig,
+ fulfillmentFlatFeeNativePPM uint32,
+ fulfillmentFlatFeeLinkDiscountPPM uint32,
+ nativePremiumPercentage uint8,
+ linkPremiumPercentage uint8,
) error
RegisterProvingKey(
publicProvingKey [2]*big.Int,
diff --git a/integration-tests/contracts/ethereum_contracts.go b/integration-tests/contracts/ethereum_contracts.go
index 9cb858fe007..a43e4bd2f6a 100644
--- a/integration-tests/contracts/ethereum_contracts.go
+++ b/integration-tests/contracts/ethereum_contracts.go
@@ -2408,6 +2408,19 @@ func (e *EthereumMercuryFeeManager) Address() common.Address {
return e.address
}
+func (e *EthereumMercuryFeeManager) UpdateSubscriberDiscount(subscriber common.Address, feedId [32]byte, token common.Address, discount uint64) (*types.Transaction, error) {
+ opts, err := e.client.TransactionOpts(e.client.GetDefaultWallet())
+ if err != nil {
+ return nil, err
+ }
+ tx, err := e.instance.UpdateSubscriberDiscount(opts, subscriber, feedId, token, discount)
+ e.l.Info().Err(err).Msg("Called EthereumMercuryFeeManager.UpdateSubscriberDiscount()")
+ if err != nil {
+ return nil, err
+ }
+ return tx, e.client.ProcessTransaction(tx)
+}
+
type EthereumMercuryRewardManager struct {
address common.Address
client blockchain.EVMClient
diff --git a/integration-tests/contracts/ethereum_vrf_contracts.go b/integration-tests/contracts/ethereum_vrf_contracts.go
index 427ac4ccbf8..ea8a4f94817 100644
--- a/integration-tests/contracts/ethereum_vrf_contracts.go
+++ b/integration-tests/contracts/ethereum_vrf_contracts.go
@@ -134,6 +134,18 @@ func (v *EthereumBlockhashStore) Address() string {
return v.address.Hex()
}
+func (v *EthereumBlockhashStore) GetBlockHash(ctx context.Context, blockNumber *big.Int) ([32]byte, error) {
+ opts := &bind.CallOpts{
+ From: common.HexToAddress(v.client.GetDefaultWallet().Address()),
+ Context: ctx,
+ }
+ blockHash, err := v.blockHashStore.GetBlockhash(opts, blockNumber)
+ if err != nil {
+ return [32]byte{}, err
+ }
+ return blockHash, nil
+}
+
func (v *EthereumVRFCoordinator) Address() string {
return v.address.Hex()
}
diff --git a/integration-tests/contracts/ethereum_vrfv2plus_contracts.go b/integration-tests/contracts/ethereum_vrfv2plus_contracts.go
index 31c7f1e4f42..d8a5b30c703 100644
--- a/integration-tests/contracts/ethereum_vrfv2plus_contracts.go
+++ b/integration-tests/contracts/ethereum_vrfv2plus_contracts.go
@@ -210,7 +210,16 @@ func (v *EthereumVRFCoordinatorV2_5) WithdrawNative(recipient common.Address) er
return v.client.ProcessTransaction(tx)
}
-func (v *EthereumVRFCoordinatorV2_5) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig vrf_coordinator_v2_5.VRFCoordinatorV25FeeConfig) error {
+func (v *EthereumVRFCoordinatorV2_5) SetConfig(
+ minimumRequestConfirmations uint16,
+ maxGasLimit uint32,
+ stalenessSeconds uint32,
+ gasAfterPaymentCalculation uint32,
+ fallbackWeiPerUnitLink *big.Int,
+ fulfillmentFlatFeeNativePPM uint32,
+ fulfillmentFlatFeeLinkDiscountPPM uint32,
+ nativePremiumPercentage uint8,
+ linkPremiumPercentage uint8) error {
opts, err := v.client.TransactionOpts(v.client.GetDefaultWallet())
if err != nil {
return err
@@ -222,7 +231,10 @@ func (v *EthereumVRFCoordinatorV2_5) SetConfig(minimumRequestConfirmations uint1
stalenessSeconds,
gasAfterPaymentCalculation,
fallbackWeiPerUnitLink,
- feeConfig,
+ fulfillmentFlatFeeNativePPM,
+ fulfillmentFlatFeeLinkDiscountPPM,
+ nativePremiumPercentage,
+ linkPremiumPercentage,
)
if err != nil {
return err
@@ -248,12 +260,13 @@ func (v *EthereumVRFCoordinatorV2_5) SetLINKAndLINKNativeFeed(linkAddress string
func (v *EthereumVRFCoordinatorV2_5) RegisterProvingKey(
publicProvingKey [2]*big.Int,
+ gasLaneMaxGas uint64,
) error {
opts, err := v.client.TransactionOpts(v.client.GetDefaultWallet())
if err != nil {
return err
}
- tx, err := v.coordinator.RegisterProvingKey(opts, publicProvingKey)
+ tx, err := v.coordinator.RegisterProvingKey(opts, publicProvingKey, gasLaneMaxGas)
if err != nil {
return err
}
@@ -598,7 +611,16 @@ func (v *EthereumVRFCoordinatorV2PlusUpgradedVersion) GetSubscription(ctx contex
return subscription, nil
}
-func (v *EthereumVRFCoordinatorV2PlusUpgradedVersion) SetConfig(minimumRequestConfirmations uint16, maxGasLimit uint32, stalenessSeconds uint32, gasAfterPaymentCalculation uint32, fallbackWeiPerUnitLink *big.Int, feeConfig vrf_v2plus_upgraded_version.VRFCoordinatorV2PlusUpgradedVersionFeeConfig) error {
+func (v *EthereumVRFCoordinatorV2PlusUpgradedVersion) SetConfig(
+ minimumRequestConfirmations uint16,
+ maxGasLimit uint32,
+ stalenessSeconds uint32,
+ gasAfterPaymentCalculation uint32,
+ fallbackWeiPerUnitLink *big.Int,
+ fulfillmentFlatFeeNativePPM uint32,
+ fulfillmentFlatFeeLinkDiscountPPM uint32,
+ nativePremiumPercentage uint8,
+ linkPremiumPercentage uint8) error {
opts, err := v.client.TransactionOpts(v.client.GetDefaultWallet())
if err != nil {
return err
@@ -610,7 +632,10 @@ func (v *EthereumVRFCoordinatorV2PlusUpgradedVersion) SetConfig(minimumRequestCo
stalenessSeconds,
gasAfterPaymentCalculation,
fallbackWeiPerUnitLink,
- feeConfig,
+ fulfillmentFlatFeeNativePPM,
+ fulfillmentFlatFeeLinkDiscountPPM,
+ nativePremiumPercentage,
+ linkPremiumPercentage,
)
if err != nil {
return err
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index 36ce802621d..366594098ec 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -6,7 +6,7 @@ go 1.21.4
replace github.com/smartcontractkit/chainlink/v2 => ../
require (
- github.com/K-Phoen/grabana v0.21.17
+ github.com/K-Phoen/grabana v0.22.1
github.com/barkimedes/go-deepcopy v0.0.0-20220514131651-17c30cfc62df
github.com/cli/go-gh/v2 v2.0.0
github.com/ethereum/go-ethereum v1.13.8
@@ -24,14 +24,14 @@ require (
github.com/segmentio/ksuid v1.0.4
github.com/slack-go/slack v0.12.2
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429
- github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa
+ github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4
github.com/smartcontractkit/chainlink-testing-framework v1.23.2
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
github.com/smartcontractkit/libocr v0.0.0-20240112202000-6359502d2ff1
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1
- github.com/smartcontractkit/wasp v0.4.1
- github.com/spf13/cobra v1.6.1
+ github.com/smartcontractkit/wasp v0.4.2
+ github.com/spf13/cobra v1.8.0
github.com/stretchr/testify v1.8.4
github.com/test-go/testify v1.1.4
github.com/testcontainers/testcontainers-go v0.23.0
@@ -39,7 +39,7 @@ require (
go.dedis.ch/kyber/v3 v3.1.0
go.uber.org/ratelimit v0.2.0
go.uber.org/zap v1.26.0
- golang.org/x/sync v0.5.0
+ golang.org/x/sync v0.6.0
golang.org/x/text v0.14.0
gopkg.in/guregu/null.v4 v4.0.0
)
@@ -76,7 +76,7 @@ require (
github.com/CosmWasm/wasmd v0.40.1 // indirect
github.com/CosmWasm/wasmvm v1.2.4 // indirect
github.com/DataDog/zstd v1.5.2 // indirect
- github.com/K-Phoen/sdk v0.12.2 // indirect
+ github.com/K-Phoen/sdk v0.12.4 // indirect
github.com/MakeNowJust/heredoc v1.0.0 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/semver/v3 v3.2.1 // indirect
@@ -256,14 +256,14 @@ require (
github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
github.com/hashicorp/go-msgpack v0.5.5 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
- github.com/hashicorp/go-plugin v1.5.2 // indirect
+ github.com/hashicorp/go-plugin v1.6.0 // indirect
github.com/hashicorp/go-rootcerts v1.0.2 // indirect
github.com/hashicorp/go-sockaddr v1.0.2 // indirect
github.com/hashicorp/golang-lru v0.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hashicorp/memberlist v0.5.0 // indirect
github.com/hashicorp/serf v0.10.1 // indirect
- github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce // indirect
+ github.com/hashicorp/yamux v0.1.1 // indirect
github.com/hdevalence/ed25519consensus v0.1.0 // indirect
github.com/holiman/bloomfilter/v2 v2.0.3 // indirect
github.com/holiman/uint256 v1.2.4 // indirect
@@ -283,6 +283,7 @@ require (
github.com/jackpal/go-nat-pmp v1.0.2 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/jmhodges/levigo v1.0.0 // indirect
+ github.com/jonboulle/clockwork v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/jpillora/backoff v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
@@ -368,11 +369,11 @@ require (
github.com/shopspring/decimal v1.3.1 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704 // indirect
- github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0 // indirect
- github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1 // indirect
+ github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8 // indirect
+ github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336 // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8 // indirect
- github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba // indirect
- github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007 // indirect
+ github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0 // indirect
+ github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0 // indirect
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 // indirect
github.com/smartcontractkit/wsrpc v0.7.2 // indirect
github.com/soheilhy/cmux v0.1.5 // indirect
@@ -432,16 +433,16 @@ require (
go.uber.org/goleak v1.3.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect
- golang.org/x/arch v0.6.0 // indirect
- golang.org/x/crypto v0.17.0 // indirect
- golang.org/x/exp v0.0.0-20231127185646-65229373498e // indirect
- golang.org/x/mod v0.14.0 // indirect
- golang.org/x/net v0.19.0 // indirect
- golang.org/x/oauth2 v0.15.0 // indirect
- golang.org/x/sys v0.15.0 // indirect
- golang.org/x/term v0.15.0 // indirect
+ golang.org/x/arch v0.7.0 // indirect
+ golang.org/x/crypto v0.19.0 // indirect
+ golang.org/x/exp v0.0.0-20240213143201-ec583247a57a // indirect
+ golang.org/x/mod v0.15.0 // indirect
+ golang.org/x/net v0.21.0 // indirect
+ golang.org/x/oauth2 v0.17.0 // indirect
+ golang.org/x/sys v0.17.0 // indirect
+ golang.org/x/term v0.17.0 // indirect
golang.org/x/time v0.5.0 // indirect
- golang.org/x/tools v0.16.0 // indirect
+ golang.org/x/tools v0.18.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
gonum.org/v1/gonum v0.14.0 // indirect
google.golang.org/appengine v1.6.8 // indirect
@@ -449,7 +450,7 @@ require (
google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
google.golang.org/grpc v1.59.0 // indirect
- google.golang.org/protobuf v1.31.0 // indirect
+ google.golang.org/protobuf v1.32.0 // indirect
gopkg.in/guregu/null.v2 v2.1.2 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
@@ -484,7 +485,7 @@ replace (
github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1
// until merged upstream: https://github.com/hashicorp/go-plugin/pull/257
- github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306
+ github.com/hashicorp/go-plugin => github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16
// until merged upstream: https://github.com/mwitkow/grpc-proxy/pull/69
github.com/mwitkow/grpc-proxy => github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index 3a7652dc967..df94da9318d 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -130,10 +130,10 @@ github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtix
github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM=
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
-github.com/K-Phoen/grabana v0.21.17 h1:mO/9DvJWC/qpTF/X5jQDm5eKgCBaCGypP/tEfXAvKfg=
-github.com/K-Phoen/grabana v0.21.17/go.mod h1:vbASQt9UiQhX4lC3/opLpJMJ8m+hsTUU2FwkQMytHK4=
-github.com/K-Phoen/sdk v0.12.2 h1:0QofDlKE+lloyBOzhjEEMW21061zts/WIpfpQ5NLLAs=
-github.com/K-Phoen/sdk v0.12.2/go.mod h1:qmM0wO23CtoDux528MXPpYvS4XkRWkWX6rvX9Za8EVU=
+github.com/K-Phoen/grabana v0.22.1 h1:b/O+C3H2H6VNYSeMCYUO4X4wYuwFXgBcRkvYa+fjpQA=
+github.com/K-Phoen/grabana v0.22.1/go.mod h1:3LTXrTzQzTKTgvKSXdRjlsJbizSOW/V23Q3iX00R5bU=
+github.com/K-Phoen/sdk v0.12.4 h1:j2EYuBJm3zDTD0fGKACVFWxAXtkR0q5QzfVqxmHSeGQ=
+github.com/K-Phoen/sdk v0.12.4/go.mod h1:qmM0wO23CtoDux528MXPpYvS4XkRWkWX6rvX9Za8EVU=
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
@@ -381,8 +381,8 @@ github.com/cpuguy83/dockercfg v0.3.1/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHf
github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk=
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
-github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
-github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
+github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ=
github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs=
github.com/crate-crypto/go-kzg-4844 v0.7.0 h1:C0vgZRk4q4EZ/JgPfzuSoxdCq3C3mOZMBShovmncxvA=
@@ -960,8 +960,8 @@ github.com/hashicorp/nomad/api v0.0.0-20230718173136-3a687930bd3e/go.mod h1:O23q
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY=
github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4=
-github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce h1:7UnVY3T/ZnHUrfviiAgIUjg2PXxsQfs5bphsG8F7Keo=
-github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
+github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
+github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
github.com/hdevalence/ed25519consensus v0.1.0 h1:jtBwzzcHuTmFrQN6xQZn6CQEO/V9f7HsjsjeEZ6auqU=
github.com/hdevalence/ed25519consensus v0.1.0/go.mod h1:w3BHWjwJbFU29IRHL1Iqkw3sus+7FctEyM4RqDxYNzo=
github.com/henvic/httpretty v0.0.6 h1:JdzGzKZBajBfnvlMALXXMVQWxWMF/ofTy8C3/OSUTxs=
@@ -994,7 +994,6 @@ github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/C
github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ=
github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
github.com/ionos-cloud/sdk-go/v6 v6.1.8 h1:493wE/BkZxJf7x79UCE0cYGPZoqQcPiEBALvt7uVGY0=
@@ -1071,6 +1070,8 @@ github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqx
github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg=
github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
+github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
@@ -1502,24 +1503,24 @@ github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704 h1:T3lFWumv
github.com/smartcontractkit/caigo v0.0.0-20230621050857-b29a4ca8c704/go.mod h1:2QuJdEouTWjh5BDy5o/vgGXQtR4Gz8yH1IYB5eT7u4M=
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429 h1:xkejUBZhcBpBrTSfxc91Iwzadrb6SXw8ks69bHIQ9Ww=
github.com/smartcontractkit/chainlink-automation v1.0.2-0.20240118014648-1ab6a88c9429/go.mod h1:wJmVvDf4XSjsahWtfUq3wvIAYEAuhr7oxmxYnEL/LGQ=
-github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa h1:9g7e1C3295ALDK8Gs42fIKSSJfI+H1RoBmivGWTvIZo=
-github.com/smartcontractkit/chainlink-common v0.1.7-0.20240124161023-948579cbaffa/go.mod h1:05rRF84QKlIOF5LfTBPkHdw4UpBI2G3zxRcuZ65bPjk=
-github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0 h1:NALwENz6vQ972DuD9AZjqRjyNSxH9ptNapizQGLI+2s=
-github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240120192246-4bb04c997ca0/go.mod h1:NcVAT/GETDBvIoAej5K6OYqAtDOkF6vO5pYw/hLuYVU=
-github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1 h1:xYqRgZO0nMSO8CBCMR0r3WA+LZ4kNL8a6bnbyk/oBtQ=
-github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1/go.mod h1:GuPvyXryvbiUZIHmPeLBz4L+yJKeyGUjrDfd1KNne+o=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4 h1:Yk0RK9WV59ISOZZMsdtxZBAKaBfdgb05oXyca/qSqcw=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240213113935-001c2f4befd4/go.mod h1:pRlQrvcizMmuHAUV4N96oO2e3XbA99JCQELLc6ES160=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8 h1:I326nw5GwHQHsLKHwtu5Sb9EBLylC8CfUd7BFAS0jtg=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240213120401-01a23955f9f8/go.mod h1:a65NtrK4xZb01mf0dDNghPkN2wXgcqFQ55ADthVBgMc=
+github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336 h1:j00D0/EqE9HRu+63v7KwUOe4ZxLc4AN5SOJFiinkkH0=
+github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240214203158-47dae5de1336/go.mod h1:umLyYLRGqyIuFfGpEREZP3So6+O8iL35cCCqW+OxX5w=
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8 h1:1BcjXuviSAKttOX7BZoVHRZZGfxqoA2+AL8tykmkdoc=
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240119021347-3c541a78cdb8/go.mod h1:vy1L7NybTy2F/Yv7BOh+oZBa1MACD6gzd1+DkcSkfp8=
-github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba h1:6rnQrD8NaLfLOPHszW1hbpviqpU8011gzdZk6wKP1xY=
-github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240122152632-38444d2ad8ba/go.mod h1:OZfzyayUdwsVBqxvbEMqwUntQT8HbFbgyqoudvwfVN0=
-github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007 h1:KwB0H2P/gxJgt823Ku1fTcFLDKMj6zsP3wbQGlBOm4U=
-github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240119162652-3a7274645007/go.mod h1:EbZAlb/2K6mKr26u3+3cLBe/caJaqCHw786On94C43g=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0 h1:9IxmR+1NH1WxaX44+t553fOrrZRfxwMVvnDuBIy0tgs=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240213161921-c4d342b761b0/go.mod h1:JiykN+8W5TA4UD2ClrzQCVvcH3NcyLEVv7RwY0busrw=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0 h1:7m9PVtccb8/pvKTXMaGuyceFno1icRyC2SFH7KG7+70=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240213121419-1272736c2ac0/go.mod h1:SZ899lZYQ0maUulWbZg+SWqabHQ1wTbyk3jT8wJfyo8=
github.com/smartcontractkit/chainlink-testing-framework v1.23.2 h1:haXPd9Pg++Zs5/QIZnhFd9RElmz/d0+4nNeletUg9ZM=
github.com/smartcontractkit/chainlink-testing-framework v1.23.2/go.mod h1:StIOdxvwd8AMO6xuBtmD6FQfJXktEn/mJJEr7728BTc=
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868 h1:FFdvEzlYwcuVHkdZ8YnZR/XomeMGbz5E2F2HZI3I3w8=
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868/go.mod h1:Kn1Hape05UzFZ7bOUnm3GVsHzP0TNrVmpfXYNHdqGGs=
-github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306 h1:ko88+ZznniNJZbZPWAvHQU8SwKAdHngdDZ+pvVgB5ss=
-github.com/smartcontractkit/go-plugin v0.0.0-20231003134350-e49dad63b306/go.mod h1:w1sAEES3g3PuV/RzUrgow20W2uErMly84hhD3um1WL4=
+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=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0=
github.com/smartcontractkit/libocr v0.0.0-20240112202000-6359502d2ff1 h1:3y9WsXkZ5lxFrmfH7DQHs/q308lylKId5l/3VC0QAdM=
@@ -1528,8 +1529,8 @@ github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-
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=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1/go.mod h1:G5Sd/yzHWf26rQ+X0nG9E0buKPqRGPMJAfk2gwCzOOw=
-github.com/smartcontractkit/wasp v0.4.1 h1:qgIx2s+eCwH0OaBKaHEAHUQ1Z47bAgDu+ICS9IOqvGQ=
-github.com/smartcontractkit/wasp v0.4.1/go.mod h1:3qiofyI3pkbrc48a3CVshbMfgl74SiuPL/tm30d9Wb4=
+github.com/smartcontractkit/wasp v0.4.2 h1:MPErzwcOW84MKnA6/BjMnlsspQ0681XfoanGsJHOI7c=
+github.com/smartcontractkit/wasp v0.4.2/go.mod h1:eVhBVLbVv0qORUlN7aR5C4aTN/lTYO3KnN1erO4ROOI=
github.com/smartcontractkit/wsrpc v0.7.2 h1:iBXzMeg7vc5YoezIQBq896y25BARw7OKbhrb6vPbtRQ=
github.com/smartcontractkit/wsrpc v0.7.2/go.mod h1:sj7QX2NQibhkhxTfs3KOhAj/5xwgqMipTvJVSssT9i0=
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
@@ -1552,8 +1553,8 @@ github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cA
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
-github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA=
-github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY=
+github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0=
+github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho=
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
@@ -1790,8 +1791,8 @@ go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
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.6.0 h1:S0JTfE48HbRj80+4tbvZDYsJ3tGv6BUU3XxyZ7CirAc=
-golang.org/x/arch v0.6.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
+golang.org/x/arch v0.7.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=
@@ -1824,8 +1825,8 @@ golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0
golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -1836,8 +1837,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-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No=
-golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
+golang.org/x/exp v0.0.0-20240213143201-ec583247a57a h1:HinSgX1tJRX3KsL//Gxynpw5CTOAIPhgL4W8PNiIpVE=
+golang.org/x/exp v0.0.0-20240213143201-ec583247a57a/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc=
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=
@@ -1865,8 +1866,8 @@ golang.org/x/mod v0.4.1/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.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0=
-golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
+golang.org/x/mod v0.15.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=
@@ -1932,8 +1933,8 @@ golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
-golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
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=
@@ -1945,8 +1946,8 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ
golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
-golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
-golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
+golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ=
+golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA=
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=
@@ -1961,8 +1962,8 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
-golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -2064,8 +2065,9 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
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.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/sys v0.17.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=
@@ -2075,8 +2077,8 @@ golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
-golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4=
-golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0=
+golang.org/x/term v0.17.0 h1:mkTF7LCd6WGJNL3K1Ad7kwxNfYAW6a8a8QqtMblp/4U=
+golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -2170,8 +2172,8 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
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.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM=
-golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0=
+golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ=
+golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg=
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=
@@ -2310,8 +2312,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
-google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
-google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.32.0 h1:pPC6BG5ex8PDFnkbrGU3EixyhKcQ2aDuBS36lqK/C7I=
+google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
diff --git a/integration-tests/load/ocr/vu.go b/integration-tests/load/ocr/vu.go
index d113f7eb3f9..bd733b08ae5 100644
--- a/integration-tests/load/ocr/vu.go
+++ b/integration-tests/load/ocr/vu.go
@@ -22,6 +22,7 @@ import (
// VU is a virtual user for the OCR load test
// it creates a feed and triggers new rounds
type VU struct {
+ *wasp.VUControl
rl ratelimit.Limiter
rate int
rateUnit time.Duration
@@ -34,7 +35,6 @@ type VU struct {
msClient *client2.MockserverClient
l zerolog.Logger
ocrInstances []contracts.OffchainAggregator
- stop chan struct{}
}
func NewVU(
@@ -49,6 +49,7 @@ func NewVU(
msClient *client2.MockserverClient,
) *VU {
return &VU{
+ VUControl: wasp.NewVUControl(),
rl: ratelimit.New(rate, ratelimit.Per(rateUnit)),
rate: rate,
rateUnit: rateUnit,
@@ -64,7 +65,7 @@ func NewVU(
func (m *VU) Clone(_ *wasp.Generator) wasp.VirtualUser {
return &VU{
- stop: make(chan struct{}, 1),
+ VUControl: wasp.NewVUControl(),
rl: ratelimit.New(m.rate, ratelimit.Per(m.rateUnit)),
rate: m.rate,
rateUnit: m.rateUnit,
@@ -119,11 +120,3 @@ func (m *VU) Call(l *wasp.Generator) {
}
}
}
-
-func (m *VU) Stop(_ *wasp.Generator) {
- m.stop <- struct{}{}
-}
-
-func (m *VU) StopChan() chan struct{} {
- return m.stop
-}
diff --git a/integration-tests/load/vrfv2/gun.go b/integration-tests/load/vrfv2/gun.go
index 4746c73081a..9bf34f70b92 100644
--- a/integration-tests/load/vrfv2/gun.go
+++ b/integration-tests/load/vrfv2/gun.go
@@ -6,6 +6,7 @@ import (
"github.com/rs/zerolog"
"github.com/smartcontractkit/wasp"
+ vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
"github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/vrfv2"
"github.com/smartcontractkit/chainlink/integration-tests/types"
)
@@ -13,7 +14,7 @@ import (
/* SingleHashGun is a gun that constantly requests randomness for one feed */
type SingleHashGun struct {
- contracts *vrfv2.VRFV2Contracts
+ contracts *vrfcommon.VRFContracts
keyHash [32]byte
subIDs []uint64
testConfig types.VRFv2TestConfig
@@ -21,7 +22,7 @@ type SingleHashGun struct {
}
func NewSingleHashGun(
- contracts *vrfv2.VRFV2Contracts,
+ contracts *vrfcommon.VRFContracts,
keyHash [32]byte,
subIDs []uint64,
testConfig types.VRFv2TestConfig,
@@ -46,11 +47,11 @@ func (m *SingleHashGun) Call(_ *wasp.Generator) *wasp.Response {
_, err := vrfv2.RequestRandomnessAndWaitForFulfillment(
m.logger,
//the same consumer is used for all requests and in all subs
- m.contracts.LoadTestConsumers[0],
- m.contracts.Coordinator,
+ m.contracts.VRFV2Consumer[0],
+ m.contracts.CoordinatorV2,
//randomly pick a subID from pool of subIDs
m.subIDs[randInRange(0, len(m.subIDs)-1)],
- &vrfv2.VRFV2Data{VRFV2KeyData: vrfv2.VRFV2KeyData{KeyHash: m.keyHash}},
+ &vrfcommon.VRFKeyData{KeyHash: m.keyHash},
*vrfv2Config.MinimumConfirmations,
*vrfv2Config.CallbackGasLimit,
*vrfv2Config.NumberOfWords,
diff --git a/integration-tests/load/vrfv2/vrfv2_test.go b/integration-tests/load/vrfv2/vrfv2_test.go
index 3a29e729dea..5eae49058cb 100644
--- a/integration-tests/load/vrfv2/vrfv2_test.go
+++ b/integration-tests/load/vrfv2/vrfv2_test.go
@@ -16,6 +16,7 @@ import (
"github.com/smartcontractkit/chainlink-testing-framework/logging"
"github.com/smartcontractkit/chainlink-testing-framework/utils/conversions"
"github.com/smartcontractkit/chainlink/integration-tests/actions"
+ vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
"github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/vrfv2"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
@@ -29,8 +30,8 @@ import (
var (
env *test_env.CLClusterTestEnv
- vrfv2Contracts *vrfv2.VRFV2Contracts
- vrfv2Data *vrfv2.VRFV2Data
+ vrfContracts *vrfcommon.VRFContracts
+ vrfKeyData *vrfcommon.VRFKeyData
subIDs []uint64
eoaWalletAddress string
@@ -87,7 +88,7 @@ func TestVRFV2Performance(t *testing.T) {
WithTestConfig(&testConfig).
WithCustomCleanup(
func() {
- teardown(t, vrfv2Contracts.LoadTestConsumers[0], lc, updatedLabels, testReporter, string(testType), &testConfig)
+ teardown(t, vrfContracts.VRFV2Consumer[0], lc, updatedLabels, testReporter, string(testType), &testConfig)
if env.EVMClient.NetworkSimulated() {
l.Info().
Str("Network Name", env.EVMClient.GetNetworkName()).
@@ -113,7 +114,7 @@ func TestVRFV2Performance(t *testing.T) {
consumers, err = vrfv2.DeployVRFV2Consumers(env.ContractDeployer, coordinator.Address(), 1)
require.NoError(t, err)
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
l.Info().
Str("Coordinator", *cfg.ExistingEnvConfig.CoordinatorAddress).
Int("Number of Subs to create", *vrfv2Config.General.NumberOfSubToCreate).
@@ -137,21 +138,16 @@ func TestVRFV2Performance(t *testing.T) {
err = FundNodesIfNeeded(&testConfig, env.EVMClient, l)
require.NoError(t, err)
- vrfv2Contracts = &vrfv2.VRFV2Contracts{
- Coordinator: coordinator,
- LoadTestConsumers: consumers,
- BHS: nil,
+ vrfContracts = &vrfcommon.VRFContracts{
+ CoordinatorV2: coordinator,
+ VRFV2Consumer: consumers,
+ BHS: nil,
}
- vrfv2Data = &vrfv2.VRFV2Data{
- VRFV2KeyData: vrfv2.VRFV2KeyData{
- VRFKey: nil,
- EncodedProvingKey: [2]*big.Int{},
- KeyHash: common.HexToHash(*vrfv2Config.Performance.KeyHash),
- },
- VRFJob: nil,
- PrimaryEthAddress: "",
- ChainID: nil,
+ vrfKeyData = &vrfcommon.VRFKeyData{
+ VRFKey: nil,
+ EncodedProvingKey: [2]*big.Int{},
+ KeyHash: common.HexToHash(*vrfv2Config.Performance.KeyHash),
}
} else {
@@ -169,7 +165,7 @@ func TestVRFV2Performance(t *testing.T) {
WithFunding(big.NewFloat(*testConfig.Common.ChainlinkNodeFunding)).
WithCustomCleanup(
func() {
- teardown(t, vrfv2Contracts.LoadTestConsumers[0], lc, updatedLabels, testReporter, string(testType), &testConfig)
+ teardown(t, vrfContracts.VRFV2Consumer[0], lc, updatedLabels, testReporter, string(testType), &testConfig)
if env.EVMClient.NetworkSimulated() {
l.Info().
@@ -200,8 +196,9 @@ func TestVRFV2Performance(t *testing.T) {
useVRFOwner := true
useTestCoordinator := true
- vrfv2Contracts, subIDs, vrfv2Data, err = vrfv2.SetupVRFV2Environment(
+ vrfContracts, subIDs, vrfKeyData, _, err = vrfv2.SetupVRFV2Environment(
env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
&testConfig,
useVRFOwner,
useTestCoordinator,
@@ -220,9 +217,9 @@ func TestVRFV2Performance(t *testing.T) {
l.Debug().Int("Number of Subs", len(subIDs)).Msg("Subs involved in the test")
for _, subID := range subIDs {
- subscription, err := vrfv2Contracts.Coordinator.GetSubscription(context.Background(), subID)
+ subscription, err := vrfContracts.CoordinatorV2.GetSubscription(context.Background(), subID)
require.NoError(t, err, "error getting subscription information for subscription %d", subID)
- vrfv2.LogSubDetails(l, subscription, subID, vrfv2Contracts.Coordinator)
+ vrfv2.LogSubDetails(l, subscription, subID, vrfContracts.CoordinatorV2)
}
singleFeedConfig := &wasp.Config{
@@ -231,8 +228,8 @@ func TestVRFV2Performance(t *testing.T) {
GenName: "gun",
RateLimitUnitDuration: vrfv2Config.Performance.RateLimitUnitDuration.Duration,
Gun: NewSingleHashGun(
- vrfv2Contracts,
- vrfv2Data.KeyHash,
+ vrfContracts,
+ vrfKeyData.KeyHash,
subIDs,
&testConfig,
l,
@@ -241,8 +238,8 @@ func TestVRFV2Performance(t *testing.T) {
LokiConfig: lokiConfig,
CallTimeout: 2 * time.Minute,
}
- require.Len(t, vrfv2Contracts.LoadTestConsumers, 1, "only one consumer should be created for Load Test")
- consumer := vrfv2Contracts.LoadTestConsumers[0]
+ require.Len(t, vrfContracts.VRFV2Consumer, 1, "only one consumer should be created for Load Test")
+ consumer := vrfContracts.VRFV2Consumer[0]
err = consumer.ResetMetrics()
require.NoError(t, err)
MonitorLoadStats(lc, consumer, updatedLabels)
@@ -280,12 +277,12 @@ func cancelSubsAndReturnFunds(subIDs []uint64, l zerolog.Logger) {
Uint64("Returning funds from SubID", subID).
Str("Returning funds to", eoaWalletAddress).
Msg("Canceling subscription and returning funds to subscription owner")
- pendingRequestsExist, err := vrfv2Contracts.Coordinator.PendingRequestsExist(context.Background(), subID)
+ pendingRequestsExist, err := vrfContracts.CoordinatorV2.PendingRequestsExist(context.Background(), subID)
if err != nil {
l.Error().Err(err).Msg("Error checking if pending requests exist")
}
if !pendingRequestsExist {
- _, err := vrfv2Contracts.Coordinator.CancelSubscription(subID, common.HexToAddress(eoaWalletAddress))
+ _, err := vrfContracts.CoordinatorV2.CancelSubscription(subID, common.HexToAddress(eoaWalletAddress))
if err != nil {
l.Error().Err(err).Msg("Error canceling subscription")
}
diff --git a/integration-tests/load/vrfv2plus/gun.go b/integration-tests/load/vrfv2plus/gun.go
index faf5e6ef211..bfd8ff868b5 100644
--- a/integration-tests/load/vrfv2plus/gun.go
+++ b/integration-tests/load/vrfv2plus/gun.go
@@ -8,6 +8,7 @@ import (
"github.com/rs/zerolog"
"github.com/smartcontractkit/wasp"
+ vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
"github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/vrfv2plus"
vrfv2plus_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/vrfv2plus"
"github.com/smartcontractkit/chainlink/integration-tests/types"
@@ -16,7 +17,7 @@ import (
/* SingleHashGun is a gun that constantly requests randomness for one feed */
type SingleHashGun struct {
- contracts *vrfv2plus.VRFV2_5Contracts
+ contracts *vrfcommon.VRFContracts
keyHash [32]byte
subIDs []*big.Int
testConfig types.VRFv2PlusTestConfig
@@ -24,7 +25,7 @@ type SingleHashGun struct {
}
func NewSingleHashGun(
- contracts *vrfv2plus.VRFV2_5Contracts,
+ contracts *vrfcommon.VRFContracts,
keyHash [32]byte,
subIDs []*big.Int,
testConfig types.VRFv2PlusTestConfig,
@@ -52,9 +53,9 @@ func (m *SingleHashGun) Call(_ *wasp.Generator) *wasp.Response {
randomnessRequestCountPerRequest := deviateValue(*m.testConfig.GetVRFv2PlusConfig().General.RandomnessRequestCountPerRequest, *m.testConfig.GetVRFv2PlusConfig().General.RandomnessRequestCountPerRequestDeviation)
_, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment(
//the same consumer is used for all requests and in all subs
- m.contracts.LoadTestConsumers[0],
- m.contracts.Coordinator,
- &vrfv2plus.VRFV2PlusData{VRFV2PlusKeyData: vrfv2plus.VRFV2PlusKeyData{KeyHash: m.keyHash}},
+ m.contracts.VRFV2PlusConsumer[0],
+ m.contracts.CoordinatorV2Plus,
+ &vrfcommon.VRFKeyData{KeyHash: m.keyHash},
//randomly pick a subID from pool of subIDs
m.subIDs[randInRange(0, len(m.subIDs)-1)],
//randomly pick payment type
diff --git a/integration-tests/load/vrfv2plus/vrfv2plus_test.go b/integration-tests/load/vrfv2plus/vrfv2plus_test.go
index 51a3116dca2..877c5b3d1b7 100644
--- a/integration-tests/load/vrfv2plus/vrfv2plus_test.go
+++ b/integration-tests/load/vrfv2plus/vrfv2plus_test.go
@@ -21,6 +21,7 @@ import (
"github.com/smartcontractkit/chainlink/integration-tests/testreporters"
"github.com/smartcontractkit/chainlink/integration-tests/actions"
+ vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
"github.com/smartcontractkit/chainlink/integration-tests/contracts"
"github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"
@@ -29,11 +30,11 @@ import (
)
var (
- env *test_env.CLClusterTestEnv
- vrfv2PlusContracts *vrfv2plus.VRFV2_5Contracts
- vrfv2PlusData *vrfv2plus.VRFV2PlusData
- subIDs []*big.Int
- eoaWalletAddress string
+ env *test_env.CLClusterTestEnv
+ vrfContracts *vrfcommon.VRFContracts
+ vrfv2PlusData *vrfcommon.VRFKeyData
+ subIDs []*big.Int
+ eoaWalletAddress string
labels = map[string]string{
"branch": "vrfv2Plus_healthcheck",
@@ -86,7 +87,7 @@ func TestVRFV2PlusPerformance(t *testing.T) {
WithTestConfig(&testConfig).
WithCustomCleanup(
func() {
- teardown(t, vrfv2PlusContracts.LoadTestConsumers[0], lc, updatedLabels, testReporter, string(testType), &testConfig)
+ teardown(t, vrfContracts.VRFV2PlusConsumer[0], lc, updatedLabels, testReporter, string(testType), &testConfig)
if env.EVMClient.NetworkSimulated() {
l.Info().
Str("Network Name", env.EVMClient.GetNetworkName()).
@@ -112,7 +113,7 @@ func TestVRFV2PlusPerformance(t *testing.T) {
consumers, err = vrfv2plus.DeployVRFV2PlusConsumers(env.ContractDeployer, coordinator, 1)
require.NoError(t, err)
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2plus.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
l.Info().
Str("Coordinator", *vrfv2PlusConfig.Performance.CoordinatorAddress).
Int("Number of Subs to create", *vrfv2PlusConfig.General.NumberOfSubToCreate).
@@ -141,21 +142,16 @@ func TestVRFV2PlusPerformance(t *testing.T) {
err = FundNodesIfNeeded(&testConfig, env.EVMClient, l)
require.NoError(t, err)
- vrfv2PlusContracts = &vrfv2plus.VRFV2_5Contracts{
- Coordinator: coordinator,
- LoadTestConsumers: consumers,
+ vrfContracts = &vrfcommon.VRFContracts{
+ CoordinatorV2Plus: coordinator,
+ VRFV2PlusConsumer: consumers,
BHS: nil,
}
- vrfv2PlusData = &vrfv2plus.VRFV2PlusData{
- VRFV2PlusKeyData: vrfv2plus.VRFV2PlusKeyData{
- VRFKey: nil,
- EncodedProvingKey: [2]*big.Int{},
- KeyHash: common.HexToHash(*vrfv2PlusConfig.Performance.KeyHash),
- },
- VRFJob: nil,
- PrimaryEthAddress: "",
- ChainID: nil,
+ vrfv2PlusData = &vrfcommon.VRFKeyData{
+ VRFKey: nil,
+ EncodedProvingKey: [2]*big.Int{},
+ KeyHash: common.HexToHash(*vrfv2PlusConfig.Performance.KeyHash),
}
} else {
@@ -174,7 +170,7 @@ func TestVRFV2PlusPerformance(t *testing.T) {
WithFunding(big.NewFloat(*testConfig.Common.ChainlinkNodeFunding)).
WithCustomCleanup(
func() {
- teardown(t, vrfv2PlusContracts.LoadTestConsumers[0], lc, updatedLabels, testReporter, string(testType), &testConfig)
+ teardown(t, vrfContracts.VRFV2PlusConsumer[0], lc, updatedLabels, testReporter, string(testType), &testConfig)
if env.EVMClient.NetworkSimulated() {
l.Info().
@@ -202,8 +198,9 @@ func TestVRFV2PlusPerformance(t *testing.T) {
linkToken, err := actions.DeployLINKToken(env.ContractDeployer)
require.NoError(t, err, "error deploying LINK contract")
- vrfv2PlusContracts, subIDs, vrfv2PlusData, err = vrfv2plus.SetupVRFV2_5Environment(
+ vrfContracts, subIDs, vrfv2PlusData, _, err = vrfv2plus.SetupVRFV2_5Environment(
env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
&testConfig,
linkToken,
mockETHLinkFeed,
@@ -218,9 +215,9 @@ func TestVRFV2PlusPerformance(t *testing.T) {
l.Debug().Int("Number of Subs", len(subIDs)).Msg("Subs involved in the test")
for _, subID := range subIDs {
- subscription, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subID)
+ subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information for subscription %s", subID.String())
- vrfv2plus.LogSubDetails(l, subscription, subID, vrfv2PlusContracts.Coordinator)
+ vrfv2plus.LogSubDetails(l, subscription, subID, vrfContracts.CoordinatorV2Plus)
}
singleFeedConfig := &wasp.Config{
@@ -229,7 +226,7 @@ func TestVRFV2PlusPerformance(t *testing.T) {
GenName: "gun",
RateLimitUnitDuration: vrfv2PlusConfig.Performance.RateLimitUnitDuration.Duration,
Gun: NewSingleHashGun(
- vrfv2PlusContracts,
+ vrfContracts,
vrfv2PlusData.KeyHash,
subIDs,
&testConfig,
@@ -239,8 +236,8 @@ func TestVRFV2PlusPerformance(t *testing.T) {
LokiConfig: wasp.NewLokiConfig(cfgl.Endpoint, cfgl.TenantId, cfgl.BasicAuth, cfgl.BearerToken),
CallTimeout: 2 * time.Minute,
}
- require.Len(t, vrfv2PlusContracts.LoadTestConsumers, 1, "only one consumer should be created for Load Test")
- consumer := vrfv2PlusContracts.LoadTestConsumers[0]
+ require.Len(t, vrfContracts.VRFV2PlusConsumer, 1, "only one consumer should be created for Load Test")
+ consumer := vrfContracts.VRFV2PlusConsumer[0]
err = consumer.ResetMetrics()
require.NoError(t, err)
MonitorLoadStats(lc, consumer, updatedLabels)
@@ -277,12 +274,12 @@ func cancelSubsAndReturnFunds(subIDs []*big.Int, l zerolog.Logger) {
Str("Returning funds from SubID", subID.String()).
Str("Returning funds to", eoaWalletAddress).
Msg("Canceling subscription and returning funds to subscription owner")
- pendingRequestsExist, err := vrfv2PlusContracts.Coordinator.PendingRequestsExist(context.Background(), subID)
+ pendingRequestsExist, err := vrfContracts.CoordinatorV2Plus.PendingRequestsExist(context.Background(), subID)
if err != nil {
l.Error().Err(err).Msg("Error checking if pending requests exist")
}
if !pendingRequestsExist {
- _, err := vrfv2PlusContracts.Coordinator.CancelSubscription(subID, common.HexToAddress(eoaWalletAddress))
+ _, err := vrfContracts.CoordinatorV2Plus.CancelSubscription(subID, common.HexToAddress(eoaWalletAddress))
if err != nil {
l.Error().Err(err).Msg("Error canceling subscription")
}
diff --git a/integration-tests/scripts/entrypoint b/integration-tests/scripts/entrypoint
index 8797765ab2c..d4ebe722a1d 100755
--- a/integration-tests/scripts/entrypoint
+++ b/integration-tests/scripts/entrypoint
@@ -21,14 +21,17 @@ exit_code=$?
echo "Test exit code: ${exit_code}"
-# 3 is the code for an interrupted test, we only want to restart the test when the test is interrupted and in a state
-# that it can recover from. Otherwise we mark the test as "passed" as far as K8s is concerned so it doesn't restart it.
-if [ $exit_code -eq 3 ]; then
-echo "Test was interrupted, exiting with 1 exit code to trigger K8s to restart"
- exit 1 # Exiting with non-zero status to trigger pod restart
-else
- echo "Test either panicked or had some sort of failure. We're exiting with a non-zero exit code so that K8s doesn't restart the pod."
- echo "TEST_FAILED"
+# Check if the test did not pass (non-zero exit code)
+if [ $exit_code -ne 0 ]; then
+ # 3 is the code for an interrupted test, we only want to restart the test when the test is interrupted and in a state
+ # that it can recover from. Otherwise we mark the test as "passed" as far as K8s is concerned so it doesn't restart it.
+ if [ $exit_code -eq 3 ]; then
+ echo "Test was interrupted, exiting with 1 exit code to trigger K8s to restart"
+ exit 1 # Exiting with non-zero status to trigger pod restart
+ else
+ echo "Test either panicked or had some sort of failure. We're exiting with a non-zero exit code so that K8s doesn't restart the pod."
+ echo "TEST_FAILED"
+ fi
fi
# Sleep for the amount of time provided by the POST_RUN_SLEEP env var
@@ -44,4 +47,4 @@ if [ -n "${UPLOAD_MEM_PROFILE}" ]; then
fi
echo "Exiting with 0 exit code as test is either completed, or failed and cannot be restarted"
-exit 0
\ No newline at end of file
+exit 0
diff --git a/integration-tests/smoke/vrfv2_test.go b/integration-tests/smoke/vrfv2_test.go
index e4ff1600649..e0c304a3951 100644
--- a/integration-tests/smoke/vrfv2_test.go
+++ b/integration-tests/smoke/vrfv2_test.go
@@ -1,28 +1,32 @@
package smoke
import (
- "context"
+ "fmt"
"math/big"
+ "strings"
+ "sync"
"testing"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
+ "github.com/onsi/gomega"
"github.com/stretchr/testify/require"
commonassets "github.com/smartcontractkit/chainlink-common/pkg/assets"
- "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/vrfv2"
-
"github.com/smartcontractkit/chainlink-testing-framework/blockchain"
"github.com/smartcontractkit/chainlink-testing-framework/logging"
"github.com/smartcontractkit/chainlink-testing-framework/utils/conversions"
"github.com/smartcontractkit/chainlink-testing-framework/utils/ptr"
"github.com/smartcontractkit/chainlink-testing-framework/utils/testcontext"
-
"github.com/smartcontractkit/chainlink/integration-tests/actions"
+ vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
+ "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/vrfv2"
+ "github.com/smartcontractkit/chainlink/integration-tests/client"
"github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"
tc "github.com/smartcontractkit/chainlink/integration-tests/testconfig"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/blockhash_store"
)
func TestVRFv2Basic(t *testing.T) {
@@ -58,8 +62,9 @@ func TestVRFv2Basic(t *testing.T) {
defaultWalletAddress := env.EVMClient.GetDefaultWallet().Address()
numberOfTxKeysToCreate := 1
- vrfv2Contracts, subIDs, vrfv2Data, err := vrfv2.SetupVRFV2Environment(
+ vrfv2Contracts, subIDs, vrfv2KeyData, nodesMap, err := vrfv2.SetupVRFV2Environment(
env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
&config,
useVRFOwner,
useTestCoordinator,
@@ -75,25 +80,25 @@ func TestVRFv2Basic(t *testing.T) {
subID := subIDs[0]
- subscription, err := vrfv2Contracts.Coordinator.GetSubscription(context.Background(), subID)
+ subscription, err := vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
- vrfv2.LogSubDetails(l, subscription, subID, vrfv2Contracts.Coordinator)
+ vrfv2.LogSubDetails(l, subscription, subID, vrfv2Contracts.CoordinatorV2)
t.Run("Request Randomness", func(t *testing.T) {
configCopy := config.MustCopy().(tc.TestConfig)
subBalanceBeforeRequest := subscription.Balance
- jobRunsBeforeTest, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(vrfv2Data.VRFJob.Data.ID)
+ jobRunsBeforeTest, err := nodesMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodesMap[vrfcommon.VRF].Job.Data.ID)
require.NoError(t, err, "error reading job runs")
// test and assert
randomWordsFulfilledEvent, err := vrfv2.RequestRandomnessAndWaitForFulfillment(
l,
- vrfv2Contracts.LoadTestConsumers[0],
- vrfv2Contracts.Coordinator,
+ vrfv2Contracts.VRFV2Consumer[0],
+ vrfv2Contracts.CoordinatorV2,
subID,
- vrfv2Data,
+ vrfv2KeyData,
*configCopy.VRFv2.General.MinimumConfirmations,
*configCopy.VRFv2.General.CallbackGasLimit,
*configCopy.VRFv2.General.NumberOfWords,
@@ -104,16 +109,16 @@ func TestVRFv2Basic(t *testing.T) {
require.NoError(t, err, "error requesting randomness and waiting for fulfilment")
expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)
- subscription, err = vrfv2Contracts.Coordinator.GetSubscription(context.Background(), subID)
+ subscription, err = vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
subBalanceAfterRequest := subscription.Balance
require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest)
- jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(vrfv2Data.VRFJob.Data.ID)
+ jobRuns, err := nodesMap[vrfcommon.VRF].CLNode.API.MustReadRunsByJob(nodesMap[vrfcommon.VRF].Job.Data.ID)
require.NoError(t, err, "error reading job runs")
require.Equal(t, len(jobRunsBeforeTest.Data)+1, len(jobRuns.Data))
- status, err := vrfv2Contracts.LoadTestConsumers[0].GetRequestStatus(context.Background(), randomWordsFulfilledEvent.RequestId)
+ status, err := vrfv2Contracts.VRFV2Consumer[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)
require.NoError(t, err, "error getting rand request status")
require.True(t, status.Fulfilled)
l.Debug().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")
@@ -132,8 +137,8 @@ func TestVRFv2Basic(t *testing.T) {
&configCopy,
linkToken,
mockETHLinkFeed,
- vrfv2Contracts.Coordinator,
- vrfv2Data.KeyHash,
+ vrfv2Contracts.CoordinatorV2,
+ vrfv2KeyData.KeyHash,
1,
)
require.NoError(t, err)
@@ -142,7 +147,7 @@ func TestVRFv2Basic(t *testing.T) {
wrapperConsumerJuelsBalanceBeforeRequest, err := linkToken.BalanceOf(testcontext.Get(t), wrapperConsumer.Address())
require.NoError(t, err, "Error getting wrapper consumer balance")
- wrapperSubscription, err := vrfv2Contracts.Coordinator.GetSubscription(testcontext.Get(t), *wrapperSubID)
+ wrapperSubscription, err := vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID)
require.NoError(t, err, "Error getting subscription information")
subBalanceBeforeRequest := wrapperSubscription.Balance
@@ -150,9 +155,9 @@ func TestVRFv2Basic(t *testing.T) {
randomWordsFulfilledEvent, err := vrfv2.DirectFundingRequestRandomnessAndWaitForFulfillment(
l,
wrapperConsumer,
- vrfv2Contracts.Coordinator,
+ vrfv2Contracts.CoordinatorV2,
*wrapperSubID,
- vrfv2Data,
+ vrfv2KeyData,
*configCopy.VRFv2.General.MinimumConfirmations,
*configCopy.VRFv2.General.CallbackGasLimit,
*configCopy.VRFv2.General.NumberOfWords,
@@ -164,7 +169,7 @@ func TestVRFv2Basic(t *testing.T) {
// Check wrapper subscription balance
expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)
- wrapperSubscription, err = vrfv2Contracts.Coordinator.GetSubscription(testcontext.Get(t), *wrapperSubID)
+ wrapperSubscription, err = vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), *wrapperSubID)
require.NoError(t, err, "Error getting subscription information")
subBalanceAfterRequest := wrapperSubscription.Balance
require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest)
@@ -207,8 +212,8 @@ func TestVRFv2Basic(t *testing.T) {
env,
big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink),
linkToken,
- vrfv2Contracts.Coordinator,
- vrfv2Contracts.LoadTestConsumers,
+ vrfv2Contracts.CoordinatorV2,
+ vrfv2Contracts.VRFV2Consumer,
1,
)
require.NoError(t, err)
@@ -217,10 +222,10 @@ func TestVRFv2Basic(t *testing.T) {
fulfilledEventLink, err := vrfv2.RequestRandomnessAndWaitForFulfillment(
l,
- vrfv2Contracts.LoadTestConsumers[0],
- vrfv2Contracts.Coordinator,
+ vrfv2Contracts.VRFV2Consumer[0],
+ vrfv2Contracts.CoordinatorV2,
subIDForOracleWithdraw,
- vrfv2Data,
+ vrfv2KeyData,
*configCopy.VRFv2.General.MinimumConfirmations,
*configCopy.VRFv2.General.CallbackGasLimit,
*configCopy.VRFv2.General.NumberOfWords,
@@ -240,11 +245,11 @@ func TestVRFv2Basic(t *testing.T) {
Str("Amount", amountToWithdrawLink.String()).
Msg("Invoking Oracle Withdraw for LINK")
- err = vrfv2Contracts.Coordinator.OracleWithdraw(common.HexToAddress(defaultWalletAddress), amountToWithdrawLink)
+ err = vrfv2Contracts.CoordinatorV2.OracleWithdraw(common.HexToAddress(defaultWalletAddress), amountToWithdrawLink)
require.NoError(t, err, "Error withdrawing LINK from coordinator to default wallet")
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
defaultWalletBalanceLinkAfterOracleWithdraw, err := linkToken.BalanceOf(testcontext.Get(t), defaultWalletAddress)
require.NoError(t, err)
@@ -263,8 +268,8 @@ func TestVRFv2Basic(t *testing.T) {
env,
big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink),
linkToken,
- vrfv2Contracts.Coordinator,
- vrfv2Contracts.LoadTestConsumers,
+ vrfv2Contracts.CoordinatorV2,
+ vrfv2Contracts.VRFV2Consumer,
1,
)
require.NoError(t, err)
@@ -276,7 +281,7 @@ func TestVRFv2Basic(t *testing.T) {
testWalletBalanceLinkBeforeSubCancelling, err := linkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String())
require.NoError(t, err)
- subscriptionForCancelling, err := vrfv2Contracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ subscriptionForCancelling, err := vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err, "error getting subscription information")
subBalanceLink := subscriptionForCancelling.Balance
@@ -287,10 +292,10 @@ func TestVRFv2Basic(t *testing.T) {
Str("Returning funds to", testWalletAddress.String()).
Msg("Canceling subscription and returning funds to subscription owner")
- tx, err := vrfv2Contracts.Coordinator.CancelSubscription(subIDForCancelling, testWalletAddress)
+ tx, err := vrfv2Contracts.CoordinatorV2.CancelSubscription(subIDForCancelling, testWalletAddress)
require.NoError(t, err, "Error canceling subscription")
- subscriptionCanceledEvent, err := vrfv2Contracts.Coordinator.WaitForSubscriptionCanceledEvent([]uint64{subIDForCancelling}, time.Second*30)
+ subscriptionCanceledEvent, err := vrfv2Contracts.CoordinatorV2.WaitForSubscriptionCanceledEvent([]uint64{subIDForCancelling}, time.Second*30)
require.NoError(t, err, "error waiting for subscription canceled event")
cancellationTxReceipt, err := env.EVMClient.GetTxReceipt(tx.Hash())
@@ -317,7 +322,7 @@ func TestVRFv2Basic(t *testing.T) {
require.NoError(t, err)
//Verify that sub was deleted from Coordinator
- _, err = vrfv2Contracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ _, err = vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration")
subFundsReturnedLinkActual := new(big.Int).Sub(testWalletBalanceLinkAfterSubCancelling, testWalletBalanceLinkBeforeSubCancelling)
@@ -340,22 +345,22 @@ func TestVRFv2Basic(t *testing.T) {
env,
big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink),
linkToken,
- vrfv2Contracts.Coordinator,
- vrfv2Contracts.LoadTestConsumers,
+ vrfv2Contracts.CoordinatorV2,
+ vrfv2Contracts.VRFV2Consumer,
1,
)
require.NoError(t, err)
subIDForCancelling := subIDsForCancelling[0]
- subscriptionForCancelling, err := vrfv2Contracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ subscriptionForCancelling, err := vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err, "Error getting subscription information")
- vrfv2.LogSubDetails(l, subscriptionForCancelling, subIDForCancelling, vrfv2Contracts.Coordinator)
+ vrfv2.LogSubDetails(l, subscriptionForCancelling, subIDForCancelling, vrfv2Contracts.CoordinatorV2)
// No GetActiveSubscriptionIds function available - skipping check
- pendingRequestsExist, err := vrfv2Contracts.Coordinator.PendingRequestsExist(testcontext.Get(t), subIDForCancelling)
+ pendingRequestsExist, err := vrfv2Contracts.CoordinatorV2.PendingRequestsExist(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err)
require.False(t, pendingRequestsExist, "Pending requests should not exist")
@@ -363,10 +368,10 @@ func TestVRFv2Basic(t *testing.T) {
randomWordsFulfilledEventTimeout := 5 * time.Second
_, err = vrfv2.RequestRandomnessAndWaitForFulfillment(
l,
- vrfv2Contracts.LoadTestConsumers[0],
- vrfv2Contracts.Coordinator,
+ vrfv2Contracts.VRFV2Consumer[0],
+ vrfv2Contracts.CoordinatorV2,
subIDForCancelling,
- vrfv2Data,
+ vrfv2KeyData,
*configCopy.VRFv2.General.MinimumConfirmations,
*configCopy.VRFv2.General.CallbackGasLimit,
*configCopy.VRFv2.General.NumberOfWords,
@@ -376,14 +381,14 @@ func TestVRFv2Basic(t *testing.T) {
)
require.Error(t, err, "Error should occur while waiting for fulfilment due to low sub balance")
- pendingRequestsExist, err = vrfv2Contracts.Coordinator.PendingRequestsExist(testcontext.Get(t), subIDForCancelling)
+ pendingRequestsExist, err = vrfv2Contracts.CoordinatorV2.PendingRequestsExist(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err)
require.True(t, pendingRequestsExist, "Pending requests should exist after unfilfulled requests due to low sub balance")
walletBalanceLinkBeforeSubCancelling, err := linkToken.BalanceOf(testcontext.Get(t), defaultWalletAddress)
require.NoError(t, err)
- subscriptionForCancelling, err = vrfv2Contracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ subscriptionForCancelling, err = vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err, "Error getting subscription information")
subBalanceLink := subscriptionForCancelling.Balance
@@ -394,10 +399,10 @@ func TestVRFv2Basic(t *testing.T) {
Msg("Canceling subscription and returning funds to subscription owner")
// Call OwnerCancelSubscription
- tx, err := vrfv2Contracts.Coordinator.OwnerCancelSubscription(subIDForCancelling)
+ tx, err := vrfv2Contracts.CoordinatorV2.OwnerCancelSubscription(subIDForCancelling)
require.NoError(t, err, "Error canceling subscription")
- subscriptionCanceledEvent, err := vrfv2Contracts.Coordinator.WaitForSubscriptionCanceledEvent([]uint64{subIDForCancelling}, time.Second*30)
+ subscriptionCanceledEvent, err := vrfv2Contracts.CoordinatorV2.WaitForSubscriptionCanceledEvent([]uint64{subIDForCancelling}, time.Second*30)
require.NoError(t, err, "error waiting for subscription canceled event")
cancellationTxReceipt, err := env.EVMClient.GetTxReceipt(tx.Hash())
@@ -424,7 +429,7 @@ func TestVRFv2Basic(t *testing.T) {
require.NoError(t, err)
// Verify that subscription was deleted from Coordinator contract
- _, err = vrfv2Contracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ _, err = vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subIDForCancelling)
l.Info().
Str("Expected error message", err.Error())
require.Error(t, err, "Error did not occur when fetching deleted subscription from the Coordinator after owner cancelation")
@@ -481,8 +486,9 @@ func TestVRFv2MultipleSendingKeys(t *testing.T) {
defaultWalletAddress := env.EVMClient.GetDefaultWallet().Address()
numberOfTxKeysToCreate := 2
- vrfv2Contracts, subIDs, vrfv2Data, err := vrfv2.SetupVRFV2Environment(
+ vrfv2Contracts, subIDs, vrfv2KeyData, nodesMap, err := vrfv2.SetupVRFV2Environment(
env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
&config,
useVRFOwner,
useTestCoordinator,
@@ -498,13 +504,13 @@ func TestVRFv2MultipleSendingKeys(t *testing.T) {
subID := subIDs[0]
- subscription, err := vrfv2Contracts.Coordinator.GetSubscription(context.Background(), subID)
+ subscription, err := vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
- vrfv2.LogSubDetails(l, subscription, subID, vrfv2Contracts.Coordinator)
+ vrfv2.LogSubDetails(l, subscription, subID, vrfv2Contracts.CoordinatorV2)
t.Run("Request Randomness with multiple sending keys", func(t *testing.T) {
- txKeys, _, err := env.ClCluster.Nodes[0].API.ReadTxKeys("evm")
+ txKeys, _, err := nodesMap[vrfcommon.VRF].CLNode.API.ReadTxKeys("evm")
require.NoError(t, err, "error reading tx keys")
require.Equal(t, numberOfTxKeysToCreate+1, len(txKeys.Data))
@@ -513,10 +519,10 @@ func TestVRFv2MultipleSendingKeys(t *testing.T) {
for i := 0; i < numberOfTxKeysToCreate+1; i++ {
randomWordsFulfilledEvent, err := vrfv2.RequestRandomnessAndWaitForFulfillment(
l,
- vrfv2Contracts.LoadTestConsumers[0],
- vrfv2Contracts.Coordinator,
+ vrfv2Contracts.VRFV2Consumer[0],
+ vrfv2Contracts.CoordinatorV2,
subID,
- vrfv2Data,
+ vrfv2KeyData,
*config.VRFv2.General.MinimumConfirmations,
*config.VRFv2.General.CallbackGasLimit,
*config.VRFv2.General.NumberOfWords,
@@ -528,7 +534,7 @@ func TestVRFv2MultipleSendingKeys(t *testing.T) {
//todo - move TransactionByHash to EVMClient in CTF
fulfillmentTx, _, err := env.EVMClient.(*blockchain.EthereumMultinodeClient).DefaultClient.(*blockchain.EthereumClient).
- Client.TransactionByHash(context.Background(), randomWordsFulfilledEvent.Raw.TxHash)
+ Client.TransactionByHash(testcontext.Get(t), randomWordsFulfilledEvent.Raw.TxHash)
require.NoError(t, err, "error getting tx from hash")
fulfillmentTxFromAddress, err := actions.GetTxFromAddress(fulfillmentTx)
require.NoError(t, err, "error getting tx from address")
@@ -537,7 +543,7 @@ func TestVRFv2MultipleSendingKeys(t *testing.T) {
require.Equal(t, numberOfTxKeysToCreate+1, len(fulfillmentTxFromAddresses))
var txKeyAddresses []string
for _, txKey := range txKeys.Data {
- txKeyAddresses = append(txKeyAddresses, txKey.ID)
+ txKeyAddresses = append(txKeyAddresses, txKey.Attributes.Address)
}
less := func(a, b string) bool { return a < b }
equalIgnoreOrder := cmp.Diff(txKeyAddresses, fulfillmentTxFromAddresses, cmpopts.SortSlices(less)) == ""
@@ -579,8 +585,9 @@ func TestVRFOwner(t *testing.T) {
defaultWalletAddress := env.EVMClient.GetDefaultWallet().Address()
numberOfTxKeysToCreate := 1
- vrfv2Contracts, subIDs, vrfv2Data, err := vrfv2.SetupVRFV2Environment(
+ vrfv2Contracts, subIDs, vrfv2Data, _, err := vrfv2.SetupVRFV2Environment(
env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
&config,
useVRFOwner,
useTestCoordinator,
@@ -596,44 +603,44 @@ func TestVRFOwner(t *testing.T) {
subID := subIDs[0]
- subscription, err := vrfv2Contracts.Coordinator.GetSubscription(context.Background(), subID)
+ subscription, err := vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
- vrfv2.LogSubDetails(l, subscription, subID, vrfv2Contracts.Coordinator)
+ vrfv2.LogSubDetails(l, subscription, subID, vrfv2Contracts.CoordinatorV2)
t.Run("Request Randomness With Force-Fulfill", func(t *testing.T) {
configCopy := config.MustCopy().(tc.TestConfig)
- vrfCoordinatorOwner, err := vrfv2Contracts.Coordinator.GetOwner(testcontext.Get(t))
+ vrfCoordinatorOwner, err := vrfv2Contracts.CoordinatorV2.GetOwner(testcontext.Get(t))
require.NoError(t, err)
require.Equal(t, vrfv2Contracts.VRFOwner.Address(), vrfCoordinatorOwner.String())
err = linkToken.Transfer(
- vrfv2Contracts.LoadTestConsumers[0].Address(),
+ vrfv2Contracts.VRFV2Consumer[0].Address(),
conversions.EtherToWei(big.NewFloat(5)),
)
require.NoError(t, err, "error transferring link to consumer contract")
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
- consumerLinkBalance, err := linkToken.BalanceOf(testcontext.Get(t), vrfv2Contracts.LoadTestConsumers[0].Address())
+ consumerLinkBalance, err := linkToken.BalanceOf(testcontext.Get(t), vrfv2Contracts.VRFV2Consumer[0].Address())
require.NoError(t, err, "error getting consumer link balance")
l.Info().
Str("Balance", conversions.WeiToEther(consumerLinkBalance).String()).
- Str("Consumer", vrfv2Contracts.LoadTestConsumers[0].Address()).
+ Str("Consumer", vrfv2Contracts.VRFV2Consumer[0].Address()).
Msg("Consumer Link Balance")
err = mockETHLinkFeed.SetBlockTimestampDeduction(big.NewInt(3))
require.NoError(t, err)
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
// test and assert
_, randFulfilledEvent, _, err := vrfv2.RequestRandomnessWithForceFulfillAndWaitForFulfillment(
l,
- vrfv2Contracts.LoadTestConsumers[0],
- vrfv2Contracts.Coordinator,
+ vrfv2Contracts.VRFV2Consumer[0],
+ vrfv2Contracts.CoordinatorV2,
vrfv2Contracts.VRFOwner,
vrfv2Data,
*configCopy.VRFv2.General.MinimumConfirmations,
@@ -648,7 +655,7 @@ func TestVRFOwner(t *testing.T) {
require.NoError(t, err, "error requesting randomness with force-fulfillment and waiting for fulfilment")
require.Equal(t, 0, randFulfilledEvent.Payment.Cmp(big.NewInt(0)), "Forced Fulfilled Randomness's Payment should be 0")
- status, err := vrfv2Contracts.LoadTestConsumers[0].GetRequestStatus(context.Background(), randFulfilledEvent.RequestId)
+ status, err := vrfv2Contracts.VRFV2Consumer[0].GetRequestStatus(testcontext.Get(t), randFulfilledEvent.RequestId)
require.NoError(t, err, "error getting rand request status")
require.True(t, status.Fulfilled)
l.Debug().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")
@@ -659,13 +666,13 @@ func TestVRFOwner(t *testing.T) {
require.Equal(t, 1, w.Cmp(big.NewInt(0)), "Expected the VRF job give an answer bigger than 0")
}
- coordinatorConfig, err := vrfv2Contracts.Coordinator.GetConfig(testcontext.Get(t))
+ coordinatorConfig, err := vrfv2Contracts.CoordinatorV2.GetConfig(testcontext.Get(t))
require.NoError(t, err, "error getting coordinator config")
- coordinatorFeeConfig, err := vrfv2Contracts.Coordinator.GetFeeConfig(testcontext.Get(t))
+ coordinatorFeeConfig, err := vrfv2Contracts.CoordinatorV2.GetFeeConfig(testcontext.Get(t))
require.NoError(t, err, "error getting coordinator fee config")
- coordinatorFallbackWeiPerUnitLinkConfig, err := vrfv2Contracts.Coordinator.GetFallbackWeiPerUnitLink(testcontext.Get(t))
+ coordinatorFallbackWeiPerUnitLinkConfig, err := vrfv2Contracts.CoordinatorV2.GetFallbackWeiPerUnitLink(testcontext.Get(t))
require.NoError(t, err, "error getting coordinator FallbackWeiPerUnitLink")
require.Equal(t, *configCopy.VRFv2.General.StalenessSeconds, coordinatorConfig.StalenessSeconds)
@@ -676,3 +683,186 @@ func TestVRFOwner(t *testing.T) {
require.Equal(t, *configCopy.VRFv2.General.FallbackWeiPerUnitLink, coordinatorFallbackWeiPerUnitLinkConfig.Int64())
})
}
+
+func TestVRFV2WithBHS(t *testing.T) {
+ t.Parallel()
+ l := logging.GetTestLogger(t)
+
+ config, err := tc.GetConfig("Smoke", tc.VRFv2)
+ require.NoError(t, err, "Error getting config")
+
+ useVRFOwner := true
+ useTestCoordinator := true
+ network, err := actions.EthereumNetworkConfigFromConfig(l, &config)
+ require.NoError(t, err, "Error building ethereum network config")
+
+ env, err := test_env.NewCLTestEnvBuilder().
+ WithTestInstance(t).
+ WithTestConfig(&config).
+ WithPrivateEthereumNetwork(network).
+ WithCLNodes(2).
+ WithFunding(big.NewFloat(*config.Common.ChainlinkNodeFunding)).
+ WithStandardCleanup().
+ Build()
+ require.NoError(t, err, "error creating test env")
+
+ env.ParallelTransactions(true)
+
+ mockETHLinkFeed, err := env.ContractDeployer.DeployVRFMockETHLINKFeed(big.NewInt(*config.VRFv2.General.LinkNativeFeedResponse))
+
+ require.NoError(t, err)
+ linkToken, err := actions.DeployLINKToken(env.ContractDeployer)
+ require.NoError(t, err)
+
+ // register proving key against oracle address (sending key) in order to test oracleWithdraw
+ defaultWalletAddress := env.EVMClient.GetDefaultWallet().Address()
+
+ //Underfund Subscription
+ config.VRFv2.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0.000000000000000001)) // 1 Juel
+
+ //decrease default span for checking blockhashes for unfulfilled requests
+ config.VRFv2.General.BHSJobWaitBlocks = ptr.Ptr(2)
+ config.VRFv2.General.BHSJobLookBackBlocks = ptr.Ptr(20)
+
+ numberOfTxKeysToCreate := 0
+ vrfv2Contracts, subIDs, vrfv2KeyData, nodesMap, err := vrfv2.SetupVRFV2Environment(
+ env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF, vrfcommon.BHS},
+ &config,
+ useVRFOwner,
+ useTestCoordinator,
+ linkToken,
+ mockETHLinkFeed,
+ defaultWalletAddress,
+ numberOfTxKeysToCreate,
+ 1,
+ 1,
+ l,
+ )
+ require.NoError(t, err, "error setting up VRF v2 env")
+
+ subID := subIDs[0]
+
+ subscription, err := vrfv2Contracts.CoordinatorV2.GetSubscription(testcontext.Get(t), subID)
+ require.NoError(t, err, "error getting subscription information")
+
+ vrfv2.LogSubDetails(l, subscription, subID, vrfv2Contracts.CoordinatorV2)
+
+ t.Run("BHS Job with complete E2E - wait 256 blocks to see if Rand Request is fulfilled", func(t *testing.T) {
+ t.Skip("Skipped since should be run on-demand on live testnet due to long execution time")
+ //BHS node should fill in blockhashes into BHS contract depending on the waitBlocks and lookBackBlocks settings
+ configCopy := config.MustCopy().(tc.TestConfig)
+ _, err := vrfv2Contracts.VRFV2Consumer[0].RequestRandomness(
+ vrfv2KeyData.KeyHash,
+ subID,
+ *configCopy.VRFv2.General.MinimumConfirmations,
+ *configCopy.VRFv2.General.CallbackGasLimit,
+ *configCopy.VRFv2.General.NumberOfWords,
+ *configCopy.VRFv2.General.RandomnessRequestCountPerRequest,
+ )
+ require.NoError(t, err, "error requesting randomness")
+
+ randomWordsRequestedEvent, err := vrfv2Contracts.CoordinatorV2.WaitForRandomWordsRequestedEvent(
+ [][32]byte{vrfv2KeyData.KeyHash},
+ []uint64{subID},
+ []common.Address{common.HexToAddress(vrfv2Contracts.VRFV2Consumer[0].Address())},
+ time.Minute*1,
+ )
+ require.NoError(t, err, "error waiting for randomness requested event")
+ vrfv2.LogRandomnessRequestedEvent(l, vrfv2Contracts.CoordinatorV2, randomWordsRequestedEvent)
+ randRequestBlockNumber := randomWordsRequestedEvent.Raw.BlockNumber
+ var wg sync.WaitGroup
+ wg.Add(1)
+ //Wait at least 256 blocks
+ _, err = actions.WaitForBlockNumberToBe(randRequestBlockNumber+uint64(257), env.EVMClient, &wg, time.Second*260, t)
+ wg.Wait()
+ require.NoError(t, err)
+ err = vrfv2.FundSubscriptions(env, big.NewFloat(*configCopy.VRFv2.General.SubscriptionFundingAmountLink), linkToken, vrfv2Contracts.CoordinatorV2, subIDs)
+ require.NoError(t, err, "error funding subscriptions")
+ randomWordsFulfilledEvent, err := vrfv2Contracts.CoordinatorV2.WaitForRandomWordsFulfilledEvent(
+ []*big.Int{randomWordsRequestedEvent.RequestId},
+ time.Second*30,
+ )
+ require.NoError(t, err, "error waiting for randomness fulfilled event")
+ vrfv2.LogRandomWordsFulfilledEvent(l, vrfv2Contracts.CoordinatorV2, randomWordsFulfilledEvent)
+ status, err := vrfv2Contracts.VRFV2Consumer[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)
+ require.NoError(t, err, "error getting rand request status")
+ require.True(t, status.Fulfilled)
+ l.Debug().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")
+ })
+
+ t.Run("BHS Job should fill in blockhashes into BHS contract for unfulfilled requests", func(t *testing.T) {
+ //BHS node should fill in blockhashes into BHS contract depending on the waitBlocks and lookBackBlocks settings
+ configCopy := config.MustCopy().(tc.TestConfig)
+ _, err := vrfv2Contracts.VRFV2Consumer[0].RequestRandomness(
+ vrfv2KeyData.KeyHash,
+ subID,
+ *configCopy.VRFv2.General.MinimumConfirmations,
+ *configCopy.VRFv2.General.CallbackGasLimit,
+ *configCopy.VRFv2.General.NumberOfWords,
+ *configCopy.VRFv2.General.RandomnessRequestCountPerRequest,
+ )
+ require.NoError(t, err, "error requesting randomness")
+
+ randomWordsRequestedEvent, err := vrfv2Contracts.CoordinatorV2.WaitForRandomWordsRequestedEvent(
+ [][32]byte{vrfv2KeyData.KeyHash},
+ []uint64{subID},
+ []common.Address{common.HexToAddress(vrfv2Contracts.VRFV2Consumer[0].Address())},
+ time.Minute*1,
+ )
+ require.NoError(t, err, "error waiting for randomness requested event")
+ vrfv2.LogRandomnessRequestedEvent(l, vrfv2Contracts.CoordinatorV2, randomWordsRequestedEvent)
+ randRequestBlockNumber := randomWordsRequestedEvent.Raw.BlockNumber
+
+ _, err = vrfv2Contracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))
+ require.Error(t, err, "error not occurred when getting blockhash for a blocknumber which was not stored in BHS contract")
+
+ var wg sync.WaitGroup
+ wg.Add(1)
+ _, err = actions.WaitForBlockNumberToBe(randRequestBlockNumber+uint64(*config.VRFv2.General.BHSJobWaitBlocks), env.EVMClient, &wg, time.Minute*1, t)
+ wg.Wait()
+ require.NoError(t, err, "error waiting for blocknumber to be")
+
+ err = env.EVMClient.WaitForEvents()
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
+ metrics, err := vrfv2Contracts.VRFV2Consumer[0].GetLoadTestMetrics(testcontext.Get(t))
+ require.Equal(t, 0, metrics.RequestCount.Cmp(big.NewInt(1)))
+ require.Equal(t, 0, metrics.FulfilmentCount.Cmp(big.NewInt(0)))
+
+ var clNodeTxs *client.TransactionsData
+ var txHash string
+ gom := gomega.NewGomegaWithT(t)
+ gom.Eventually(func(g gomega.Gomega) {
+ clNodeTxs, _, err = nodesMap[vrfcommon.BHS].CLNode.API.ReadTransactions()
+ g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions")
+ l.Debug().Int("Number of TXs", len(clNodeTxs.Data)).Msg("BHS Node txs")
+ g.Expect(len(clNodeTxs.Data)).Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data))
+ txHash = clNodeTxs.Data[0].Attributes.Hash
+ }, "2m", "1s").Should(gomega.Succeed())
+
+ require.Equal(t, strings.ToLower(vrfv2Contracts.BHS.Address()), strings.ToLower(clNodeTxs.Data[0].Attributes.To))
+
+ bhsStoreTx, _, err := actions.GetTxByHash(testcontext.Get(t), env.EVMClient, common.HexToHash(txHash))
+ require.NoError(t, err, "error getting tx from hash")
+
+ bhsStoreTxInputData, err := actions.DecodeTxInputData(blockhash_store.BlockhashStoreABI, bhsStoreTx.Data())
+ l.Info().
+ Str("Block Number", bhsStoreTxInputData["n"].(*big.Int).String()).
+ Msg("BHS Node's Store Blockhash for Blocknumber Method TX")
+ require.Equal(t, randRequestBlockNumber, bhsStoreTxInputData["n"].(*big.Int).Uint64())
+
+ err = env.EVMClient.WaitForEvents()
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
+
+ var randRequestBlockHash [32]byte
+ gom.Eventually(func(g gomega.Gomega) {
+ randRequestBlockHash, err = vrfv2Contracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))
+ g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract")
+ }, "2m", "1s").Should(gomega.Succeed())
+ l.Info().
+ Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String()).
+ Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash)).
+ Msg("BHS Contract's stored Blockhash for Randomness Request")
+ require.Equal(t, 0, randomWordsRequestedEvent.Raw.BlockHash.Cmp(randRequestBlockHash))
+ })
+}
diff --git a/integration-tests/smoke/vrfv2plus_test.go b/integration-tests/smoke/vrfv2plus_test.go
index 9309070f647..e13f12b2a43 100644
--- a/integration-tests/smoke/vrfv2plus_test.go
+++ b/integration-tests/smoke/vrfv2plus_test.go
@@ -1,23 +1,26 @@
package smoke
import (
- "context"
"fmt"
"math/big"
+ "strings"
+ "sync"
"testing"
"time"
"github.com/ethereum/go-ethereum/common"
"github.com/google/go-cmp/cmp"
"github.com/google/go-cmp/cmp/cmpopts"
+ "github.com/onsi/gomega"
"github.com/stretchr/testify/require"
- "github.com/smartcontractkit/chainlink-testing-framework/blockchain"
"github.com/smartcontractkit/chainlink-testing-framework/logging"
"github.com/smartcontractkit/chainlink-testing-framework/utils/ptr"
"github.com/smartcontractkit/chainlink-testing-framework/utils/testcontext"
+ vrfcommon "github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/common"
"github.com/smartcontractkit/chainlink/integration-tests/actions/vrf/vrfv2plus"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/vrf_v2plus_upgraded_version"
+ "github.com/smartcontractkit/chainlink/integration-tests/client"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated/blockhash_store"
"github.com/smartcontractkit/chainlink/integration-tests/actions"
"github.com/smartcontractkit/chainlink/integration-tests/docker/test_env"
@@ -60,8 +63,9 @@ func TestVRFv2Plus(t *testing.T) {
defaultWalletAddress := env.EVMClient.GetDefaultWallet().Address()
numberOfTxKeysToCreate := 2
- vrfv2PlusContracts, subIDs, vrfv2PlusData, err := vrfv2plus.SetupVRFV2_5Environment(
+ vrfv2PlusContracts, subIDs, vrfv2PlusData, nodesMap, err := vrfv2plus.SetupVRFV2_5Environment(
env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
&config,
linkToken,
mockETHLinkFeed,
@@ -74,23 +78,23 @@ func TestVRFv2Plus(t *testing.T) {
subID := subIDs[0]
- subscription, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subID)
+ subscription, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
- vrfv2plus.LogSubDetails(l, subscription, subID, vrfv2PlusContracts.Coordinator)
+ vrfv2plus.LogSubDetails(l, subscription, subID, vrfv2PlusContracts.CoordinatorV2Plus)
t.Run("Link Billing", func(t *testing.T) {
configCopy := config.MustCopy().(tc.TestConfig)
var isNativeBilling = false
subBalanceBeforeRequest := subscription.Balance
- jobRunsBeforeTest, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(vrfv2PlusData.VRFJob.Data.ID)
+ jobRunsBeforeTest, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(nodesMap[vrfcommon.VRF].Job.Data.ID)
require.NoError(t, err, "error reading job runs")
// test and assert
randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment(
- vrfv2PlusContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
subID,
isNativeBilling,
@@ -105,16 +109,16 @@ func TestVRFv2Plus(t *testing.T) {
require.NoError(t, err, "error requesting randomness and waiting for fulfilment")
expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)
- subscription, err = vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subID)
+ subscription, err = vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
subBalanceAfterRequest := subscription.Balance
require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest)
- jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(vrfv2PlusData.VRFJob.Data.ID)
+ jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(nodesMap[vrfcommon.VRF].Job.Data.ID)
require.NoError(t, err, "error reading job runs")
require.Equal(t, len(jobRunsBeforeTest.Data)+1, len(jobRuns.Data))
- status, err := vrfv2PlusContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)
+ status, err := vrfv2PlusContracts.VRFV2PlusConsumer[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)
require.NoError(t, err, "error getting rand request status")
require.True(t, status.Fulfilled)
l.Debug().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")
@@ -132,13 +136,13 @@ func TestVRFv2Plus(t *testing.T) {
var isNativeBilling = true
subNativeTokenBalanceBeforeRequest := subscription.NativeBalance
- jobRunsBeforeTest, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(vrfv2PlusData.VRFJob.Data.ID)
+ jobRunsBeforeTest, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(nodesMap[vrfcommon.VRF].Job.Data.ID)
require.NoError(t, err, "error reading job runs")
// test and assert
randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment(
- vrfv2PlusContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
subID,
isNativeBilling,
@@ -152,16 +156,16 @@ func TestVRFv2Plus(t *testing.T) {
)
require.NoError(t, err, "error requesting randomness and waiting for fulfilment")
expectedSubBalanceWei := new(big.Int).Sub(subNativeTokenBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)
- subscription, err = vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subID)
+ subscription, err = vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err)
subBalanceAfterRequest := subscription.NativeBalance
require.Equal(t, expectedSubBalanceWei, subBalanceAfterRequest)
- jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(vrfv2PlusData.VRFJob.Data.ID)
+ jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(nodesMap[vrfcommon.VRF].Job.Data.ID)
require.NoError(t, err, "error reading job runs")
require.Equal(t, len(jobRunsBeforeTest.Data)+1, len(jobRuns.Data))
- status, err := vrfv2PlusContracts.LoadTestConsumers[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)
+ status, err := vrfv2PlusContracts.VRFV2PlusConsumer[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)
require.NoError(t, err, "error getting rand request status")
require.True(t, status.Fulfilled)
l.Debug().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")
@@ -179,7 +183,7 @@ func TestVRFv2Plus(t *testing.T) {
&configCopy,
linkToken,
mockETHLinkFeed,
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData.KeyHash,
1,
)
@@ -193,13 +197,13 @@ func TestVRFv2Plus(t *testing.T) {
wrapperConsumerJuelsBalanceBeforeRequest, err := linkToken.BalanceOf(testcontext.Get(t), wrapperContracts.LoadTestConsumers[0].Address())
require.NoError(t, err, "error getting wrapper consumer balance")
- wrapperSubscription, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), wrapperSubID)
+ wrapperSubscription, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)
require.NoError(t, err, "error getting subscription information")
subBalanceBeforeRequest := wrapperSubscription.Balance
randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment(
wrapperContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
wrapperSubID,
isNativeBilling,
@@ -214,7 +218,7 @@ func TestVRFv2Plus(t *testing.T) {
require.NoError(t, err, "error requesting randomness and waiting for fulfilment")
expectedSubBalanceJuels := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)
- wrapperSubscription, err = vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), wrapperSubID)
+ wrapperSubscription, err = vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)
require.NoError(t, err, "error getting subscription information")
subBalanceAfterRequest := wrapperSubscription.Balance
require.Equal(t, expectedSubBalanceJuels, subBalanceAfterRequest)
@@ -247,13 +251,13 @@ func TestVRFv2Plus(t *testing.T) {
wrapperConsumerBalanceBeforeRequestWei, err := env.EVMClient.BalanceAt(testcontext.Get(t), common.HexToAddress(wrapperContracts.LoadTestConsumers[0].Address()))
require.NoError(t, err, "error getting wrapper consumer balance")
- wrapperSubscription, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), wrapperSubID)
+ wrapperSubscription, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)
require.NoError(t, err, "error getting subscription information")
subBalanceBeforeRequest := wrapperSubscription.NativeBalance
randomWordsFulfilledEvent, err := vrfv2plus.DirectFundingRequestRandomnessAndWaitForFulfillment(
wrapperContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
wrapperSubID,
isNativeBilling,
@@ -268,7 +272,7 @@ func TestVRFv2Plus(t *testing.T) {
require.NoError(t, err, "error requesting randomness and waiting for fulfilment")
expectedSubBalanceWei := new(big.Int).Sub(subBalanceBeforeRequest, randomWordsFulfilledEvent.Payment)
- wrapperSubscription, err = vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), wrapperSubID)
+ wrapperSubscription, err = vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), wrapperSubID)
require.NoError(t, err, "error getting subscription information")
subBalanceAfterRequest := wrapperSubscription.NativeBalance
require.Equal(t, expectedSubBalanceWei, subBalanceAfterRequest)
@@ -301,8 +305,8 @@ func TestVRFv2Plus(t *testing.T) {
big.NewFloat(*configCopy.GetVRFv2PlusConfig().General.SubscriptionFundingAmountNative),
big.NewFloat(*configCopy.GetVRFv2PlusConfig().General.SubscriptionFundingAmountLink),
linkToken,
- vrfv2PlusContracts.Coordinator,
- vrfv2PlusContracts.LoadTestConsumers,
+ vrfv2PlusContracts.CoordinatorV2Plus,
+ vrfv2PlusContracts.VRFV2PlusConsumer,
1,
vrfv2plus_config.BillingType(*configCopy.GetVRFv2PlusConfig().General.SubscriptionBillingType),
)
@@ -318,7 +322,7 @@ func TestVRFv2Plus(t *testing.T) {
testWalletBalanceLinkBeforeSubCancelling, err := linkToken.BalanceOf(testcontext.Get(t), testWalletAddress.String())
require.NoError(t, err)
- subscriptionForCancelling, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ subscriptionForCancelling, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err, "error getting subscription information")
subBalanceLink := subscriptionForCancelling.Balance
@@ -329,10 +333,10 @@ func TestVRFv2Plus(t *testing.T) {
Str("Returning funds from SubID", subIDForCancelling.String()).
Str("Returning funds to", testWalletAddress.String()).
Msg("Canceling subscription and returning funds to subscription owner")
- tx, err := vrfv2PlusContracts.Coordinator.CancelSubscription(subIDForCancelling, testWalletAddress)
+ tx, err := vrfv2PlusContracts.CoordinatorV2Plus.CancelSubscription(subIDForCancelling, testWalletAddress)
require.NoError(t, err, "Error canceling subscription")
- subscriptionCanceledEvent, err := vrfv2PlusContracts.Coordinator.WaitForSubscriptionCanceledEvent(subIDForCancelling, time.Second*30)
+ subscriptionCanceledEvent, err := vrfv2PlusContracts.CoordinatorV2Plus.WaitForSubscriptionCanceledEvent(subIDForCancelling, time.Second*30)
require.NoError(t, err, "error waiting for subscription canceled event")
cancellationTxReceipt, err := env.EVMClient.GetTxReceipt(tx.Hash())
@@ -364,7 +368,7 @@ func TestVRFv2Plus(t *testing.T) {
require.NoError(t, err)
//Verify that sub was deleted from Coordinator
- _, err = vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ _, err = vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration")
subFundsReturnedNativeActual := new(big.Int).Sub(testWalletBalanceNativeAfterSubCancelling, testWalletBalanceNativeBeforeSubCancelling)
@@ -401,8 +405,8 @@ func TestVRFv2Plus(t *testing.T) {
big.NewFloat(*configCopy.GetVRFv2PlusConfig().General.SubscriptionFundingAmountNative),
big.NewFloat(*configCopy.GetVRFv2PlusConfig().General.SubscriptionFundingAmountLink),
linkToken,
- vrfv2PlusContracts.Coordinator,
- vrfv2PlusContracts.LoadTestConsumers,
+ vrfv2PlusContracts.CoordinatorV2Plus,
+ vrfv2PlusContracts.VRFV2PlusConsumer,
1,
vrfv2plus_config.BillingType(*configCopy.GetVRFv2PlusConfig().General.SubscriptionBillingType),
)
@@ -410,24 +414,24 @@ func TestVRFv2Plus(t *testing.T) {
subIDForCancelling := subIDsForCancelling[0]
- subscriptionForCancelling, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ subscriptionForCancelling, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err, "error getting subscription information")
- vrfv2plus.LogSubDetails(l, subscriptionForCancelling, subIDForCancelling, vrfv2PlusContracts.Coordinator)
+ vrfv2plus.LogSubDetails(l, subscriptionForCancelling, subIDForCancelling, vrfv2PlusContracts.CoordinatorV2Plus)
- activeSubscriptionIdsBeforeSubCancellation, err := vrfv2PlusContracts.Coordinator.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
+ activeSubscriptionIdsBeforeSubCancellation, err := vrfv2PlusContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
require.NoError(t, err)
require.True(t, it_utils.BigIntSliceContains(activeSubscriptionIdsBeforeSubCancellation, subIDForCancelling))
- pendingRequestsExist, err := vrfv2PlusContracts.Coordinator.PendingRequestsExist(testcontext.Get(t), subIDForCancelling)
+ pendingRequestsExist, err := vrfv2PlusContracts.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err)
require.False(t, pendingRequestsExist, "Pending requests should not exist")
randomWordsFulfilledEventTimeout := 5 * time.Second
_, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment(
- vrfv2PlusContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
subIDForCancelling,
false,
@@ -443,8 +447,8 @@ func TestVRFv2Plus(t *testing.T) {
require.Error(t, err, "error should occur for waiting for fulfilment due to low sub balance")
_, err = vrfv2plus.RequestRandomnessAndWaitForFulfillment(
- vrfv2PlusContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
subIDForCancelling,
true,
@@ -459,7 +463,7 @@ func TestVRFv2Plus(t *testing.T) {
require.Error(t, err, "error should occur for waiting for fulfilment due to low sub balance")
- pendingRequestsExist, err = vrfv2PlusContracts.Coordinator.PendingRequestsExist(testcontext.Get(t), subIDForCancelling)
+ pendingRequestsExist, err = vrfv2PlusContracts.CoordinatorV2Plus.PendingRequestsExist(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err)
require.True(t, pendingRequestsExist, "Pending requests should exist after unfulfilled rand requests due to low sub balance")
@@ -469,7 +473,7 @@ func TestVRFv2Plus(t *testing.T) {
walletBalanceLinkBeforeSubCancelling, err := linkToken.BalanceOf(testcontext.Get(t), defaultWalletAddress)
require.NoError(t, err)
- subscriptionForCancelling, err = vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
+ subscriptionForCancelling, err = vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.NoError(t, err, "error getting subscription information")
subBalanceLink := subscriptionForCancelling.Balance
@@ -480,10 +484,10 @@ func TestVRFv2Plus(t *testing.T) {
Str("Returning funds from SubID", subIDForCancelling.String()).
Str("Returning funds to", defaultWalletAddress).
Msg("Canceling subscription and returning funds to subscription owner")
- tx, err := vrfv2PlusContracts.Coordinator.OwnerCancelSubscription(subIDForCancelling)
+ tx, err := vrfv2PlusContracts.CoordinatorV2Plus.OwnerCancelSubscription(subIDForCancelling)
require.NoError(t, err, "Error canceling subscription")
- subscriptionCanceledEvent, err := vrfv2PlusContracts.Coordinator.WaitForSubscriptionCanceledEvent(subIDForCancelling, time.Second*30)
+ subscriptionCanceledEvent, err := vrfv2PlusContracts.CoordinatorV2Plus.WaitForSubscriptionCanceledEvent(subIDForCancelling, time.Second*30)
require.NoError(t, err, "error waiting for subscription canceled event")
cancellationTxReceipt, err := env.EVMClient.GetTxReceipt(tx.Hash())
@@ -515,8 +519,7 @@ func TestVRFv2Plus(t *testing.T) {
require.NoError(t, err)
//Verify that sub was deleted from Coordinator
- _, err = vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subIDForCancelling)
- fmt.Println("err", err)
+ _, err = vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subIDForCancelling)
require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration")
subFundsReturnedNativeActual := new(big.Int).Sub(walletBalanceNativeAfterSubCancelling, walletBalanceNativeBeforeSubCancelling)
@@ -544,7 +547,7 @@ func TestVRFv2Plus(t *testing.T) {
//require.Equal(t, subFundsReturnedNativeExpected, subFundsReturnedNativeActual, "Returned funds are not equal to sub balance that was cancelled")
require.Equal(t, 0, subBalanceLink.Cmp(subFundsReturnedLinkActual), "Returned LINK funds are not equal to sub balance that was cancelled")
- activeSubscriptionIdsAfterSubCancellation, err := vrfv2PlusContracts.Coordinator.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
+ activeSubscriptionIdsAfterSubCancellation, err := vrfv2PlusContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
require.NoError(t, err, "error getting active subscription ids")
require.False(
@@ -561,8 +564,8 @@ func TestVRFv2Plus(t *testing.T) {
big.NewFloat(*configCopy.GetVRFv2PlusConfig().General.SubscriptionFundingAmountNative),
big.NewFloat(*configCopy.GetVRFv2PlusConfig().General.SubscriptionFundingAmountLink),
linkToken,
- vrfv2PlusContracts.Coordinator,
- vrfv2PlusContracts.LoadTestConsumers,
+ vrfv2PlusContracts.CoordinatorV2Plus,
+ vrfv2PlusContracts.VRFV2PlusConsumer,
1,
vrfv2plus_config.BillingType(*configCopy.GetVRFv2PlusConfig().General.SubscriptionBillingType),
)
@@ -570,8 +573,8 @@ func TestVRFv2Plus(t *testing.T) {
subIDForWithdraw := subIDsForWithdraw[0]
fulfilledEventLink, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment(
- vrfv2PlusContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
subIDForWithdraw,
false,
@@ -586,8 +589,8 @@ func TestVRFv2Plus(t *testing.T) {
require.NoError(t, err)
fulfilledEventNative, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment(
- vrfv2PlusContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
subIDForWithdraw,
true,
@@ -613,7 +616,7 @@ func TestVRFv2Plus(t *testing.T) {
Str("Amount", amountToWithdrawLink.String()).
Msg("Invoking Oracle Withdraw for LINK")
- err = vrfv2PlusContracts.Coordinator.Withdraw(
+ err = vrfv2PlusContracts.CoordinatorV2Plus.Withdraw(
common.HexToAddress(defaultWalletAddress),
)
require.NoError(t, err, "error withdrawing LINK from coordinator to default wallet")
@@ -624,13 +627,13 @@ func TestVRFv2Plus(t *testing.T) {
Str("Amount", amountToWithdrawNative.String()).
Msg("Invoking Oracle Withdraw for Native")
- err = vrfv2PlusContracts.Coordinator.WithdrawNative(
+ err = vrfv2PlusContracts.CoordinatorV2Plus.WithdrawNative(
common.HexToAddress(defaultWalletAddress),
)
require.NoError(t, err, "error withdrawing Native tokens from coordinator to default wallet")
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2plus.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
defaultWalletBalanceNativeAfterWithdraw, err := env.EVMClient.BalanceAt(testcontext.Get(t), common.HexToAddress(defaultWalletAddress))
require.NoError(t, err)
@@ -675,8 +678,9 @@ func TestVRFv2PlusMultipleSendingKeys(t *testing.T) {
require.NoError(t, err, "error deploying LINK contract")
numberOfTxKeysToCreate := 2
- vrfv2PlusContracts, subIDs, vrfv2PlusData, err := vrfv2plus.SetupVRFV2_5Environment(
+ vrfv2PlusContracts, subIDs, vrfv2PlusData, _, err := vrfv2plus.SetupVRFV2_5Environment(
env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
&config,
linkToken,
mockETHLinkFeed,
@@ -689,10 +693,10 @@ func TestVRFv2PlusMultipleSendingKeys(t *testing.T) {
subID := subIDs[0]
- subscription, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subID)
+ subscription, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
- vrfv2plus.LogSubDetails(l, subscription, subID, vrfv2PlusContracts.Coordinator)
+ vrfv2plus.LogSubDetails(l, subscription, subID, vrfv2PlusContracts.CoordinatorV2Plus)
t.Run("Request Randomness with multiple sending keys", func(t *testing.T) {
configCopy := config.MustCopy().(tc.TestConfig)
@@ -705,8 +709,8 @@ func TestVRFv2PlusMultipleSendingKeys(t *testing.T) {
var fulfillmentTxFromAddresses []string
for i := 0; i < numberOfTxKeysToCreate+1; i++ {
randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment(
- vrfv2PlusContracts.LoadTestConsumers[0],
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData,
subID,
isNativeBilling,
@@ -721,8 +725,7 @@ func TestVRFv2PlusMultipleSendingKeys(t *testing.T) {
require.NoError(t, err, "error requesting randomness and waiting for fulfilment")
//todo - move TransactionByHash to EVMClient in CTF
- fulfillmentTx, _, err := env.EVMClient.(*blockchain.EthereumMultinodeClient).DefaultClient.(*blockchain.EthereumClient).
- Client.TransactionByHash(context.Background(), randomWordsFulfilledEvent.Raw.TxHash)
+ fulfillmentTx, _, err := actions.GetTxByHash(testcontext.Get(t), env.EVMClient, randomWordsFulfilledEvent.Raw.TxHash)
require.NoError(t, err, "error getting tx from hash")
fulfillmentTxFromAddress, err := actions.GetTxFromAddress(fulfillmentTx)
require.NoError(t, err, "error getting tx from address")
@@ -731,7 +734,7 @@ func TestVRFv2PlusMultipleSendingKeys(t *testing.T) {
require.Equal(t, numberOfTxKeysToCreate+1, len(fulfillmentTxFromAddresses))
var txKeyAddresses []string
for _, txKey := range txKeys.Data {
- txKeyAddresses = append(txKeyAddresses, txKey.ID)
+ txKeyAddresses = append(txKeyAddresses, txKey.Attributes.Address)
}
less := func(a, b string) bool { return a < b }
equalIgnoreOrder := cmp.Diff(txKeyAddresses, fulfillmentTxFromAddresses, cmpopts.SortSlices(less)) == ""
@@ -768,8 +771,9 @@ func TestVRFv2PlusMigration(t *testing.T) {
linkAddress, err := actions.DeployLINKToken(env.ContractDeployer)
require.NoError(t, err, "error deploying LINK contract")
- vrfv2PlusContracts, subIDs, vrfv2PlusData, err := vrfv2plus.SetupVRFV2_5Environment(
+ vrfv2PlusContracts, subIDs, vrfv2PlusData, nodesMap, err := vrfv2plus.SetupVRFV2_5Environment(
env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
&config,
linkAddress,
mockETHLinkFeedAddress,
@@ -782,17 +786,17 @@ func TestVRFv2PlusMigration(t *testing.T) {
subID := subIDs[0]
- subscription, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subID)
+ subscription, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
- vrfv2plus.LogSubDetails(l, subscription, subID, vrfv2PlusContracts.Coordinator)
+ vrfv2plus.LogSubDetails(l, subscription, subID, vrfv2PlusContracts.CoordinatorV2Plus)
- activeSubIdsOldCoordinatorBeforeMigration, err := vrfv2PlusContracts.Coordinator.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
+ activeSubIdsOldCoordinatorBeforeMigration, err := vrfv2PlusContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
require.NoError(t, err, "error occurred getting active sub ids")
require.Len(t, activeSubIdsOldCoordinatorBeforeMigration, 1, "Active Sub Ids length is not equal to 1")
require.Equal(t, subID, activeSubIdsOldCoordinatorBeforeMigration[0])
- oldSubscriptionBeforeMigration, err := vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subID)
+ oldSubscriptionBeforeMigration, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
require.NoError(t, err, "error getting subscription information")
//Migration Process
@@ -800,10 +804,10 @@ func TestVRFv2PlusMigration(t *testing.T) {
require.NoError(t, err, "error deploying VRF CoordinatorV2PlusUpgradedVersion")
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2plus.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
_, err = vrfv2plus.VRFV2PlusUpgradedVersionRegisterProvingKey(vrfv2PlusData.VRFKey, newCoordinator)
- require.NoError(t, err, fmt.Errorf("%s, err: %w", vrfv2plus.ErrRegisteringProvingKey, err))
+ require.NoError(t, err, fmt.Errorf("%s, err: %w", vrfcommon.ErrRegisteringProvingKey, err))
vrfv2PlusConfig := config.VRFv2Plus.General
err = newCoordinator.SetConfig(
@@ -812,23 +816,23 @@ func TestVRFv2PlusMigration(t *testing.T) {
*vrfv2PlusConfig.StalenessSeconds,
*vrfv2PlusConfig.GasAfterPaymentCalculation,
big.NewInt(*vrfv2PlusConfig.LinkNativeFeedResponse),
- vrf_v2plus_upgraded_version.VRFCoordinatorV2PlusUpgradedVersionFeeConfig{
- FulfillmentFlatFeeLinkPPM: *vrfv2PlusConfig.FulfillmentFlatFeeLinkPPM,
- FulfillmentFlatFeeNativePPM: *vrfv2PlusConfig.FulfillmentFlatFeeNativePPM,
- },
+ *vrfv2PlusConfig.FulfillmentFlatFeeNativePPM,
+ *vrfv2PlusConfig.FulfillmentFlatFeeLinkDiscountPPM,
+ *vrfv2PlusConfig.NativePremiumPercentage,
+ *vrfv2PlusConfig.LinkPremiumPercentage,
)
require.NoError(t, err)
err = newCoordinator.SetLINKAndLINKNativeFeed(linkAddress.Address(), mockETHLinkFeedAddress.Address())
require.NoError(t, err, vrfv2plus.ErrSetLinkNativeLinkFeed)
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2plus.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
- vrfJobSpecConfig := vrfv2plus.VRFJobSpecConfig{
+ vrfJobSpecConfig := vrfcommon.VRFJobSpecConfig{
ForwardingAllowed: false,
CoordinatorAddress: newCoordinator.Address(),
- FromAddresses: []string{vrfv2PlusData.PrimaryEthAddress},
- EVMChainID: vrfv2PlusData.ChainID.String(),
+ FromAddresses: nodesMap[vrfcommon.VRF].TXKeyAddressStrings,
+ EVMChainID: env.EVMClient.GetChainID().String(),
MinIncomingConfirmations: int(*vrfv2PlusConfig.MinimumConfirmations),
PublicKey: vrfv2PlusData.VRFKey.Data.ID,
EstimateGasMultiplier: 1,
@@ -844,31 +848,31 @@ func TestVRFv2PlusMigration(t *testing.T) {
)
require.NoError(t, err, vrfv2plus.ErrCreateVRFV2PlusJobs)
- err = vrfv2PlusContracts.Coordinator.RegisterMigratableCoordinator(newCoordinator.Address())
+ err = vrfv2PlusContracts.CoordinatorV2Plus.RegisterMigratableCoordinator(newCoordinator.Address())
require.NoError(t, err, "error registering migratable coordinator")
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2plus.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
- oldCoordinatorLinkTotalBalanceBeforeMigration, oldCoordinatorEthTotalBalanceBeforeMigration, err := vrfv2plus.GetCoordinatorTotalBalance(vrfv2PlusContracts.Coordinator)
+ oldCoordinatorLinkTotalBalanceBeforeMigration, oldCoordinatorEthTotalBalanceBeforeMigration, err := vrfv2plus.GetCoordinatorTotalBalance(vrfv2PlusContracts.CoordinatorV2Plus)
require.NoError(t, err)
migratedCoordinatorLinkTotalBalanceBeforeMigration, migratedCoordinatorEthTotalBalanceBeforeMigration, err := vrfv2plus.GetUpgradedCoordinatorTotalBalance(newCoordinator)
require.NoError(t, err)
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2plus.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
- err = vrfv2PlusContracts.Coordinator.Migrate(subID, newCoordinator.Address())
- require.NoError(t, err, "error migrating sub id ", subID.String(), " from ", vrfv2PlusContracts.Coordinator.Address(), " to new Coordinator address ", newCoordinator.Address())
- migrationCompletedEvent, err := vrfv2PlusContracts.Coordinator.WaitForMigrationCompletedEvent(time.Minute * 1)
+ err = vrfv2PlusContracts.CoordinatorV2Plus.Migrate(subID, newCoordinator.Address())
+ require.NoError(t, err, "error migrating sub id ", subID.String(), " from ", vrfv2PlusContracts.CoordinatorV2Plus.Address(), " to new Coordinator address ", newCoordinator.Address())
+ migrationCompletedEvent, err := vrfv2PlusContracts.CoordinatorV2Plus.WaitForMigrationCompletedEvent(time.Minute * 1)
require.NoError(t, err, "error waiting for MigrationCompleted event")
err = env.EVMClient.WaitForEvents()
- require.NoError(t, err, vrfv2plus.ErrWaitTXsComplete)
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
vrfv2plus.LogMigrationCompletedEvent(l, migrationCompletedEvent, vrfv2PlusContracts)
- oldCoordinatorLinkTotalBalanceAfterMigration, oldCoordinatorEthTotalBalanceAfterMigration, err := vrfv2plus.GetCoordinatorTotalBalance(vrfv2PlusContracts.Coordinator)
+ oldCoordinatorLinkTotalBalanceAfterMigration, oldCoordinatorEthTotalBalanceAfterMigration, err := vrfv2plus.GetCoordinatorTotalBalance(vrfv2PlusContracts.CoordinatorV2Plus)
require.NoError(t, err)
migratedCoordinatorLinkTotalBalanceAfterMigration, migratedCoordinatorEthTotalBalanceAfterMigration, err := vrfv2plus.GetUpgradedCoordinatorTotalBalance(newCoordinator)
@@ -880,7 +884,7 @@ func TestVRFv2PlusMigration(t *testing.T) {
vrfv2plus.LogSubDetailsAfterMigration(l, newCoordinator, subID, migratedSubscription)
//Verify that Coordinators were updated in Consumers
- for _, consumer := range vrfv2PlusContracts.LoadTestConsumers {
+ for _, consumer := range vrfv2PlusContracts.VRFV2PlusConsumer {
coordinatorAddressInConsumerAfterMigration, err := consumer.GetCoordinator(testcontext.Get(t))
require.NoError(t, err, "error getting Coordinator from Consumer contract")
require.Equal(t, newCoordinator.Address(), coordinatorAddressInConsumerAfterMigration.String())
@@ -897,10 +901,10 @@ func TestVRFv2PlusMigration(t *testing.T) {
require.Equal(t, oldSubscriptionBeforeMigration.Consumers, migratedSubscription.Consumers)
//Verify that old sub was deleted from old Coordinator
- _, err = vrfv2PlusContracts.Coordinator.GetSubscription(testcontext.Get(t), subID)
+ _, err = vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
require.Error(t, err, "error not occurred when trying to get deleted subscription from old Coordinator after sub migration")
- _, err = vrfv2PlusContracts.Coordinator.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
+ _, err = vrfv2PlusContracts.CoordinatorV2Plus.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
require.Error(t, err, "error not occurred getting active sub ids. Should occur since it should revert when sub id array is empty")
activeSubIdsMigratedCoordinator, err := newCoordinator.GetActiveSubscriptionIds(testcontext.Get(t), big.NewInt(0), big.NewInt(0))
@@ -921,7 +925,7 @@ func TestVRFv2PlusMigration(t *testing.T) {
//Verify rand requests fulfills with Link Token billing
_, err = vrfv2plus.RequestRandomnessAndWaitForFulfillmentUpgraded(
- vrfv2PlusContracts.LoadTestConsumers[0],
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
newCoordinator,
vrfv2PlusData,
subID,
@@ -937,7 +941,7 @@ func TestVRFv2PlusMigration(t *testing.T) {
//Verify rand requests fulfills with Native Token billing
_, err = vrfv2plus.RequestRandomnessAndWaitForFulfillmentUpgraded(
- vrfv2PlusContracts.LoadTestConsumers[1],
+ vrfv2PlusContracts.VRFV2PlusConsumer[1],
newCoordinator,
vrfv2PlusData,
subID,
@@ -951,3 +955,277 @@ func TestVRFv2PlusMigration(t *testing.T) {
)
require.NoError(t, err, "error requesting randomness and waiting for fulfilment")
}
+
+func TestVRFV2PlusWithBHS(t *testing.T) {
+ t.Parallel()
+ l := logging.GetTestLogger(t)
+
+ config, err := tc.GetConfig("Smoke", tc.VRFv2Plus)
+ require.NoError(t, err, "Error getting config")
+
+ network, err := actions.EthereumNetworkConfigFromConfig(l, &config)
+ require.NoError(t, err, "Error building ethereum network config")
+
+ env, err := test_env.NewCLTestEnvBuilder().
+ WithTestInstance(t).
+ WithTestConfig(&config).
+ WithPrivateEthereumNetwork(network).
+ WithCLNodes(2).
+ WithFunding(big.NewFloat(*config.Common.ChainlinkNodeFunding)).
+ WithStandardCleanup().
+ Build()
+ require.NoError(t, err, "error creating test env")
+
+ env.ParallelTransactions(true)
+
+ mockETHLinkFeed, err := env.ContractDeployer.DeployVRFMockETHLINKFeed(big.NewInt(*config.VRFv2Plus.General.LinkNativeFeedResponse))
+
+ require.NoError(t, err)
+ linkToken, err := actions.DeployLINKToken(env.ContractDeployer)
+ require.NoError(t, err)
+
+ //Underfund Subscription
+ config.VRFv2Plus.General.SubscriptionFundingAmountLink = ptr.Ptr(float64(0.000000000000000001)) // 1 Juel
+
+ //decrease default span for checking blockhashes for unfulfilled requests
+ config.VRFv2Plus.General.BHSJobWaitBlocks = ptr.Ptr(2)
+ config.VRFv2Plus.General.BHSJobLookBackBlocks = ptr.Ptr(20)
+
+ numberOfTxKeysToCreate := 0
+ vrfContracts, subIDs, vrfKeyData, nodesMap, err := vrfv2plus.SetupVRFV2_5Environment(
+ env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF, vrfcommon.BHS},
+ &config,
+ linkToken,
+ mockETHLinkFeed,
+ numberOfTxKeysToCreate,
+ 1,
+ 1,
+ l,
+ )
+ require.NoError(t, err, "error setting up VRF v2_5 env")
+
+ subID := subIDs[0]
+
+ subscription, err := vrfContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
+ require.NoError(t, err, "error getting subscription information")
+
+ vrfv2plus.LogSubDetails(l, subscription, subID, vrfContracts.CoordinatorV2Plus)
+ var isNativeBilling = false
+ t.Run("BHS Job with complete E2E - wait 256 blocks to see if Rand Request is fulfilled", func(t *testing.T) {
+ t.Skip("Skipped since should be run on-demand on live testnet due to long execution time")
+ //BHS node should fill in blockhashes into BHS contract depending on the waitBlocks and lookBackBlocks settings
+ configCopy := config.MustCopy().(tc.TestConfig)
+ _, err := vrfContracts.VRFV2PlusConsumer[0].RequestRandomness(
+ vrfKeyData.KeyHash,
+ subID,
+ *configCopy.VRFv2Plus.General.MinimumConfirmations,
+ *configCopy.VRFv2Plus.General.CallbackGasLimit,
+ isNativeBilling,
+ *configCopy.VRFv2Plus.General.NumberOfWords,
+ *configCopy.VRFv2Plus.General.RandomnessRequestCountPerRequest,
+ )
+ require.NoError(t, err, "error requesting randomness")
+
+ randomWordsRequestedEvent, err := vrfContracts.CoordinatorV2Plus.WaitForRandomWordsRequestedEvent(
+ [][32]byte{vrfKeyData.KeyHash},
+ []*big.Int{subID},
+ []common.Address{common.HexToAddress(vrfContracts.VRFV2PlusConsumer[0].Address())},
+ time.Minute*1,
+ )
+ require.NoError(t, err, "error waiting for randomness requested event")
+ vrfv2plus.LogRandomnessRequestedEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsRequestedEvent, isNativeBilling)
+ randRequestBlockNumber := randomWordsRequestedEvent.Raw.BlockNumber
+ var wg sync.WaitGroup
+ wg.Add(1)
+ //Wait at least 256 blocks
+ _, err = actions.WaitForBlockNumberToBe(randRequestBlockNumber+uint64(257), env.EVMClient, &wg, time.Second*260, t)
+ wg.Wait()
+ require.NoError(t, err)
+ err = vrfv2plus.FundSubscriptions(
+ env,
+ big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionFundingAmountNative),
+ big.NewFloat(*configCopy.VRFv2Plus.General.SubscriptionFundingAmountLink),
+ linkToken,
+ vrfContracts.CoordinatorV2Plus,
+ subIDs,
+ vrfv2plus_config.BillingType_Link,
+ )
+ require.NoError(t, err, "error funding subscriptions")
+ randomWordsFulfilledEvent, err := vrfContracts.CoordinatorV2Plus.WaitForRandomWordsFulfilledEvent(
+ []*big.Int{subID},
+ []*big.Int{randomWordsRequestedEvent.RequestId},
+ time.Second*30,
+ )
+ require.NoError(t, err, "error waiting for randomness fulfilled event")
+ vrfv2plus.LogRandomWordsFulfilledEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsFulfilledEvent, isNativeBilling)
+ status, err := vrfContracts.VRFV2PlusConsumer[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)
+ require.NoError(t, err, "error getting rand request status")
+ require.True(t, status.Fulfilled)
+ l.Debug().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")
+ })
+
+ t.Run("BHS Job should fill in blockhashes into BHS contract for unfulfilled requests", func(t *testing.T) {
+ //BHS node should fill in blockhashes into BHS contract depending on the waitBlocks and lookBackBlocks settings
+ configCopy := config.MustCopy().(tc.TestConfig)
+ _, err := vrfContracts.VRFV2PlusConsumer[0].RequestRandomness(
+ vrfKeyData.KeyHash,
+ subID,
+ *configCopy.VRFv2Plus.General.MinimumConfirmations,
+ *configCopy.VRFv2Plus.General.CallbackGasLimit,
+ isNativeBilling,
+ *configCopy.VRFv2Plus.General.NumberOfWords,
+ *configCopy.VRFv2Plus.General.RandomnessRequestCountPerRequest,
+ )
+ require.NoError(t, err, "error requesting randomness")
+
+ randomWordsRequestedEvent, err := vrfContracts.CoordinatorV2Plus.WaitForRandomWordsRequestedEvent(
+ [][32]byte{vrfKeyData.KeyHash},
+ []*big.Int{subID},
+ []common.Address{common.HexToAddress(vrfContracts.VRFV2PlusConsumer[0].Address())},
+ time.Minute*1,
+ )
+ require.NoError(t, err, "error waiting for randomness requested event")
+ vrfv2plus.LogRandomnessRequestedEvent(l, vrfContracts.CoordinatorV2Plus, randomWordsRequestedEvent, isNativeBilling)
+ randRequestBlockNumber := randomWordsRequestedEvent.Raw.BlockNumber
+ _, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))
+ require.Error(t, err, "error not occurred when getting blockhash for a blocknumber which was not stored in BHS contract")
+
+ var wg sync.WaitGroup
+ wg.Add(1)
+ _, err = actions.WaitForBlockNumberToBe(randRequestBlockNumber+uint64(*config.VRFv2Plus.General.BHSJobWaitBlocks+10), env.EVMClient, &wg, time.Minute*1, t)
+ wg.Wait()
+ require.NoError(t, err, "error waiting for blocknumber to be")
+
+ err = env.EVMClient.WaitForEvents()
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
+ metrics, err := vrfContracts.VRFV2PlusConsumer[0].GetLoadTestMetrics(testcontext.Get(t))
+ require.Equal(t, 0, metrics.RequestCount.Cmp(big.NewInt(1)))
+ require.Equal(t, 0, metrics.FulfilmentCount.Cmp(big.NewInt(0)))
+
+ var clNodeTxs *client.TransactionsData
+ var txHash string
+ gom := gomega.NewGomegaWithT(t)
+ gom.Eventually(func(g gomega.Gomega) {
+ clNodeTxs, _, err = nodesMap[vrfcommon.BHS].CLNode.API.ReadTransactions()
+ g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting CL Node transactions")
+ l.Debug().Int("Number of TXs", len(clNodeTxs.Data)).Msg("BHS Node txs")
+ g.Expect(len(clNodeTxs.Data)).Should(gomega.BeNumerically("==", 1), "Expected 1 tx posted by BHS Node, but found %d", len(clNodeTxs.Data))
+ txHash = clNodeTxs.Data[0].Attributes.Hash
+ }, "2m", "1s").Should(gomega.Succeed())
+
+ require.Equal(t, strings.ToLower(vrfContracts.BHS.Address()), strings.ToLower(clNodeTxs.Data[0].Attributes.To))
+
+ bhsStoreTx, _, err := actions.GetTxByHash(testcontext.Get(t), env.EVMClient, common.HexToHash(txHash))
+ require.NoError(t, err, "error getting tx from hash")
+
+ bhsStoreTxInputData, err := actions.DecodeTxInputData(blockhash_store.BlockhashStoreABI, bhsStoreTx.Data())
+ l.Info().
+ Str("Block Number", bhsStoreTxInputData["n"].(*big.Int).String()).
+ Msg("BHS Node's Store Blockhash for Blocknumber Method TX")
+ require.Equal(t, randRequestBlockNumber, bhsStoreTxInputData["n"].(*big.Int).Uint64())
+
+ err = env.EVMClient.WaitForEvents()
+ require.NoError(t, err, vrfcommon.ErrWaitTXsComplete)
+
+ var randRequestBlockHash [32]byte
+ gom.Eventually(func(g gomega.Gomega) {
+ randRequestBlockHash, err = vrfContracts.BHS.GetBlockHash(testcontext.Get(t), big.NewInt(int64(randRequestBlockNumber)))
+ g.Expect(err).ShouldNot(gomega.HaveOccurred(), "error getting blockhash for a blocknumber which was stored in BHS contract")
+ }, "2m", "1s").Should(gomega.Succeed())
+ l.Info().
+ Str("Randomness Request's Blockhash", randomWordsRequestedEvent.Raw.BlockHash.String()).
+ Str("Block Hash stored by BHS contract", fmt.Sprintf("0x%x", randRequestBlockHash)).
+ Msg("BHS Contract's stored Blockhash for Randomness Request")
+ require.Equal(t, 0, randomWordsRequestedEvent.Raw.BlockHash.Cmp(randRequestBlockHash))
+ })
+}
+
+func TestVRFv2PlusPendingBlockSimulationAndZeroConfirmationDelays(t *testing.T) {
+ t.Parallel()
+ l := logging.GetTestLogger(t)
+
+ config, err := tc.GetConfig("Smoke", tc.VRFv2Plus)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // override config with minConf = 0 and use pending block for simulation
+ config.VRFv2Plus.General.MinimumConfirmations = ptr.Ptr[uint16](0)
+ config.VRFv2Plus.General.VRFJobSimulationBlock = ptr.Ptr[string]("pending")
+
+ network, err := actions.EthereumNetworkConfigFromConfig(l, &config)
+ require.NoError(t, err, "Error building ethereum network config")
+
+ env, err := test_env.NewCLTestEnvBuilder().
+ WithTestInstance(t).
+ WithTestConfig(&config).
+ WithPrivateEthereumNetwork(network).
+ WithCLNodes(1).
+ WithFunding(big.NewFloat(*config.Common.ChainlinkNodeFunding)).
+ WithStandardCleanup().
+ Build()
+ require.NoError(t, err, "error creating test env")
+
+ env.ParallelTransactions(true)
+
+ mockETHLinkFeed, err := actions.DeployMockETHLinkFeed(env.ContractDeployer, big.NewInt(*config.VRFv2Plus.General.LinkNativeFeedResponse))
+ require.NoError(t, err, "error deploying mock ETH/LINK feed")
+
+ linkToken, err := actions.DeployLINKToken(env.ContractDeployer)
+ require.NoError(t, err, "error deploying LINK contract")
+
+ numberOfTxKeysToCreate := 2
+ vrfv2PlusContracts, subIDs, vrfv2PlusData, nodesMap, err := vrfv2plus.SetupVRFV2_5Environment(
+ env,
+ []vrfcommon.VRFNodeType{vrfcommon.VRF},
+ &config,
+ linkToken,
+ mockETHLinkFeed,
+ numberOfTxKeysToCreate,
+ 1,
+ 1,
+ l,
+ )
+ require.NoError(t, err, "error setting up VRF v2_5 env")
+
+ subID := subIDs[0]
+
+ subscription, err := vrfv2PlusContracts.CoordinatorV2Plus.GetSubscription(testcontext.Get(t), subID)
+ require.NoError(t, err, "error getting subscription information")
+
+ vrfv2plus.LogSubDetails(l, subscription, subID, vrfv2PlusContracts.CoordinatorV2Plus)
+
+ var isNativeBilling = false
+
+ jobRunsBeforeTest, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(nodesMap[vrfcommon.VRF].Job.Data.ID)
+ require.NoError(t, err, "error reading job runs")
+
+ l.Info().Uint16("minimumConfirmationDelay", *config.VRFv2Plus.General.MinimumConfirmations).Msg("Minimum Confirmation Delay")
+
+ // test and assert
+ randomWordsFulfilledEvent, err := vrfv2plus.RequestRandomnessAndWaitForFulfillment(
+ vrfv2PlusContracts.VRFV2PlusConsumer[0],
+ vrfv2PlusContracts.CoordinatorV2Plus,
+ vrfv2PlusData,
+ subID,
+ isNativeBilling,
+ *config.VRFv2Plus.General.MinimumConfirmations,
+ *config.VRFv2Plus.General.CallbackGasLimit,
+ *config.VRFv2Plus.General.NumberOfWords,
+ *config.VRFv2Plus.General.RandomnessRequestCountPerRequest,
+ *config.VRFv2Plus.General.RandomnessRequestCountPerRequestDeviation,
+ config.VRFv2Plus.General.RandomWordsFulfilledEventTimeout.Duration,
+ l,
+ )
+ require.NoError(t, err, "error requesting randomness and waiting for fulfilment")
+
+ jobRuns, err := env.ClCluster.Nodes[0].API.MustReadRunsByJob(nodesMap[vrfcommon.VRF].Job.Data.ID)
+ require.NoError(t, err, "error reading job runs")
+ require.Equal(t, len(jobRunsBeforeTest.Data)+1, len(jobRuns.Data))
+
+ status, err := vrfv2PlusContracts.VRFV2PlusConsumer[0].GetRequestStatus(testcontext.Get(t), randomWordsFulfilledEvent.RequestId)
+ require.NoError(t, err, "error getting rand request status")
+ require.True(t, status.Fulfilled)
+ l.Debug().Bool("Fulfilment Status", status.Fulfilled).Msg("Random Words Request Fulfilment Status")
+}
diff --git a/integration-tests/testconfig/ocr2/example.toml b/integration-tests/testconfig/ocr2/example.toml
new file mode 100644
index 00000000000..6cbdbef1555
--- /dev/null
+++ b/integration-tests/testconfig/ocr2/example.toml
@@ -0,0 +1,96 @@
+# Example of full config with all fields
+# General part
+[ChainlinkImage]
+image="public.ecr.aws/chainlink/chainlink"
+version="2.7.0"
+
+[Logging]
+# if set to true will save logs even if test did not fail
+test_log_collect=false
+
+[Logging.LogStream]
+# supported targets: file, loki, in-memory. if empty no logs will be persistet
+log_targets=["file"]
+# context timeout for starting log producer and also time-frame for requesting logs
+log_producer_timeout="10s"
+# number of retries before log producer gives up and stops listening to logs
+log_producer_retry_limit=10
+
+[Logging.Loki]
+tenant_id="tenant_id"
+# full URL of Loki ingest endpoint
+endpoint="https://loki.url/api/v3/push"
+# currently only needed when using public instance
+basic_auth="loki-basic-auth"
+# only needed for cloud grafana
+bearer_token="bearer_token"
+
+# LogStream will try to shorten Grafana URLs by default (if all 3 variables are set)
+[Logging.Grafana]
+# grafana url (trailing "/" will be stripped)
+base_url="http://grafana.url"
+# url of your grafana dashboard (prefix and suffix "/" are stirpped), example: /d/ad61652-2712-1722/my-dashboard
+dashboard_url="/d/your-dashboard"
+bearer_token="my-awesome-token"
+
+# if you want to use polygon_mumbial
+[Network]
+selected_networks=["polygon_mumbai"]
+
+[Network.RpcHttpUrls]
+polygon_mumbai = ["https://my-rpc-endpoint.io"]
+
+[Network.RpcWsUrls]
+polygon_mumbai = ["https://my-rpc-endpoint.io"]
+
+[Network.WalletKeys]
+polygon_mumbai = ["change-me-to-your-PK"]
+
+[PrivateEthereumNetwork]
+# pos or pow
+consensus_type="pos"
+# only prysm supported currently
+consensus_layer="prysm"
+# geth, besu, nethermind or erigon
+execution_layer="geth"
+# if true after env started it will wait for at least 1 epoch to be finalised before continuing
+wait_for_finalization=false
+
+[PrivateEthereumNetwork.EthereumChainConfig]
+# duration of single slot, lower => faster block production, must be >= 4
+seconds_per_slot=12
+# numer of slots in epoch, lower => faster epoch finalisation, must be >= 4
+slots_per_epoch=6
+# extra genesis gelay, no need to modify, but it should be after all validators/beacon chain starts
+genesis_delay=15
+# number of validators in the network
+validator_count=8
+chain_id=1337
+# list of addresses to be prefunded in genesis
+addresses_to_fund=["0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"]
+
+# load test specific configuration
+[Load.OCR]
+[Load.OCR.Common]
+eth_funds = 3
+
+[Load.OCR.Load]
+test_duration = "3m"
+rate_limit_unit_duration = "1m"
+rate = 3
+verification_interval = "5s"
+verification_timeout = "3m"
+ea_change_interval = "5s"
+
+# soak test specific configuration
+[Soak.Common]
+chainlink_node_funding = 100
+
+[Soak.OCR]
+[Soak.OCR.Common]
+test_duration="15m"
+
+[Soak.OCR.Soak]
+ocr_version="1"
+number_of_contracts=2
+time_between_rounds="1m"
\ No newline at end of file
diff --git a/integration-tests/testconfig/ocr2/ocr2.go b/integration-tests/testconfig/ocr2/ocr2.go
new file mode 100644
index 00000000000..c039de0ff6f
--- /dev/null
+++ b/integration-tests/testconfig/ocr2/ocr2.go
@@ -0,0 +1,57 @@
+package ocr
+
+import (
+ "errors"
+
+ "github.com/smartcontractkit/chainlink-testing-framework/blockchain"
+)
+
+type Config struct {
+ Soak *SoakConfig `toml:"Soak"`
+ Common *Common `toml:"Common"`
+}
+
+func (o *Config) Validate() error {
+ if o.Common != nil {
+ if err := o.Common.Validate(); err != nil {
+ return err
+ }
+ }
+ if o.Soak != nil {
+ if err := o.Soak.Validate(); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+type Common struct {
+ ETHFunds *int `toml:"eth_funds"`
+ TestDuration *blockchain.StrDuration `toml:"test_duration"`
+}
+
+func (o *Common) Validate() error {
+ if o.ETHFunds != nil && *o.ETHFunds < 0 {
+ return errors.New("eth_funds must be set and cannot be negative")
+ }
+ return nil
+}
+
+type SoakConfig struct {
+ OCRVersion *string `toml:"ocr_version"`
+ NumberOfContracts *int `toml:"number_of_contracts"`
+ TimeBetweenRounds *blockchain.StrDuration `toml:"time_between_rounds"`
+}
+
+func (o *SoakConfig) Validate() error {
+ if o.OCRVersion == nil || *o.OCRVersion == "" {
+ return errors.New("ocr_version must be set to either 1 or 2")
+ }
+ if o.NumberOfContracts == nil || *o.NumberOfContracts <= 1 {
+ return errors.New("number_of_contracts must be set and be greater than 1")
+ }
+ if o.TimeBetweenRounds == nil || o.TimeBetweenRounds.Duration == 0 {
+ return errors.New("time_between_rounds must be set and be a positive integer")
+ }
+ return nil
+}
diff --git a/integration-tests/testconfig/ocr2/ocr2.toml b/integration-tests/testconfig/ocr2/ocr2.toml
new file mode 100644
index 00000000000..8d3c73ca761
--- /dev/null
+++ b/integration-tests/testconfig/ocr2/ocr2.toml
@@ -0,0 +1,43 @@
+# product defaults
+[Common]
+chainlink_node_funding = 0.5
+
+# load test specific configuration
+[Load.OCR]
+[Load.OCR.Common]
+eth_funds = 3
+
+[Load.OCR.Load]
+test_duration = "3m"
+rate_limit_unit_duration = "1m"
+rate = 3
+verification_interval = "5s"
+verification_timeout = "3m"
+ea_change_interval = "5s"
+
+# volume test specific configuration
+[Volume.OCR]
+[Volume.OCR.Common]
+eth_funds = 3
+
+[Volume.OCR.Volume]
+test_duration = "3m"
+rate_limit_unit_duration = "1m"
+vu_requests_per_unit = 10
+rate = 1
+verification_interval = "5s"
+verification_timeout = "3m"
+ea_change_interval = "5s"
+
+# soak test specific configuration
+[Soak.Common]
+chainlink_node_funding = 100
+
+[Soak.OCR]
+[Soak.OCR.Common]
+test_duration="15m"
+
+[Soak.OCR.Soak]
+ocr_version="1"
+number_of_contracts=2
+time_between_rounds="1m"
\ No newline at end of file
diff --git a/integration-tests/testconfig/testconfig.go b/integration-tests/testconfig/testconfig.go
index c80202bf45c..18249cd790e 100644
--- a/integration-tests/testconfig/testconfig.go
+++ b/integration-tests/testconfig/testconfig.go
@@ -27,6 +27,7 @@ import (
keeper_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/keeper"
lp_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/log_poller"
ocr_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/ocr"
+ ocr2_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/ocr2"
vrf_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/vrf"
vrfv2_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/vrfv2"
vrfv2plus_config "github.com/smartcontractkit/chainlink/integration-tests/testconfig/vrfv2plus"
@@ -68,6 +69,10 @@ type OcrTestConfig interface {
GetOCRConfig() *ocr_config.Config
}
+type Ocr2TestConfig interface {
+ GetOCR2Config() *ocr2_config.Config
+}
+
type NamedConfiguration interface {
GetConfigurationName() string
}
@@ -86,6 +91,7 @@ type TestConfig struct {
Keeper *keeper_config.Config `toml:"Keeper"`
LogPoller *lp_config.Config `toml:"LogPoller"`
OCR *ocr_config.Config `toml:"OCR"`
+ OCR2 *ocr2_config.Config `toml:"OCR2"`
VRF *vrf_config.Config `toml:"VRF"`
VRFv2 *vrfv2_config.Config `toml:"VRFv2"`
VRFv2Plus *vrfv2plus_config.Config `toml:"VRFv2Plus"`
@@ -202,6 +208,15 @@ func (c TestConfig) GetConfigurationName() string {
return c.ConfigurationName
}
+func (c *TestConfig) AsBase64() (string, error) {
+ content, err := toml.Marshal(*c)
+ if err != nil {
+ return "", errors.Wrapf(err, "error marshaling test config")
+ }
+
+ return base64.StdEncoding.EncodeToString(content), nil
+}
+
type Common struct {
ChainlinkNodeFunding *float64 `toml:"chainlink_node_funding"`
}
diff --git a/integration-tests/testconfig/vrfv2/config.go b/integration-tests/testconfig/vrfv2/config.go
index f539d91799c..c9037b59085 100644
--- a/integration-tests/testconfig/vrfv2/config.go
+++ b/integration-tests/testconfig/vrfv2/config.go
@@ -198,7 +198,7 @@ func (c *SubFunding) Validate() error {
}
type General struct {
- CLNodeMaxGasPriceGWei *int64 `toml:"max_gas_price_gwei"` // Max gas price in GWei for the chainlink node
+ CLNodeMaxGasPriceGWei *int64 `toml:"cl_node_max_gas_price_gwei"` // Max gas price in GWei for the chainlink node
LinkNativeFeedResponse *int64 `toml:"link_native_feed_response"` // Response of the LINK/ETH feed
MinimumConfirmations *uint16 `toml:"minimum_confirmations" ` // Minimum number of confirmations for the VRF Coordinator
SubscriptionFundingAmountLink *float64 `toml:"subscription_funding_amount_link"` // Amount of LINK to fund the subscription with
@@ -232,6 +232,21 @@ type General struct {
WrapperMaxNumberOfWords *uint8 `toml:"wrapper_max_number_of_words"`
WrapperConsumerFundingAmountNativeToken *float64 `toml:"wrapper_consumer_funding_amount_native_token"`
WrapperConsumerFundingAmountLink *int64 `toml:"wrapper_consumer_funding_amount_link"`
+
+ //VRF Job Config
+ VRFJobForwardingAllowed *bool `toml:"vrf_job_forwarding_allowed"`
+ VRFJobEstimateGasMultiplier *float64 `toml:"vrf_job_estimate_gas_multiplier"`
+ VRFJobBatchFulfillmentEnabled *bool `toml:"vrf_job_batch_fulfillment_enabled"`
+ VRFJobBatchFulfillmentGasMultiplier *float64 `toml:"vrf_job_batch_fulfillment_gas_multiplier"`
+ VRFJobPollPeriod *blockchain.StrDuration `toml:"vrf_job_poll_period"`
+ VRFJobRequestTimeout *blockchain.StrDuration `toml:"vrf_job_request_timeout"`
+ VRFJobSimulationBlock *string `toml:"vrf_job_simulation_block"`
+
+ //BHS Job Config
+ BHSJobWaitBlocks *int `toml:"bhs_job_wait_blocks"`
+ BHSJobLookBackBlocks *int `toml:"bhs_job_lookback_blocks"`
+ BHSJobPollPeriod *blockchain.StrDuration `toml:"bhs_job_poll_period"`
+ BHSJobRunTimeout *blockchain.StrDuration `toml:"bhs_job_run_timeout"`
}
func (c *General) Validate() error {
@@ -326,5 +341,47 @@ func (c *General) Validate() error {
return errors.New(ErrDeviationShouldBeLessThanOriginal)
}
+ if c.VRFJobForwardingAllowed == nil {
+ return errors.New("vrf_job_forwarding_allowed must be set")
+ }
+
+ if c.VRFJobBatchFulfillmentEnabled == nil {
+ return errors.New("vrf_job_batch_fulfillment_enabled must be set")
+ }
+ if c.VRFJobEstimateGasMultiplier == nil || *c.VRFJobEstimateGasMultiplier < 0 {
+ return errors.New("vrf_job_estimate_gas_multiplier must be set to a non-negative value")
+ }
+ if c.VRFJobBatchFulfillmentGasMultiplier == nil || *c.VRFJobBatchFulfillmentGasMultiplier < 0 {
+ return errors.New("vrf_job_batch_fulfillment_gas_multiplier must be set to a non-negative value")
+ }
+
+ if c.VRFJobPollPeriod == nil || c.VRFJobPollPeriod.Duration == 0 {
+ return errors.New("vrf_job_poll_period must be set to a non-negative value")
+ }
+
+ if c.VRFJobRequestTimeout == nil || c.VRFJobRequestTimeout.Duration == 0 {
+ return errors.New("vrf_job_request_timeout must be set to a non-negative value")
+ }
+
+ if c.BHSJobLookBackBlocks == nil || *c.BHSJobLookBackBlocks < 0 {
+ return errors.New("bhs_job_lookback_blocks must be set to a non-negative value")
+ }
+
+ if c.BHSJobPollPeriod == nil || c.BHSJobPollPeriod.Duration == 0 {
+ return errors.New("bhs_job_poll_period must be set to a non-negative value")
+ }
+
+ if c.BHSJobRunTimeout == nil || c.BHSJobRunTimeout.Duration == 0 {
+ return errors.New("bhs_job_run_timeout must be set to a non-negative value")
+ }
+
+ if c.BHSJobWaitBlocks == nil || *c.BHSJobWaitBlocks < 0 {
+ return errors.New("bhs_job_wait_blocks must be set to a non-negative value")
+ }
+
+ if c.VRFJobSimulationBlock != nil && (*c.VRFJobSimulationBlock != "latest" && *c.VRFJobSimulationBlock != "pending") {
+ return errors.New("simulation_block must be nil or \"latest\" or \"pending\"")
+ }
+
return nil
}
diff --git a/integration-tests/testconfig/vrfv2/vrfv2.toml b/integration-tests/testconfig/vrfv2/vrfv2.toml
index 64e628c4afa..a4f4536208a 100644
--- a/integration-tests/testconfig/vrfv2/vrfv2.toml
+++ b/integration-tests/testconfig/vrfv2/vrfv2.toml
@@ -4,7 +4,7 @@ chainlink_node_funding = 0.1
[VRFv2]
[VRFv2.General]
-max_gas_price_gwei = 10
+cl_node_max_gas_price_gwei = 10
link_native_feed_response = 1000000000000000000
minimum_confirmations = 3
subscription_funding_amount_link = 5.0
@@ -34,6 +34,20 @@ wrapper_max_number_of_words = 10
wrapper_consumer_funding_amount_native_token = 1.0
wrapper_consumer_funding_amount_link = 10
+# VRF Job config
+vrf_job_forwarding_allowed = false
+vrf_job_estimate_gas_multiplier = 1.0
+vrf_job_batch_fulfillment_enabled = false
+vrf_job_batch_fulfillment_gas_multiplier = 1.15
+vrf_job_poll_period = "1s"
+vrf_job_request_timeout = "24h"
+
+# BHS Job config
+bhs_job_wait_blocks = 30
+bhs_job_lookback_blocks = 250
+bhs_job_poll_period = "1s"
+bhs_job_run_timeout = "24h"
+
# load test specific config
[Load.VRFv2]
[Load.VRFv2.Common]
diff --git a/integration-tests/testconfig/vrfv2plus/config.go b/integration-tests/testconfig/vrfv2plus/config.go
index 667803e06b6..b300b75dfc4 100644
--- a/integration-tests/testconfig/vrfv2plus/config.go
+++ b/integration-tests/testconfig/vrfv2plus/config.go
@@ -68,10 +68,13 @@ func (c *Common) Validate() error {
type General struct {
*vrfv2.General
- SubscriptionBillingType *string `toml:"subscription_billing_type"` // Billing type for the subscription
- SubscriptionFundingAmountNative *float64 `toml:"subscription_funding_amount_native"` // Amount of LINK to fund the subscription with
- FulfillmentFlatFeeLinkPPM *uint32 `toml:"fulfillment_flat_fee_link_ppm"` // Flat fee in ppm for LINK for the VRF Coordinator config
- FulfillmentFlatFeeNativePPM *uint32 `toml:"fulfillment_flat_fee_native_ppm"` // Flat fee in ppm for native currency for the VRF Coordinator config
+ SubscriptionBillingType *string `toml:"subscription_billing_type"` // Billing type for the subscription
+ SubscriptionFundingAmountNative *float64 `toml:"subscription_funding_amount_native"` // Amount of LINK to fund the subscription with
+ FulfillmentFlatFeeNativePPM *uint32 `toml:"fulfillment_flat_fee_native_ppm"` // Flat fee in ppm for native currency for the VRF Coordinator config
+ FulfillmentFlatFeeLinkPPM *uint32 `toml:"fulfillment_flat_fee_link_ppm"` // Flat fee in ppm for LINK for the VRF Coordinator config
+ FulfillmentFlatFeeLinkDiscountPPM *uint32 `toml:"fulfillment_flat_fee_link_discount_ppm"` // Flat fee discount in ppm for LINK for the VRF Coordinator config
+ NativePremiumPercentage *uint8 `toml:"native_premium_percentage"` // Native Premium Percentage
+ LinkPremiumPercentage *uint8 `toml:"link_premium_percentage"` // LINK Premium Percentage
}
func (c *General) Validate() error {
@@ -84,11 +87,20 @@ func (c *General) Validate() error {
if c.SubscriptionFundingAmountNative == nil || *c.SubscriptionFundingAmountNative <= 0 {
return errors.New("subscription_funding_amount_native must be greater than 0")
}
- if c.FulfillmentFlatFeeLinkPPM == nil || *c.FulfillmentFlatFeeLinkPPM <= 0 {
- return errors.New("fulfillment_flat_fee_link_ppm must be greater than 0")
+ if c.FulfillmentFlatFeeNativePPM == nil {
+ return errors.New("fulfillment_flat_fee_native_ppm must not be nil")
}
- if c.FulfillmentFlatFeeNativePPM == nil || *c.FulfillmentFlatFeeNativePPM <= 0 {
- return errors.New("fulfillment_flat_fee_native_ppm must be greater than 0")
+ if c.FulfillmentFlatFeeLinkPPM == nil {
+ return errors.New("fulfillment_flat_fee_link_ppm must not be nil")
+ }
+ if c.FulfillmentFlatFeeLinkDiscountPPM == nil {
+ return errors.New("fulfillment_flat_fee_link_discount_ppm must not be nil")
+ }
+ if c.NativePremiumPercentage == nil {
+ return errors.New("native_premium_percentage must not be nil")
+ }
+ if c.LinkPremiumPercentage == nil {
+ return errors.New("link_premium_percentage must not be nil")
}
return nil
diff --git a/integration-tests/testconfig/vrfv2plus/example.toml b/integration-tests/testconfig/vrfv2plus/example.toml
index a9ce5b2dcf5..6595dce18ca 100644
--- a/integration-tests/testconfig/vrfv2plus/example.toml
+++ b/integration-tests/testconfig/vrfv2plus/example.toml
@@ -112,6 +112,9 @@ wrapper_consumer_funding_amount_link = 10
subscription_funding_amount_native=1
fulfillment_flat_fee_link_ppm=500
fulfillment_flat_fee_native_ppm=500
+fulfillment_flat_fee_link_discount_ppm=100
+native_premium_percentage=1
+link_premium_percentage=1
[VRFv2Plus.Performance]
test_duration = "2m"
diff --git a/integration-tests/testconfig/vrfv2plus/vrfv2plus.toml b/integration-tests/testconfig/vrfv2plus/vrfv2plus.toml
index 5e187d9de3a..79f328e278f 100644
--- a/integration-tests/testconfig/vrfv2plus/vrfv2plus.toml
+++ b/integration-tests/testconfig/vrfv2plus/vrfv2plus.toml
@@ -4,7 +4,7 @@ chainlink_node_funding = 0.1
[VRFv2Plus]
[VRFv2Plus.General]
-max_gas_price_gwei = 10
+cl_node_max_gas_price_gwei = 10
link_native_feed_response = 1000000000000000000
minimum_confirmations = 3
subscription_billing_type = "LINK_AND_NATIVE"
@@ -37,6 +37,23 @@ wrapper_consumer_funding_amount_link = 10
subscription_funding_amount_native=1
fulfillment_flat_fee_link_ppm=500
fulfillment_flat_fee_native_ppm=500
+fulfillment_flat_fee_link_discount_ppm=100
+native_premium_percentage=1
+link_premium_percentage=1
+
+# VRF Job config
+vrf_job_forwarding_allowed = false
+vrf_job_estimate_gas_multiplier = 1.0
+vrf_job_batch_fulfillment_enabled = false
+vrf_job_batch_fulfillment_gas_multiplier = 1.15
+vrf_job_poll_period = "1s"
+vrf_job_request_timeout = "24h"
+
+# BHS Job config
+bhs_job_wait_blocks = 30
+bhs_job_lookback_blocks = 250
+bhs_job_poll_period = "1s"
+bhs_job_run_timeout = "24h"
# load test specific config
[Load.VRFv2Plus]
diff --git a/integration-tests/types/testconfigs.go b/integration-tests/types/testconfigs.go
index 0c704f0cd7b..6eab6ec0678 100644
--- a/integration-tests/types/testconfigs.go
+++ b/integration-tests/types/testconfigs.go
@@ -42,3 +42,9 @@ type OcrTestConfig interface {
tc.CommonTestConfig
tc.OcrTestConfig
}
+
+type Ocr2TestConfig interface {
+ tc.GlobalTestConfig
+ tc.CommonTestConfig
+ tc.Ocr2TestConfig
+}
diff --git a/plugins/chainlink.Dockerfile b/plugins/chainlink.Dockerfile
index 2f3e46e9ce1..a518b37a9e1 100644
--- a/plugins/chainlink.Dockerfile
+++ b/plugins/chainlink.Dockerfile
@@ -22,6 +22,7 @@ RUN make install-medianpoc
# Link LOOP Plugin source dirs with simple names
RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-feeds | xargs -I % ln -s % /chainlink-feeds
+RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-data-streams | xargs -I % ln -s % /chainlink-data-streams
RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-solana | xargs -I % ln -s % /chainlink-solana
RUN mkdir /chainlink-starknet
RUN go list -m -f "{{.Dir}}" github.com/smartcontractkit/chainlink-starknet/relayer | xargs -I % ln -s % /chainlink-starknet/relayer
@@ -34,6 +35,10 @@ WORKDIR /chainlink-feeds
COPY --from=buildgo /chainlink-feeds .
RUN go install ./cmd/chainlink-feeds
+WORKDIR /chainlink-data-streams
+COPY --from=buildgo /chainlink-data-streams .
+RUN go install ./cmd/chainlink-data-streams/mercury/cmd/chainlink-mercury
+
WORKDIR /chainlink-solana
COPY --from=buildgo /chainlink-solana .
RUN go install ./pkg/solana/cmd/chainlink-solana
@@ -60,6 +65,8 @@ COPY --from=buildgo /go/bin/chainlink-medianpoc /usr/local/bin/
COPY --from=buildplugins /go/bin/chainlink-feeds /usr/local/bin/
ENV CL_MEDIAN_CMD chainlink-feeds
+COPY --from=buildplugins /go/bin/chainlink-mercury /usr/local/bin/
+ENV CL_MERCURY_CMD chainlink-mercury
COPY --from=buildplugins /go/bin/chainlink-solana /usr/local/bin/
ENV CL_SOLANA_CMD chainlink-solana
COPY --from=buildplugins /go/bin/chainlink-starknet /usr/local/bin/
diff --git a/shell.nix b/shell.nix
index ff4381b49c1..7881af59ba2 100644
--- a/shell.nix
+++ b/shell.nix
@@ -30,6 +30,7 @@ mkShell {
delve
golangci-lint
github-cli
+ jq
# deployment
devspace
diff --git a/sonar-project.properties b/sonar-project.properties
index 6ffaba8b19b..c5a2eb33ad2 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -1,15 +1,63 @@
sonar.projectKey=smartcontractkit_chainlink
sonar.sources=.
+sonar.sourceEncoding=UTF-8
sonar.python.version=3.8
# Full exclusions from the static analysis
-sonar.exclusions=**/node_modules/**/*,**/mocks/**/*, **/testdata/**/*, **/contracts/typechain/**/*, **/contracts/artifacts/**/*, **/contracts/cache/**/*, **/contracts/scripts/**/*, **/generated/**/*, **/fixtures/**/*, **/docs/**/*, **/tools/**/*, **/*.pb.go, **/*report.xml, **/*.config.ts, **/*.txt, **/*.abi, **/*.bin, **/*_codecgen.go, core/services/relay/evm/types/*_gen.go, core/services/relay/evm/types/gen/main.go, core/services/relay/evm/testfiles/*, **/core/web/assets**, core/scripts/chaincli/handler/debug.go
+sonar.exclusions=\
+**/node_modules/**/*,\
+**/mocks/**/*,\
+**/testdata/**/*,\
+**/contracts/typechain/**/*,\
+**/contracts/artifacts/**/*,\
+**/contracts/cache/**/*,\
+**/contracts/scripts/**/*,\
+**/generated/**/*,\
+**/fixtures/**/*,\
+**/testutils/**/*,\
+**/gen/**/*,\
+**/testfiles/**/*,\
+**/testconfig/**/*,\
+**/core/web/assets/**/*,\
+**/core/scripts/**/*,\
+**/docs/**/*,\
+**/tools/**/*,\
+**/fuzz/**/*,\
+**/*.pb.go,\
+**/*report.xml,\
+**/*.config.ts,\
+**/*.txt,\
+**/*.abi,\
+**/*.bin,\
+**/*_codecgen.go,\
+**/*_gen.go,\
+**/debug.go
+
# Coverage exclusions
-sonar.coverage.exclusions=**/*.test.ts, **/*_test.go, **/contracts/test/**/*, **/contracts/**/tests/**/*, **/core/**/testutils/**/*, **/core/**/mocks/**/*, **/core/**/cltest/**/*, **/integration-tests/**/*, **/generated/**/*, **/core/scripts**/* , **/*.pb.go, ./plugins/**/*, **/main.go, **/0195_add_not_null_to_evm_chain_id_in_job_specs.go, **/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go
-# Duplication exclusions
-sonar.cpd.exclusions=**/contracts/**/*.sol, **/config.go, /core/services/ocr2/plugins/ocr2keeper/evm*/*
+sonar.coverage.exclusions=\
+**/*.test.ts,\
+**/*_test.go,\
+**/contracts/test/**/*,\
+**/contracts/**/tests/**/*,\
+**/core/**/cltest/**/*,\
+**/integration-tests/**/*,\
+**/plugins/**/*,\
+**/main.go,\
+**/0195_add_not_null_to_evm_chain_id_in_job_specs.go,\
+**/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/streams/streams.go
+
+# Duplication exclusions: mercury excluded because current MercuryProvider and Factory APIs are inherently duplicated due to embedded versioning
+sonar.cpd.exclusions=\
+**/contracts/**/*.sol,\
+**/config.go,\
+**/core/services/ocr2/plugins/ocr2keeper/evm/**/*,\
+**/core/services/ocr2/plugins/mercury/plugin.go
# Tests' root folder, inclusions (tests to check and count) and exclusions
sonar.tests=.
-sonar.test.inclusions=**/*_test.go, **/*.test.ts
-sonar.test.exclusions=**/integration-tests/**/*, **/charts/chainlink-cluster/dashboard/cmd/*
+sonar.test.inclusions=\
+**/*_test.go,\
+**/*.test.ts
+sonar.test.exclusions=\
+**/integration-tests/**/*,\
+**/charts/chainlink-cluster/dashboard/cmd/**/*
\ No newline at end of file
diff --git a/testdata/scripts/health/default.txtar b/testdata/scripts/health/default.txtar
index 15be9da1fe6..4ca7fba9254 100644
--- a/testdata/scripts/health/default.txtar
+++ b/testdata/scripts/health/default.txtar
@@ -31,14 +31,14 @@ fj293fbBnlQ!f9vNs
HTTPPort = $PORT
-- out.txt --
--JobSpawner
--Mailbox.Monitor
--Mercury.WSRPCPool
--Mercury.WSRPCPool.CacheSet
--PipelineORM
--PipelineRunner
--PromReporter
--TelemetryManager
+ok JobSpawner
+ok Mailbox.Monitor
+ok Mercury.WSRPCPool
+ok Mercury.WSRPCPool.CacheSet
+ok PipelineORM
+ok PipelineRunner
+ok PromReporter
+ok TelemetryManager
-- out.json --
{
diff --git a/testdata/scripts/health/multi-chain.txtar b/testdata/scripts/health/multi-chain.txtar
index 6a6adb895cb..112d9e3cdb1 100644
--- a/testdata/scripts/health/multi-chain.txtar
+++ b/testdata/scripts/health/multi-chain.txtar
@@ -60,30 +60,30 @@ Name = 'primary'
URL = 'http://stark.node'
-- out.txt --
--Cosmos.Foo.Chain
--Cosmos.Foo.Txm
--EVM.1
--EVM.1.BalanceMonitor
--EVM.1.HeadBroadcaster
--EVM.1.HeadTracker
-!EVM.1.HeadTracker.HeadListener
+ok Cosmos.Foo.Chain
+ok Cosmos.Foo.Txm
+ok EVM.1
+ok EVM.1.BalanceMonitor
+ok EVM.1.HeadBroadcaster
+ok EVM.1.HeadTracker
+! EVM.1.HeadTracker.HeadListener
Listener is not connected
--EVM.1.LogBroadcaster
--EVM.1.Txm
--EVM.1.Txm.BlockHistoryEstimator
--EVM.1.Txm.Broadcaster
--EVM.1.Txm.Confirmer
--EVM.1.Txm.WrappedEvmEstimator
--JobSpawner
--Mailbox.Monitor
--Mercury.WSRPCPool
--Mercury.WSRPCPool.CacheSet
--PipelineORM
--PipelineRunner
--PromReporter
--Solana.Bar
--StarkNet.Baz
--TelemetryManager
+ok EVM.1.LogBroadcaster
+ok EVM.1.Txm
+ok EVM.1.Txm.BlockHistoryEstimator
+ok EVM.1.Txm.Broadcaster
+ok EVM.1.Txm.Confirmer
+ok EVM.1.Txm.WrappedEvmEstimator
+ok JobSpawner
+ok Mailbox.Monitor
+ok Mercury.WSRPCPool
+ok Mercury.WSRPCPool.CacheSet
+ok PipelineORM
+ok PipelineRunner
+ok PromReporter
+ok Solana.Bar
+ok StarkNet.Baz
+ok TelemetryManager
-- out.json --
{
diff --git a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar
index 187e4d16328..648c94ed2a1 100644
--- a/testdata/scripts/node/validate/disk-based-logging-disabled.txtar
+++ b/testdata/scripts/node/validate/disk-based-logging-disabled.txtar
@@ -361,7 +361,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'fake'
diff --git a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar
index cd61c8e477b..dc7f87375a0 100644
--- a/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar
+++ b/testdata/scripts/node/validate/disk-based-logging-no-dir.txtar
@@ -361,7 +361,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'fake'
diff --git a/testdata/scripts/node/validate/disk-based-logging.txtar b/testdata/scripts/node/validate/disk-based-logging.txtar
index f87352fd482..25cba748c78 100644
--- a/testdata/scripts/node/validate/disk-based-logging.txtar
+++ b/testdata/scripts/node/validate/disk-based-logging.txtar
@@ -361,7 +361,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'fake'
diff --git a/testdata/scripts/node/validate/invalid.txtar b/testdata/scripts/node/validate/invalid.txtar
index f2f1f0a4ee1..036d9544e74 100644
--- a/testdata/scripts/node/validate/invalid.txtar
+++ b/testdata/scripts/node/validate/invalid.txtar
@@ -351,7 +351,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'fake'
diff --git a/testdata/scripts/node/validate/valid.txtar b/testdata/scripts/node/validate/valid.txtar
index 0f99fb3f6d8..6a95692d295 100644
--- a/testdata/scripts/node/validate/valid.txtar
+++ b/testdata/scripts/node/validate/valid.txtar
@@ -358,7 +358,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'fake'
diff --git a/tools/bin/go_core_fuzz b/tools/bin/go_core_fuzz
index 3ea7d9bb0cb..c3119f4beb4 100755
--- a/tools/bin/go_core_fuzz
+++ b/tools/bin/go_core_fuzz
@@ -6,9 +6,8 @@ SCRIPT_PATH=`dirname "$0"`; SCRIPT_PATH=`eval "cd \"$SCRIPT_PATH\" && pwd"`
OUTPUT_FILE=${OUTPUT_FILE:-"./output.txt"}
USE_TEE="${USE_TEE:-true}"
-echo "Failed tests and panics: ---------------------"
+echo "Failed fuzz tests and panics: ---------------------"
echo ""
-GO_LDFLAGS=$(bash tools/bin/ldflags)
use_tee() {
if [ "$USE_TEE" = "true" ]; then
tee "$@"
@@ -16,7 +15,11 @@ use_tee() {
cat > "$@"
fi
}
-go test -json -ldflags "$GO_LDFLAGS" github.com/smartcontractkit/chainlink/v2/core/services/relay/evm -fuzz . -fuzztime 12s | use_tee $OUTPUT_FILE
+
+# the amount of --seconds here is subject to change based on how long the CI job takes in the future
+# as we add more fuzz tests, we should take into consideration increasing this timelapse, so we can have enough coverage.
+# We are timing out after ~10mins in case the tests hang. (Current CI duration is ~8m, modify if needed)
+cd ./fuzz && timeout 10m ./fuzz_all_native.py --ci --seconds 420 | use_tee $OUTPUT_FILE
EXITCODE=${PIPESTATUS[0]}
# Assert no known sensitive strings present in test logger output
@@ -29,8 +32,9 @@ fi
echo "Exit code: $EXITCODE"
if [[ $EXITCODE != 0 ]]; then
- echo "Encountered test failures."
+ echo "Encountered fuzz test failures. Logging all failing fuzz inputs:"
+ find . -type f|fgrep '/testdata/fuzz/'|while read f; do echo $f; cat $f; done
else
- echo "All tests passed!"
+ echo "All fuzz tests passed!"
fi
exit $EXITCODE