From 8b17f459a1371d1dfefbfaee87f31954857d4a2f Mon Sep 17 00:00:00 2001
From: chainchad <96362174+chainchad@users.noreply.github.com>
Date: Mon, 5 Feb 2024 18:06:54 -0500
Subject: [PATCH 01/12] Add helm network policies back (#11940)
* Re-add back network policies.
From commit: dc9a073ab7e67a66eed49dd74e6ac0da1787b24c
* Create network policies conditionally
---
.../templates/chainlink-db-networkpolicy.yaml | 25 +++++++++++
.../chainlink-node-networkpolicy.yaml | 21 +++++++++
.../templates/geth-networkpolicy.yaml | 27 ++++++++++++
.../templates/mockserver-networkpolicy.yaml | 25 +++++++++++
.../templates/networkpolicy-default.yaml | 43 +++++++++++++++++++
.../templates/runner-networkpolicy.yaml | 21 +++++++++
charts/chainlink-cluster/values.yaml | 3 ++
7 files changed, 165 insertions(+)
create mode 100644 charts/chainlink-cluster/templates/chainlink-db-networkpolicy.yaml
create mode 100644 charts/chainlink-cluster/templates/chainlink-node-networkpolicy.yaml
create mode 100644 charts/chainlink-cluster/templates/geth-networkpolicy.yaml
create mode 100644 charts/chainlink-cluster/templates/mockserver-networkpolicy.yaml
create mode 100644 charts/chainlink-cluster/templates/networkpolicy-default.yaml
create mode 100644 charts/chainlink-cluster/templates/runner-networkpolicy.yaml
diff --git a/charts/chainlink-cluster/templates/chainlink-db-networkpolicy.yaml b/charts/chainlink-cluster/templates/chainlink-db-networkpolicy.yaml
new file mode 100644
index 00000000000..5f7e7706ced
--- /dev/null
+++ b/charts/chainlink-cluster/templates/chainlink-db-networkpolicy.yaml
@@ -0,0 +1,25 @@
+{{- if .Values.networkPolicies.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: {{ $.Release.Name }}-db
+spec:
+ podSelector:
+ matchLabels:
+ app: {{ $.Release.Name }}-db
+ policyTypes:
+ - Ingress
+ ingress:
+ - from:
+ # Allow all node pods to access the database pods.
+ - podSelector:
+ matchLabels:
+ app: {{ $.Release.Name }}
+ # Allow all runner pods to access the database pods.
+ - podSelector:
+ matchLabels:
+ app: runner
+ 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
new file mode 100644
index 00000000000..e63759a994f
--- /dev/null
+++ b/charts/chainlink-cluster/templates/chainlink-node-networkpolicy.yaml
@@ -0,0 +1,21 @@
+{{- if .Values.networkPolicies.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: {{ $.Release.Name }}-node
+spec:
+ podSelector:
+ matchLabels:
+ app: {{ $.Release.Name }}
+ policyTypes:
+ - Ingress
+ ingress:
+ # Allow all ingress traffic between the node pods and from runner pod.
+ - from:
+ - podSelector:
+ matchLabels:
+ app: {{ $.Release.Name }}
+ - podSelector:
+ matchLabels:
+ app: runner
+{{- 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
new file mode 100644
index 00000000000..025d6184501
--- /dev/null
+++ b/charts/chainlink-cluster/templates/geth-networkpolicy.yaml
@@ -0,0 +1,27 @@
+{{- if .Values.networkPolicies.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: {{ $.Release.Name }}-geth
+spec:
+ podSelector:
+ matchLabels:
+ app: geth
+ policyTypes:
+ - Ingress
+ ingress:
+ - from:
+ # Allow http and websocket connections from the node pods.
+ - podSelector:
+ matchLabels:
+ app: {{ $.Release.Name }}
+ # Allow http and websocket connections from the runner pods.
+ - podSelector:
+ matchLabels:
+ app: runner
+ ports:
+ - protocol: TCP
+ port: 8544
+ - protocol: TCP
+ port: 8546
+{{- end }}
\ No newline at end of file
diff --git a/charts/chainlink-cluster/templates/mockserver-networkpolicy.yaml b/charts/chainlink-cluster/templates/mockserver-networkpolicy.yaml
new file mode 100644
index 00000000000..6ac4f658e37
--- /dev/null
+++ b/charts/chainlink-cluster/templates/mockserver-networkpolicy.yaml
@@ -0,0 +1,25 @@
+{{- if .Values.networkPolicies.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: {{ $.Release.Name }}-mockserver
+spec:
+ podSelector:
+ matchLabels:
+ app: mockserver
+ policyTypes:
+ - Ingress
+ ingress:
+ - from:
+ # Allow http traffic from the node pods.
+ - podSelector:
+ matchLabels:
+ app: {{ $.Release.Name }}
+ # Allow http traffic from the runner pods.
+ - podSelector:
+ matchLabels:
+ app: runner
+ 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
new file mode 100644
index 00000000000..a2cc23ed7f9
--- /dev/null
+++ b/charts/chainlink-cluster/templates/networkpolicy-default.yaml
@@ -0,0 +1,43 @@
+{{- if .Values.networkPolicies.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: default
+spec:
+ podSelector:
+ matchLabels: {}
+ policyTypes:
+ - Ingress
+ - Egress
+ ingress:
+ {{- if and .Values.networkPolicyDefault.ingress.allowCustomCidrs (not (empty .Values.networkPolicyDefault.ingress.customCidrs)) }}
+ # Using a comma separated list to make it easy to pass in with:
+ # `helm template ... --set networkPolicyDefault.ingress.customCidrs=...`
+ {{- $cidrs := splitList "," .Values.networkPolicyDefault.ingress.customCidrs }}
+ - from:
+ {{- range $cidr := $cidrs }}
+ - ipBlock:
+ cidr: {{ $cidr | quote }}
+ {{- end }}
+ {{- else }}
+ # Deny all ingress if no rules are specified. Rules can still be specified in other templates.
+ - {}
+ {{- end }}
+ egress:
+ - to:
+ - namespaceSelector:
+ matchLabels:
+ kubernetes.io/metadata.name: "{{ $.Release.Namespace }}"
+ - to:
+ - namespaceSelector:
+ matchLabels:
+ kubernetes.io/metadata.name: kube-system
+ podSelector:
+ matchLabels:
+ k8s-app: kube-dns
+ ports:
+ - protocol: TCP
+ 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
new file mode 100644
index 00000000000..b75a2ffa772
--- /dev/null
+++ b/charts/chainlink-cluster/templates/runner-networkpolicy.yaml
@@ -0,0 +1,21 @@
+{{- if .Values.networkPolicies.enabled }}
+apiVersion: networking.k8s.io/v1
+kind: NetworkPolicy
+metadata:
+ name: {{ $.Release.Name }}-runner
+spec:
+ podSelector:
+ matchLabels:
+ app: runner
+ policyTypes:
+ - Ingress
+ ingress:
+ # Allow all ingress traffic between the node pods and from runner pod.
+ - from:
+ - podSelector:
+ matchLabels:
+ app: {{ $.Release.Name }}
+ - 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..3e58cbaea24 100644
--- a/charts/chainlink-cluster/values.yaml
+++ b/charts/chainlink-cluster/values.yaml
@@ -284,6 +284,9 @@ nodeSelector:
tolerations:
affinity:
+networkPolicies:
+ enabled: true
+
# Configure the default network policy.
networkPolicyDefault:
ingress:
From b3ec54a83df3a56d6aa399d2f783c64dabe1920c Mon Sep 17 00:00:00 2001
From: Bolek <1416262+bolekk@users.noreply.github.com>
Date: Mon, 5 Feb 2024 20:14:54 -0800
Subject: [PATCH 02/12] [Gateway] Better logging around node connectivity
(#11929)
1. Rename "heartbeat" -> "keepalive" to avoid confusion with other types of heartbeats.
2. Log node name alongside failed pings for easier debugging.
---
core/services/gateway/connectionmanager.go | 37 +++++++++++--------
.../gateway/connectionmanager_test.go | 16 ++++++++
2 files changed, 37 insertions(+), 16 deletions(-)
diff --git a/core/services/gateway/connectionmanager.go b/core/services/gateway/connectionmanager.go
index e5f7fb13afb..a3c39211c6e 100644
--- a/core/services/gateway/connectionmanager.go
+++ b/core/services/gateway/connectionmanager.go
@@ -27,9 +27,9 @@ import (
"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.
@@ -77,6 +77,7 @@ type donConnectionManager struct {
}
type nodeState struct {
+ name string
conn network.WSConnectionWrapper
}
@@ -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..b176837d9ca 100644
--- a/core/services/gateway/connectionmanager_test.go
+++ b/core/services/gateway/connectionmanager_test.go
@@ -227,3 +227,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 := utils.NewFixedClock(time.Now())
+ 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)
+}
From e0da2ca89b9d78951661298d052c6e2390b4a76e Mon Sep 17 00:00:00 2001
From: Bartek Tofel
Date: Tue, 6 Feb 2024 11:49:30 -0300
Subject: [PATCH 03/12] modify devspace Dockerfile to build linux/amd64 images
on ARM chips + remove some whitespaces (#11941)
---
charts/chainlink-cluster/devspace.yaml | 6 +++---
charts/chainlink-cluster/devspace_start.sh | 6 +++---
core/chainlink.devspace.Dockerfile | 6 +++---
3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/charts/chainlink-cluster/devspace.yaml b/charts/chainlink-cluster/devspace.yaml
index 8549f1165a2..7148f271516 100644
--- a/charts/chainlink-cluster/devspace.yaml
+++ b/charts/chainlink-cluster/devspace.yaml
@@ -34,8 +34,8 @@ pipelines:
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
+ 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
@@ -63,7 +63,7 @@ pipelines:
else
echo "Image tag '$tag' not found. Please build the image using 'devspace deploy'"
exit 1
- fi
+ fi
create_deployments app \
--set=helm.values.chainlink.nodes[0].image=$image \
--set=helm.values.chainlink.nodes[1].image=$image \
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/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
From 2635ce3b425eae8ffd789cad9f1af5fda83ed616 Mon Sep 17 00:00:00 2001
From: Patrick
Date: Tue, 6 Feb 2024 10:45:46 -0500
Subject: [PATCH 04/12] Cleaning up CODEOWNERS (#11868)
* WIP: cleanup
* further cleanup
* Update CODEOWNERS
Co-authored-by: chainchad <96362174+chainchad@users.noreply.github.com>
* further cleanup
* further cleanup
* Update CODEOWNERS
Co-authored-by: Jordan Krage
* further cleanup
* further cleanup
* Update CODEOWNERS
Co-authored-by: Jordan Krage
* Update CODEOWNERS
Co-authored-by: Jordan Krage
* Update CODEOWNERS
Co-authored-by: Jordan Krage
---------
Co-authored-by: chainchad <96362174+chainchad@users.noreply.github.com>
Co-authored-by: Jordan Krage
---
CODEOWNERS | 92 +++++++++++++++++++-----------------------------------
1 file changed, 32 insertions(+), 60 deletions(-)
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
From 9ddc0141b65cb55f483619a7122c18ee3f068529 Mon Sep 17 00:00:00 2001
From: Sri Kidambi <1702865+kidambisrinivas@users.noreply.github.com>
Date: Tue, 6 Feb 2024 22:45:47 +0530
Subject: [PATCH 05/12] Minor changes (#11943)
---
.../vrfv2plus/testnet/v2plusscripts/super_scripts.go | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go b/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go
index 9f7b708228d..9c1ddd840d4 100644
--- a/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go
+++ b/core/scripts/vrfv2plus/testnet/v2plusscripts/super_scripts.go
@@ -715,11 +715,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
From 4cb966909d0eed7820dda86b07ef66d19b7b5ad8 Mon Sep 17 00:00:00 2001
From: Jordan Krage
Date: Tue, 6 Feb 2024 17:13:04 -0600
Subject: [PATCH 06/12] core/chains/evm/assets: FuzzWei skip large exponents
(#11948)
---
core/chains/evm/assets/wei_test.go | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/core/chains/evm/assets/wei_test.go b/core/chains/evm/assets/wei_test.go
index 2f083c266b9..adbab27d84b 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"
@@ -74,6 +76,9 @@ func FuzzWei(f *testing.F) {
if len(v) > 1_000 {
t.Skip()
}
+ if tryParseExp(v) > 4888888 {
+ t.Skip()
+ }
var w Wei
err := w.UnmarshalText([]byte(v))
if err != nil {
@@ -89,3 +94,15 @@ 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
+ }
+ e, err := strconv.ParseInt(v[i+1:], 10, 32)
+ if err != nil {
+ return -1
+ }
+ return e
+}
From 1df59cabd59c5badd81441d513c33cc667b37fe2 Mon Sep 17 00:00:00 2001
From: Jordan Krage
Date: Tue, 6 Feb 2024 20:09:22 -0600
Subject: [PATCH 07/12] core/chains/evm/assets: fix FuzzWei range detection
(#11950)
---
core/chains/evm/assets/wei_test.go | 29 +++++++++++++++++++++++++----
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/core/chains/evm/assets/wei_test.go b/core/chains/evm/assets/wei_test.go
index adbab27d84b..e1181a7a5ec 100644
--- a/core/chains/evm/assets/wei_test.go
+++ b/core/chains/evm/assets/wei_test.go
@@ -74,10 +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 tryParseExp(v) > 4888888 {
- t.Skip()
+ if e := tryParseExp(v); -1000 > e || e > 1000 {
+ t.Skipf("exponent too large: %d", e)
}
var w Wei
err := w.UnmarshalText([]byte(v))
@@ -100,9 +100,30 @@ func tryParseExp(v string) int64 {
if i == -1 {
return -1
}
- e, err := strconv.ParseInt(v[i+1:], 10, 32)
+ 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)
+}
From 5c7c7ce8a99cd874169ede6c6acac71fe61c92a7 Mon Sep 17 00:00:00 2001
From: Ilja Pavlovs
Date: Wed, 7 Feb 2024 11:11:09 +0200
Subject: [PATCH 08/12] VRF-329: add BHS CTF test (#11890)
* VRF-329: add BHS CTF test
* VRF-329: add BHS CTF test - VRF v2 and V2Plus; Refactoring to make it a bit more DRY
* VRF-329: small refactoring
* VRF-329: fixing lint issues
* VRF-329: fixing lint issues
* VRF-329: fixing lint issues
* VRF-329: fixing lint issues
* VRF-329: fixing lint issues
* VRF-329: trying to remove flakiness
---
.github/workflows/integration-tests.yml | 4 +-
integration-tests/actions/actions.go | 78 ++-
.../actions/vrf/common/actions.go | 137 +++++
.../actions/vrf/common/errors.go | 27 +
.../actions/vrf/common/models.go | 69 +++
integration-tests/actions/vrf/vrfv2/errors.go | 10 +
.../actions/vrf/vrfv2/vrfv2_models.go | 34 --
.../actions/vrf/vrfv2/vrfv2_steps.go | 490 +++++++++---------
.../actions/vrf/vrfv2plus/errors.go | 17 +
.../actions/vrf/vrfv2plus/vrfv2plus_models.go | 25 -
.../actions/vrf/vrfv2plus/vrfv2plus_steps.go | 412 ++++++++-------
.../vrfv2plus/vrfv2plus_config/config.go | 51 --
integration-tests/client/chainlink_models.go | 36 +-
.../contracts/contract_models.go | 1 +
.../contracts/ethereum_vrf_contracts.go | 12 +
integration-tests/load/vrfv2/gun.go | 11 +-
integration-tests/load/vrfv2/vrfv2_test.go | 51 +-
integration-tests/load/vrfv2plus/gun.go | 11 +-
.../load/vrfv2plus/vrfv2plus_test.go | 53 +-
integration-tests/smoke/vrfv2_test.go | 328 +++++++++---
integration-tests/smoke/vrfv2plus_test.go | 366 +++++++++----
integration-tests/testconfig/vrfv2/config.go | 54 +-
integration-tests/testconfig/vrfv2/vrfv2.toml | 16 +-
.../testconfig/vrfv2plus/vrfv2plus.toml | 16 +-
24 files changed, 1526 insertions(+), 783 deletions(-)
create mode 100644 integration-tests/actions/vrf/common/actions.go
create mode 100644 integration-tests/actions/vrf/common/errors.go
create mode 100644 integration-tests/actions/vrf/common/models.go
create mode 100644 integration-tests/actions/vrf/vrfv2/errors.go
create mode 100644 integration-tests/actions/vrf/vrfv2plus/errors.go
delete mode 100644 integration-tests/actions/vrfv2plus/vrfv2plus_config/config.go
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index c0a3b834f69..d759a439907 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -454,11 +454,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
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..ec7972de597
--- /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.ID)
+ err = actions.FundAddress(client, newTxKey.Data.ID, 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..bb486bd598b
--- /dev/null
+++ b/integration-tests/actions/vrf/common/models.go
@@ -0,0 +1,69 @@
+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
+}
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..3813a970a2b 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,14 +156,14 @@ 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{
@@ -211,7 +173,7 @@ func CreateVRFV2Job(
}
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 +191,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 +211,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 +235,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 +247,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 +258,243 @@ 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,
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 +503,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 +515,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 +551,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 +569,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 +579,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 +598,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 +633,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 +651,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 +685,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 +695,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 +725,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 +740,7 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
consumer contracts.VRFv2WrapperLoadTestConsumer,
coordinator contracts.VRFCoordinatorV2,
subID uint64,
- vrfv2Data *VRFV2Data,
+ vrfv2KeyData *vrfcommon.VRFKeyData,
minimumConfirmations uint16,
callbackGasLimit uint32,
numberOfWords uint32,
@@ -739,7 +756,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 +765,7 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
fulfillmentEvents, err := WaitForRequestAndFulfillmentEvents(
wrapperAddress.String(),
coordinator,
- vrfv2Data,
+ vrfv2KeyData,
subID,
randomWordsFulfilledEventTimeout,
l,
@@ -761,7 +778,7 @@ func RequestRandomnessAndWaitForFulfillment(
consumer contracts.VRFv2LoadTestConsumer,
coordinator contracts.VRFCoordinatorV2,
subID uint64,
- vrfv2Data *VRFV2Data,
+ vrfKeyData *vrfcommon.VRFKeyData,
minimumConfirmations uint16,
callbackGasLimit uint32,
numberOfWords uint32,
@@ -771,7 +788,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 +796,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 +815,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 +827,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 +836,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 +905,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 +914,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 +1001,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 +1018,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 +1052,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 cddd9d65e3d..23a778f229e 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,7 +83,7 @@ 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{
@@ -137,7 +93,7 @@ func CreateVRFV2PlusJob(
}
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{
@@ -165,17 +121,17 @@ func VRFV2_5RegisterProvingKey(
vrfKey *client.VRFKey,
coordinator contracts.VRFCoordinatorV2_5,
gasLaneMaxGas uint64,
-) (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,
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
}
@@ -183,16 +139,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
}
@@ -206,11 +162,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()
}
@@ -218,6 +174,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,
@@ -225,17 +182,17 @@ 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,
@@ -247,20 +204,20 @@ func SetupVRFV2_5Environment(
*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(
@@ -268,110 +225,139 @@ 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, uint64(*vrfv2PlusConfig.CLNodeMaxGasPriceGWei)*1e9)
+ 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
+ })
}
- allNativeTokenKeyAddresses := append(newNativeTokenKeyAddresses, nativeTokenPrimaryKeyAddress)
- vrfJobSpecConfig := VRFJobSpecConfig{
- ForwardingAllowed: false,
- CoordinatorAddress: vrfv2_5Contracts.Coordinator.Address(),
- FromAddresses: allNativeTokenKeyAddresses,
+ 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 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,
+ 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,
+ return fmt.Errorf("%s, err %w", vrfcommon.ErrRestartCLNode, err)
}
-
- 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 newNativeTokenKeyAddresses, nil
+ return nil
}
func CreateFundSubsAndAddConsumers(
@@ -413,7 +399,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
}
@@ -433,7 +419,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,
@@ -485,16 +471,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
@@ -529,7 +515,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
@@ -545,7 +531,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)
@@ -553,7 +539,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
}
@@ -585,7 +571,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,
@@ -596,9 +582,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,
@@ -607,13 +605,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,
@@ -624,7 +622,7 @@ func RequestRandomnessAndWaitForFulfillment(
func RequestRandomnessAndWaitForFulfillmentUpgraded(
consumer contracts.VRFv2PlusLoadTestConsumer,
coordinator contracts.VRFCoordinatorV2PlusUpgradedVersion,
- vrfv2PlusData *VRFV2PlusData,
+ vrfKeyData *vrfcommon.VRFKeyData,
subID *big.Int,
isNativeBilling bool,
minimumConfirmations uint16,
@@ -634,9 +632,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,
@@ -645,17 +655,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)
@@ -666,7 +676,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)
@@ -698,7 +708,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,
@@ -717,7 +727,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
@@ -728,7 +738,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))
@@ -746,7 +756,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
@@ -756,7 +766,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
}
@@ -788,7 +798,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)
@@ -797,7 +807,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
}
@@ -805,7 +815,7 @@ func DeployVRFV2PlusDirectFundingContracts(
func DirectFundingRequestRandomnessAndWaitForFulfillment(
consumer contracts.VRFv2PlusWrapperLoadTestConsumer,
coordinator contracts.VRFCoordinatorV2_5,
- vrfv2PlusData *VRFV2PlusData,
+ vrfKeyData *vrfcommon.VRFKeyData,
subID *big.Int,
isNativeBilling bool,
minimumConfirmations uint16,
@@ -816,7 +826,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,
@@ -845,7 +867,7 @@ func DirectFundingRequestRandomnessAndWaitForFulfillment(
return WaitForRequestAndFulfillmentEvents(
wrapperAddress.String(),
coordinator,
- vrfv2PlusData,
+ vrfKeyData,
subID,
isNativeBilling,
randomWordsFulfilledEventTimeout,
@@ -856,20 +878,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)
@@ -880,7 +902,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)
@@ -986,7 +1008,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).
@@ -1014,13 +1036,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).
@@ -1033,7 +1055,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()).
@@ -1044,16 +1066,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()).
@@ -1070,7 +1092,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).
@@ -1091,7 +1113,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).
@@ -1114,9 +1136,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()).
@@ -1124,6 +1147,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/actions/vrfv2plus/vrfv2plus_config/config.go b/integration-tests/actions/vrfv2plus/vrfv2plus_config/config.go
deleted file mode 100644
index 44b62b2663a..00000000000
--- a/integration-tests/actions/vrfv2plus/vrfv2plus_config/config.go
+++ /dev/null
@@ -1,51 +0,0 @@
-package vrfv2plus_config
-
-import "time"
-
-type VRFV2PlusConfig struct {
- ChainlinkNodeFunding float64 `envconfig:"CHAINLINK_NODE_FUNDING" default:".1"` // Amount of native currency to fund each chainlink node with
- CLNodeMaxGasPriceGWei int64 `envconfig:"MAX_GAS_PRICE_GWEI" default:"1000"` // Max gas price in GWei for the chainlink node
- IsNativePayment bool `envconfig:"IS_NATIVE_PAYMENT" default:"false"` // Whether to use native payment or LINK token
- LinkNativeFeedResponse int64 `envconfig:"LINK_NATIVE_FEED_RESPONSE" default:"1000000000000000000"` // Response of the LINK/ETH feed
- MinimumConfirmations uint16 `envconfig:"MINIMUM_CONFIRMATIONS" default:"3"` // Minimum number of confirmations for the VRF Coordinator
- SubscriptionFundingAmountLink float64 `envconfig:"SUBSCRIPTION_FUNDING_AMOUNT_LINK" default:"5"` // Amount of LINK to fund the subscription with
- SubscriptionFundingAmountNative float64 `envconfig:"SUBSCRIPTION_FUNDING_AMOUNT_NATIVE" default:"1"` // Amount of native currency to fund the subscription with
- NumberOfWords uint32 `envconfig:"NUMBER_OF_WORDS" default:"3"` // Number of words to request
- CallbackGasLimit uint32 `envconfig:"CALLBACK_GAS_LIMIT" default:"1000000"` // Gas limit for the callback
- MaxGasLimitCoordinatorConfig uint32 `envconfig:"MAX_GAS_LIMIT_COORDINATOR_CONFIG" default:"2500000"` // Max gas limit for the VRF Coordinator config
- FallbackWeiPerUnitLink int64 `envconfig:"FALLBACK_WEI_PER_UNIT_LINK" default:"60000000000000000"` // Fallback wei per unit LINK for the VRF Coordinator config
- StalenessSeconds uint32 `envconfig:"STALENESS_SECONDS" default:"86400"` // Staleness in seconds for the VRF Coordinator config
- GasAfterPaymentCalculation uint32 `envconfig:"GAS_AFTER_PAYMENT_CALCULATION" default:"33825"` // Gas after payment calculation for the VRF Coordinator config
- FulfillmentFlatFeeLinkPPM uint32 `envconfig:"FULFILLMENT_FLAT_FEE_LINK_PPM" default:"500"` // Flat fee in ppm for LINK for the VRF Coordinator config
- FulfillmentFlatFeeNativePPM uint32 `envconfig:"FULFILLMENT_FLAT_FEE_NATIVE_PPM" default:"500"` // Flat fee in ppm for native currency for the VRF Coordinator config
- FulfillmentFlatFeeLinkDiscountPPM uint32 `envconfig:"FULFILLMENT_FLAT_FEE_LINK_DISCOUNT_PPM" default:"0"` // Discount relative to native flat fee in ppm for native payment
- NativePremiumPercentage uint8 `envconfig:"NATIVE_PREMIUM_PERCENTAGE" default:"2"` // Premium percentage for native payment
- LinkPremiumPercentage uint8 `envconfig:"LINK_PREMIUM_PERCENTAGE" default:"2"` // Premium percentage for LINK payment
-
- NumberOfSubToCreate int `envconfig:"NUMBER_OF_SUB_TO_CREATE" default:"1"` // Number of subscriptions to create
-
- RandomnessRequestCountPerRequest uint16 `envconfig:"RANDOMNESS_REQUEST_COUNT_PER_REQUEST" default:"1"` // How many randomness requests to send per request
- RandomnessRequestCountPerRequestDeviation uint16 `envconfig:"RANDOMNESS_REQUEST_COUNT_PER_REQUEST_DEVIATION" default:"0"` // How many randomness requests to send per request
-
- RandomWordsFulfilledEventTimeout time.Duration `envconfig:"RANDOM_WORDS_FULFILLED_EVENT_TIMEOUT" default:"2m"` // How long to wait for the RandomWordsFulfilled event to be emitted
-
- //Wrapper Config
- WrapperGasOverhead uint32 `envconfig:"WRAPPER_GAS_OVERHEAD" default:"50000"`
- CoordinatorGasOverhead uint32 `envconfig:"COORDINATOR_GAS_OVERHEAD" default:"52000"`
- WrapperPremiumPercentage uint8 `envconfig:"WRAPPER_PREMIUM_PERCENTAGE" default:"25"`
- WrapperMaxNumberOfWords uint8 `envconfig:"WRAPPER_MAX_NUMBER_OF_WORDS" default:"10"`
- WrapperConsumerFundingAmountNativeToken float64 `envconfig:"WRAPPER_CONSUMER_FUNDING_AMOUNT_NATIVE_TOKEN" default:"1"`
- WrapperConsumerFundingAmountLink int64 `envconfig:"WRAPPER_CONSUMER_FUNDING_AMOUNT_LINK" default:"10"`
-
- //LOAD/SOAK Test Config
- TestDuration time.Duration `envconfig:"TEST_DURATION" default:"3m"` // How long to run the test for
- RPS int64 `envconfig:"RPS" default:"1"` // How many requests per second to send
- RateLimitUnitDuration time.Duration `envconfig:"RATE_LIMIT_UNIT_DURATION" default:"1m"`
- //Using existing environment and contracts
- UseExistingEnv bool `envconfig:"USE_EXISTING_ENV" default:"false"` // Whether to use an existing environment or create a new one
- CoordinatorAddress string `envconfig:"COORDINATOR_ADDRESS" default:""` // Coordinator address
- ConsumerAddress string `envconfig:"CONSUMER_ADDRESS" default:""` // Consumer address
- LinkAddress string `envconfig:"LINK_ADDRESS" default:""` // Link address
- SubID string `envconfig:"SUB_ID" default:""` // Subscription ID
- KeyHash string `envconfig:"KEY_HASH" default:""`
-}
diff --git a/integration-tests/client/chainlink_models.go b/integration-tests/client/chainlink_models.go
index 665ff3c7465..320c7a21cc4 100644
--- a/integration-tests/client/chainlink_models.go
+++ b/integration-tests/client/chainlink_models.go
@@ -1261,14 +1261,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 +1284,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..3409dc75d6e 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 {
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/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/smoke/vrfv2_test.go b/integration-tests/smoke/vrfv2_test.go
index e4ff1600649..c289cd019c1 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")
@@ -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 b81ebd79d66..701cae9a027 100644
--- a/integration-tests/smoke/vrfv2plus_test.go
+++ b/integration-tests/smoke/vrfv2plus_test.go
@@ -1,22 +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/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"
@@ -59,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,
@@ -73,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,
@@ -104,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")
@@ -131,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,
@@ -151,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")
@@ -178,7 +183,7 @@ func TestVRFv2Plus(t *testing.T) {
&configCopy,
linkToken,
mockETHLinkFeed,
- vrfv2PlusContracts.Coordinator,
+ vrfv2PlusContracts.CoordinatorV2Plus,
vrfv2PlusData.KeyHash,
1,
)
@@ -192,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,
@@ -213,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)
@@ -246,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,
@@ -267,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)
@@ -300,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),
)
@@ -317,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
@@ -328,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())
@@ -363,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)
@@ -400,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),
)
@@ -409,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,
@@ -442,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,
@@ -458,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")
@@ -468,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
@@ -479,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())
@@ -514,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)
@@ -543,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(
@@ -560,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),
)
@@ -569,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,
@@ -585,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,
@@ -612,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")
@@ -623,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)
@@ -674,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,
@@ -688,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)
@@ -704,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,
@@ -720,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")
@@ -767,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,
@@ -781,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
@@ -799,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(
@@ -821,13 +826,13 @@ func TestVRFv2PlusMigration(t *testing.T) {
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,
@@ -843,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)
@@ -879,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())
@@ -896,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))
@@ -920,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,
@@ -936,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,
@@ -950,3 +955,188 @@ 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))
+ })
+}
diff --git a/integration-tests/testconfig/vrfv2/config.go b/integration-tests/testconfig/vrfv2/config.go
index f539d91799c..dca1319e8d8 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,20 @@ 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"`
+
+ //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 +340,43 @@ 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")
+ }
+
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/vrfv2plus.toml b/integration-tests/testconfig/vrfv2plus/vrfv2plus.toml
index ee84917260e..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"
@@ -41,6 +41,20 @@ 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]
[Load.VRFv2Plus.Common]
From 3d8a3e5eca3c94042e3ebca19df0690f4a1f037d Mon Sep 17 00:00:00 2001
From: george-dorin <120329946+george-dorin@users.noreply.github.com>
Date: Wed, 7 Feb 2024 15:31:10 +0200
Subject: [PATCH 09/12] Non-EVM chains operator-ui support (#11386)
* Remove unused method
* Fix test failing
* Fix tests
* Cleanup and lint fix
* Restore t.Parallel
* Do not ignore NewNodePayloadResolver error
* Return empty ChainsPayload if no chains are configured
---
.../mocks/relayer_chain_interoperators.go | 3 +-
core/web/loader/chain.go | 21 +++++--
core/web/loader/loader_test.go | 33 +++++++----
core/web/resolver/chain_test.go | 40 ++++++++++++-
core/web/resolver/eth_key_test.go | 43 ++++++++++++--
core/web/resolver/eth_transaction_test.go | 24 +++++++-
core/web/resolver/node_test.go | 56 ++++++++++---------
core/web/resolver/query.go | 45 +++++++++------
core/web/testutils/mock_relayer.go | 53 ++++++++++++++++++
9 files changed, 248 insertions(+), 70 deletions(-)
create mode 100644 core/web/testutils/mock_relayer.go
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/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/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/testutils/mock_relayer.go b/core/web/testutils/mock_relayer.go
new file mode 100644
index 00000000000..d1972f52626
--- /dev/null
+++ b/core/web/testutils/mock_relayer.go
@@ -0,0 +1,53 @@
+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")
+}
From 97ecb9e73e93da3942be28a6ee2f941758d92dc0 Mon Sep 17 00:00:00 2001
From: Akshay Aggarwal
Date: Wed, 7 Feb 2024 16:27:23 +0000
Subject: [PATCH 10/12] Update default OCR2.Automation.GasLimit to 5.4M
(#11942)
* Update default OCR2.Automation.GasLimit to 5.4M
* make docs
* fix remaining places
* update more files
---
.../evm/config/chain_scoped_ocr2_test.go | 2 +-
.../evm/config/toml/defaults/fallback.toml | 2 +-
core/config/docs/chains-evm.toml | 2 +-
.../config-multi-chain-effective.toml | 6 +-
.../config-multi-chain-effective.toml | 6 +-
docs/CONFIG.md | 84 +++++++++----------
.../disk-based-logging-disabled.txtar | 2 +-
.../validate/disk-based-logging-no-dir.txtar | 2 +-
.../node/validate/disk-based-logging.txtar | 2 +-
testdata/scripts/node/validate/invalid.txtar | 2 +-
testdata/scripts/node/validate/valid.txtar | 2 +-
11 files changed, 56 insertions(+), 56 deletions(-)
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/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/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/services/chainlink/testdata/config-multi-chain-effective.toml b/core/services/chainlink/testdata/config-multi-chain-effective.toml
index bd64ae04812..7d38b3ac456 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'
@@ -473,7 +473,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'bar'
diff --git a/core/web/resolver/testdata/config-multi-chain-effective.toml b/core/web/resolver/testdata/config-multi-chain-effective.toml
index bd64ae04812..7d38b3ac456 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'
@@ -473,7 +473,7 @@ ObservationGracePeriod = '1s'
[EVM.OCR2]
[EVM.OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
[[EVM.Nodes]]
Name = 'bar'
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 98259fd5962..03337d15dae 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
```
@@ -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
```
@@ -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
```
@@ -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
```
@@ -4823,7 +4823,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -4986,7 +4986,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5230,7 +5230,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5311,7 +5311,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5392,7 +5392,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5473,7 +5473,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -5554,7 +5554,7 @@ ObservationGracePeriod = '1s'
[OCR2]
[OCR2.Automation]
-GasLimit = 5300000
+GasLimit = 5400000
```
@@ -6316,13 +6316,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/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'
From 7eb5600bd8a904306adb14a22452205c395048a1 Mon Sep 17 00:00:00 2001
From: Lei
Date: Wed, 7 Feb 2024 09:35:27 -0800
Subject: [PATCH 11/12] add readonly address (#11906)
* add readonly address
* add unit test, rebase and address comments
---
.../v2_2/IAutomationRegistryMaster.sol | 5 +--
.../dev/test/AutomationRegistry2_2.t.sol | 21 +++++++++++-
.../dev/v2_2/AutomationRegistry2_2.sol | 7 ++--
.../dev/v2_2/AutomationRegistryBase2_2.sol | 20 ++++++++++--
.../dev/v2_2/AutomationRegistryLogicA2_2.sol | 10 +++---
.../dev/v2_2/AutomationRegistryLogicB2_2.sol | 11 +++++--
.../automation/AutomationRegistry2_2.test.ts | 5 +++
contracts/test/v0.8/automation/helpers.ts | 12 ++++++-
.../i_keeper_registry_master_wrapper_2_2.go | 26 ++++++++++++++-
.../keeper_registry_logic_a_wrapper_2_2.go | 2 +-
.../keeper_registry_logic_b_wrapper_2_2.go | 32 ++++++++++++++++---
.../keeper_registry_wrapper_2_2.go | 2 +-
...rapper-dependency-versions-do-not-edit.txt | 8 ++---
13 files changed, 135 insertions(+), 26 deletions(-)
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..c50a0d30199 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: 0x497cc32eb52fa7077bfcee4be7559fefd8c2c821b5b946322b98fba8cc09808a
// SPDX-License-Identifier: MIT
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.6.6. SEE SOURCE BELOW. !!
pragma solidity ^0.8.4;
@@ -208,6 +208,7 @@ 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);
@@ -313,5 +314,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":"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"},{"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":"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"}]
*/
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..20cebacc1b2 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 {AutomationCompatibleInterface} from "../../interfaces/AutomationCompatibleInterface.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;
@@ -50,7 +52,8 @@ contract AutomationRegistry2_2_SetUp is BaseTest {
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(
@@ -72,6 +75,22 @@ contract AutomationRegistry2_2_LatestConfigDetails is AutomationRegistry2_2_SetU
}
}
+contract AutomationRegistry2_2_CheckUpkeep is AutomationRegistry2_2_SetUp {
+ function testPreventExecutionOnCheckUpkeep() public {
+ IAutomationRegistryMaster registry = IAutomationRegistryMaster(
+ address(deployRegistry2_2(AutomationRegistryBase2_2.Mode(0)))
+ );
+
+ 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));
+ registry.checkUpkeep(id, triggerData);
+ }
+}
+
contract AutomationRegistry2_2_SetConfig is AutomationRegistry2_2_SetUp {
event ConfigSet(
uint32 previousConfigBlockNumber,
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..d16ff615b15 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
@@ -52,7 +52,8 @@ contract AutomationRegistry2_2 is AutomationRegistryBase2_2, OCR2Abstract, Chain
logicA.getLinkAddress(),
logicA.getLinkNativeFeedAddress(),
logicA.getFastGasFeedAddress(),
- logicA.getAutomationForwarderLogic()
+ logicA.getAutomationForwarderLogic(),
+ logicA.getAllowedReadOnlyAddress()
)
Chainable(address(logicA))
{}
@@ -195,7 +196,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);
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..f892667ab67 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
@@ -5,7 +5,6 @@ import {EnumerableSet} from "../../../vendor/openzeppelin-solidity/v4.7.3/contra
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";
@@ -21,7 +20,7 @@ import {UpkeepFormat} from "../../interfaces/UpkeepTranscoderInterface.sol";
* 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;
@@ -69,6 +68,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
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 +138,7 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
error OnlyCallableByProposedPayee();
error OnlyCallableByUpkeepPrivilegeManager();
error OnlyPausedUpkeep();
+ error OnlySimulatedBackend();
error OnlyUnpausedUpkeep();
error ParameterLengthError();
error PaymentGreaterThanAllLINK();
@@ -449,19 +450,23 @@ abstract contract AutomationRegistryBase2_2 is ConfirmedOwner, ExecutionPreventi
* @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;
}
// ================================================================
@@ -962,4 +967,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..d261fc2552c 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
@@ -30,7 +30,8 @@ contract AutomationRegistryLogicA2_2 is AutomationRegistryBase2_2, Chainable {
logicB.getLinkAddress(),
logicB.getLinkNativeFeedAddress(),
logicB.getFastGasFeedAddress(),
- logicB.getAutomationForwarderLogic()
+ logicB.getAutomationForwarderLogic(),
+ logicB.getAllowedReadOnlyAddress()
)
Chainable(address(logicB))
{}
@@ -49,7 +50,6 @@ contract AutomationRegistryLogicA2_2 is AutomationRegistryBase2_2, Chainable {
bytes memory triggerData
)
public
- cannotExecute
returns (
bool upkeepNeeded,
bytes memory performData,
@@ -60,6 +60,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 +174,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 +191,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);
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..ddd0d083d2e 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
@@ -20,8 +20,11 @@ contract AutomationRegistryLogicB2_2 is AutomationRegistryBase2_2 {
address link,
address linkNativeFeed,
address fastGasFeed,
- address automationForwarderLogic
- ) AutomationRegistryBase2_2(mode, link, linkNativeFeed, fastGasFeed, automationForwarderLogic) {}
+ address automationForwarderLogic,
+ address allowedReadOnlyAddress
+ )
+ AutomationRegistryBase2_2(mode, link, linkNativeFeed, fastGasFeed, automationForwarderLogic, allowedReadOnlyAddress)
+ {}
// ================================================================
// | UPKEEP MANAGEMENT |
@@ -300,6 +303,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;
}
diff --git a/contracts/test/v0.8/automation/AutomationRegistry2_2.test.ts b/contracts/test/v0.8/automation/AutomationRegistry2_2.test.ts
index 69d580b23a0..bcdbe331462 100644
--- a/contracts/test/v0.8/automation/AutomationRegistry2_2.test.ts
+++ b/contracts/test/v0.8/automation/AutomationRegistry2_2.test.ts
@@ -899,6 +899,7 @@ describe('AutomationRegistry2_2', () => {
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
arbRegistry = await deployRegistry22(
@@ -907,6 +908,7 @@ describe('AutomationRegistry2_2', () => {
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
opRegistry = await deployRegistry22(
@@ -915,6 +917,7 @@ describe('AutomationRegistry2_2', () => {
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
mgRegistry = await deployRegistry22(
@@ -923,6 +926,7 @@ describe('AutomationRegistry2_2', () => {
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
blankRegistry = await deployRegistry22(
@@ -931,6 +935,7 @@ describe('AutomationRegistry2_2', () => {
linkToken.address,
linkEthFeed.address,
gasPriceFeed.address,
+ zeroAddress,
)
registryConditionalOverhead = await registry.getConditionalGasOverhead()
diff --git a/contracts/test/v0.8/automation/helpers.ts b/contracts/test/v0.8/automation/helpers.ts
index 3490bc72c4d..32086f62e85 100644
--- a/contracts/test/v0.8/automation/helpers.ts
+++ b/contracts/test/v0.8/automation/helpers.ts
@@ -39,6 +39,9 @@ export const deployRegistry22 = async (
link: Parameters[1],
linkNative: Parameters[2],
fastgas: Parameters[3],
+ allowedReadOnlyAddress: Parameters<
+ AutomationRegistryLogicBFactory['deploy']
+ >[4],
): Promise => {
const logicBFactory = await ethers.getContractFactory(
'AutomationRegistryLogicB2_2',
@@ -55,7 +58,14 @@ 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(
+ mode,
+ 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/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..3c81eedcddd 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
@@ -76,7 +76,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\":\"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\":\"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\"}]",
}
var IAutomationRegistryMasterABI = IAutomationRegistryMasterMetaData.ABI
@@ -365,6 +365,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")
@@ -6097,6 +6119,8 @@ 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)
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..1c2db92f8a2 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
@@ -32,7 +32,7 @@ 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",
+ Bin: "0x6101606040523480156200001257600080fd5b50604051620062773803806200627783398101604081905262000035916200044b565b80816001600160a01b0316634b4fd03b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000472565b826001600160a01b031663ca30e6036040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200010091906200044b565b836001600160a01b031663b10b673c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016591906200044b565b846001600160a01b0316636709d0e56040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ca91906200044b565b856001600160a01b0316635425d8ac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f91906200044b565b866001600160a01b031663a08714c06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029491906200044b565b3380600081620002eb5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200031e576200031e8162000387565b50505085600281111562000336576200033662000495565b60e08160028111156200034d576200034d62000495565b9052506001600160a01b0394851660805292841660a05290831660c052821661010052811661012052919091166101405250620004ab9050565b336001600160a01b03821603620003e15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620002e2565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b03811681146200044857600080fd5b50565b6000602082840312156200045e57600080fd5b81516200046b8162000432565b9392505050565b6000602082840312156200048557600080fd5b8151600381106200046b57600080fd5b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05160e051610100516101205161014051615d47620005306000396000818161010e01526101a901526000612f590152600081816103e10152611fbd015260008181613590015281816137c601528181613a0e0152613bb60152600061313a0152600061321e015260008181611dff01526123cb0152615d476000f3fe60806040523480156200001157600080fd5b50600436106200010c5760003560e01c806385c1b0ba11620000a5578063c8048022116200006f578063c804802214620002b7578063ce7dc5b414620002ce578063f2fde38b14620002e5578063f7d334ba14620002fc576200010c565b806385c1b0ba14620002535780638da5cb5b146200026a5780638e86139b1462000289578063948108f714620002a0576200010c565b80634ee88d3511620000e75780634ee88d3514620001ef5780636ded9eae146200020657806371791aa0146200021d57806379ba50971462000249576200010c565b806328f32f38146200015457806329c5efad146200017e578063349e8cca14620001a7575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e8080156200014d573d6000f35b3d6000fd5b005b6200016b6200016536600462004243565b62000313565b6040519081526020015b60405180910390f35b620001956200018f36600462004329565b6200068d565b60405162000175949392919062004451565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200162000175565b62000152620002003660046200448e565b62000931565b6200016b62000217366004620044de565b62000999565b620002346200022e36600462004329565b620009ff565b60405162000175979695949392919062004591565b620001526200110c565b6200015262000264366004620045e3565b6200120f565b60005473ffffffffffffffffffffffffffffffffffffffff16620001c9565b620001526200029a36600462004670565b62001e80565b62000152620002b1366004620046d3565b62002208565b62000152620002c836600462004702565b6200249b565b62000195620002df366004620047d8565b62002862565b62000152620002f63660046200484f565b62002928565b620002346200030d36600462004702565b62002940565b6000805473ffffffffffffffffffffffffffffffffffffffff163314801590620003475750620003456009336200297e565b155b156200037f576040517fd48b678b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff89163b620003ce576040517f09ee12d500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003d986620029b2565b9050600089307f00000000000000000000000000000000000000000000000000000000000000006040516200040e9062003fd4565b73ffffffffffffffffffffffffffffffffffffffff938416815291831660208301529091166040820152606001604051809103906000f08015801562000458573d6000803e3d6000fd5b5090506200051f826040518060e001604052806000151581526020018c63ffffffff16815260200163ffffffff801681526020018473ffffffffffffffffffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff16815260200160006bffffffffffffffffffffffff168152602001600063ffffffff168152508a89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a915062002b569050565b6015805474010000000000000000000000000000000000000000900463ffffffff169060146200054f836200489e565b91906101000a81548163ffffffff021916908363ffffffff16021790555050817fbae366358c023f887e791d7a62f2e4316f1026bd77f6fb49501a917b3bc5d0128a8a604051620005c892919063ffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60405180910390a2817fcba2d5723b2ee59e53a8e8a82a4a7caf4fdfe70e9f7c582950bf7e7a5c24e83d8787604051620006049291906200490d565b60405180910390a2817f2b72ac786c97e68dbab71023ed6f2bdbfc80ad9bb7808941929229d71b7d5664856040516200063e919062004923565b60405180910390a2817f3e8740446213c8a77d40e08f79136ce3f347d13ed270a6ebdf57159e0faf48508460405162000678919062004923565b60405180910390a25098975050505050505050565b600060606000806200069e62002f41565b600086815260046020908152604091829020825160e081018452815460ff811615158252610100810463ffffffff90811694830194909452650100000000008104841694820194909452690100000000000000000090930473ffffffffffffffffffffffffffffffffffffffff166060840152600101546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a0840152780100000000000000000000000000000000000000000000000090041660c08201525a9150600080826060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620007b8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007de919062004945565b73ffffffffffffffffffffffffffffffffffffffff166014600101600c9054906101000a900463ffffffff1663ffffffff168960405162000820919062004965565b60006040518083038160008787f1925050503d806000811462000860576040519150601f19603f3d011682016040523d82523d6000602084013e62000865565b606091505b50915091505a62000877908562004983565b935081620008a257600060405180602001604052806000815250600796509650965050505062000928565b80806020019051810190620008b89190620049f4565b909750955086620008e657600060405180602001604052806000815250600496509650965050505062000928565b601654865164010000000090910463ffffffff1610156200092457600060405180602001604052806000815250600596509650965050505062000928565b5050505b92959194509250565b6200093c8362002fb3565b6000838152601b602052604090206200095782848362004ae9565b50827f2b72ac786c97e68dbab71023ed6f2bdbfc80ad9bb7808941929229d71b7d566483836040516200098c9291906200490d565b60405180910390a2505050565b6000620009f388888860008989604051806020016040528060008152508a8a8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506200031392505050565b98975050505050505050565b60006060600080600080600062000a1562002f41565b600062000a228a62003069565b905060006012604051806101400160405290816000820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160008201600c9054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160109054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160149054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160189054906101000a900462ffffff1662ffffff1662ffffff16815260200160008201601b9054906101000a900461ffff1661ffff1661ffff16815260200160008201601d9054906101000a900460ff1660ff1660ff16815260200160008201601e9054906101000a900460ff1615151515815260200160008201601f9054906101000a900460ff161515151581526020016001820160009054906101000a900460ff16151515158152505090506000600460008d81526020019081526020016000206040518060e00160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160059054906101000a900463ffffffff1663ffffffff1663ffffffff1681526020016000820160099054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815260200160018201600c9054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681526020016001820160189054906101000a900463ffffffff1663ffffffff1663ffffffff168152505090508160e001511562000d61576000604051806020016040528060008152506009600084602001516000808263ffffffff169250995099509950995099509950995050505062001100565b604081015163ffffffff9081161462000db2576000604051806020016040528060008152506001600084602001516000808263ffffffff169250995099509950995099509950995050505062001100565b80511562000df8576000604051806020016040528060008152506002600084602001516000808263ffffffff169250995099509950995099509950995050505062001100565b62000e038262003117565b602083015160165492975090955060009162000e35918591879190640100000000900463ffffffff168a8a8762003309565b9050806bffffffffffffffffffffffff168260a001516bffffffffffffffffffffffff16101562000e9f576000604051806020016040528060008152506006600085602001516000808263ffffffff1692509a509a509a509a509a509a509a505050505062001100565b600062000eae8e868f6200335a565b90505a9850600080846060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000f06573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f2c919062004945565b73ffffffffffffffffffffffffffffffffffffffff166014600101600c9054906101000a900463ffffffff1663ffffffff168460405162000f6e919062004965565b60006040518083038160008787f1925050503d806000811462000fae576040519150601f19603f3d011682016040523d82523d6000602084013e62000fb3565b606091505b50915091505a62000fc5908c62004983565b9a5081620010455760165481516801000000000000000090910463ffffffff1610156200102257505060408051602080820190925260008082529490910151939c509a50600899505063ffffffff90911695506200110092505050565b602090940151939b5060039a505063ffffffff9092169650620011009350505050565b808060200190518101906200105b9190620049f4565b909e509c508d6200109c57505060408051602080820190925260008082529490910151939c509a50600499505063ffffffff90911695506200110092505050565b6016548d5164010000000090910463ffffffff161015620010ed57505060408051602080820190925260008082529490910151939c509a50600599505063ffffffff90911695506200110092505050565b505050506020015163ffffffff16945050505b92959891949750929550565b60015473ffffffffffffffffffffffffffffffffffffffff16331462001193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600173ffffffffffffffffffffffffffffffffffffffff82166000908152601a602052604090205460ff1660038111156200124e576200124e620043e6565b141580156200129a5750600373ffffffffffffffffffffffffffffffffffffffff82166000908152601a602052604090205460ff166003811115620012975762001297620043e6565b14155b15620012d2576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6014546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1662001332576040517fd12d7d8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008290036200136e576040517f2c2fc94100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c081018290526000808567ffffffffffffffff811115620013c557620013c5620040ca565b604051908082528060200260200182016040528015620013ef578160200160208202803683370190505b50905060008667ffffffffffffffff811115620014105762001410620040ca565b6040519080825280602002602001820160405280156200149757816020015b6040805160e08101825260008082526020808301829052928201819052606082018190526080820181905260a0820181905260c082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816200142f5790505b50905060008767ffffffffffffffff811115620014b857620014b8620040ca565b604051908082528060200260200182016040528015620014ed57816020015b6060815260200190600190039081620014d75790505b50905060008867ffffffffffffffff8111156200150e576200150e620040ca565b6040519080825280602002602001820160405280156200154357816020015b60608152602001906001900390816200152d5790505b50905060008967ffffffffffffffff811115620015645762001564620040ca565b6040519080825280602002602001820160405280156200159957816020015b6060815260200190600190039081620015835790505b50905060005b8a81101562001b7d578b8b82818110620015bd57620015bd62004c11565b60209081029290920135600081815260048452604090819020815160e081018352815460ff811615158252610100810463ffffffff90811697830197909752650100000000008104871693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff166060830152600101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490931660c08401529a509098506200169c90508962002fb3565b60608801516040517f1a5da6c800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c8116600483015290911690631a5da6c890602401600060405180830381600087803b1580156200170c57600080fd5b505af115801562001721573d6000803e3d6000fd5b50505050878582815181106200173b576200173b62004c11565b6020026020010181905250600560008a815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168682815181106200178f576200178f62004c11565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910182015260008a81526007909152604090208054620017ce9062004a41565b80601f0160208091040260200160405190810160405280929190818152602001828054620017fc9062004a41565b80156200184d5780601f1062001821576101008083540402835291602001916200184d565b820191906000526020600020905b8154815290600101906020018083116200182f57829003601f168201915b505050505084828151811062001867576200186762004c11565b6020026020010181905250601b60008a81526020019081526020016000208054620018929062004a41565b80601f0160208091040260200160405190810160405280929190818152602001828054620018c09062004a41565b8015620019115780601f10620018e55761010080835404028352916020019162001911565b820191906000526020600020905b815481529060010190602001808311620018f357829003601f168201915b50505050508382815181106200192b576200192b62004c11565b6020026020010181905250601c60008a81526020019081526020016000208054620019569062004a41565b80601f0160208091040260200160405190810160405280929190818152602001828054620019849062004a41565b8015620019d55780601f10620019a957610100808354040283529160200191620019d5565b820191906000526020600020905b815481529060010190602001808311620019b757829003601f168201915b5050505050828281518110620019ef57620019ef62004c11565b60200260200101819052508760a001516bffffffffffffffffffffffff168762001a1a919062004c40565b60008a815260046020908152604080832080547fffffff000000000000000000000000000000000000000000000000000000000016815560010180547fffffffff000000000000000000000000000000000000000000000000000000001690556007909152812091985062001a90919062003fe2565b6000898152601b6020526040812062001aa99162003fe2565b6000898152601c6020526040812062001ac29162003fe2565b600089815260066020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905562001b0360028a6200357c565b5060a0880151604080516bffffffffffffffffffffffff909216825273ffffffffffffffffffffffffffffffffffffffff8c1660208301528a917fb38647142fbb1ea4c000fc4569b37a4e9a9f6313317b84ee3e5326c1a6cd06ff910160405180910390a28062001b748162004c56565b9150506200159f565b508560195462001b8e919062004983565b60195560008b8b868167ffffffffffffffff81111562001bb25762001bb2620040ca565b60405190808252806020026020018201604052801562001bdc578160200160208202803683370190505b508988888860405160200162001bfa98979695949392919062004dfc565b60405160208183030381529060405290508973ffffffffffffffffffffffffffffffffffffffff16638e86139b6014600001600c9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c71249ab60038e73ffffffffffffffffffffffffffffffffffffffff1663aab9edd66040518163ffffffff1660e01b8152600401602060405180830381865afa15801562001cb6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001cdc919062004ecc565b866040518463ffffffff1660e01b815260040162001cfd9392919062004ef1565b600060405180830381865afa15801562001d1b573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405262001d63919081019062004f18565b6040518263ffffffff1660e01b815260040162001d81919062004923565b600060405180830381600087803b15801562001d9c57600080fd5b505af115801562001db1573d6000803e3d6000fd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8d81166004830152602482018b90527f000000000000000000000000000000000000000000000000000000000000000016925063a9059cbb91506044016020604051808303816000875af115801562001e4b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001e71919062004f51565b50505050505050505050505050565b6002336000908152601a602052604090205460ff16600381111562001ea95762001ea9620043e6565b1415801562001edf57506003336000908152601a602052604090205460ff16600381111562001edc5762001edc620043e6565b14155b1562001f17576040517f0ebeec3c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080808080808062001f2d888a018a62005149565b965096509650965096509650965060005b8751811015620021fc57600073ffffffffffffffffffffffffffffffffffffffff1687828151811062001f755762001f7562004c11565b60200260200101516060015173ffffffffffffffffffffffffffffffffffffffff1603620020895785818151811062001fb25762001fb262004c11565b6020026020010151307f000000000000000000000000000000000000000000000000000000000000000060405162001fea9062003fd4565b73ffffffffffffffffffffffffffffffffffffffff938416815291831660208301529091166040820152606001604051809103906000f08015801562002034573d6000803e3d6000fd5b508782815181106200204a576200204a62004c11565b60200260200101516060019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b62002141888281518110620020a257620020a262004c11565b6020026020010151888381518110620020bf57620020bf62004c11565b6020026020010151878481518110620020dc57620020dc62004c11565b6020026020010151878581518110620020f957620020f962004c11565b602002602001015187868151811062002116576200211662004c11565b602002602001015187878151811062002133576200213362004c11565b602002602001015162002b56565b87818151811062002156576200215662004c11565b60200260200101517f74931a144e43a50694897f241d973aecb5024c0e910f9bb80a163ea3c1cf5a7188838151811062002194576200219462004c11565b602002602001015160a0015133604051620021df9291906bffffffffffffffffffffffff92909216825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b60405180910390a280620021f38162004c56565b91505062001f3e565b50505050505050505050565b600082815260046020908152604091829020825160e081018452815460ff81161515825263ffffffff6101008204811694830194909452650100000000008104841694820185905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004821660c0820152911462002306576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160a001516200231891906200527a565b600084815260046020526040902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff166c010000000000000000000000006bffffffffffffffffffffffff93841602179055601954620023809184169062004c40565b6019556040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526bffffffffffffffffffffffff831660448201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af11580156200242a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002450919062004f51565b506040516bffffffffffffffffffffffff83168152339084907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a3505050565b6000818152600460209081526040808320815160e081018352815460ff81161515825263ffffffff6101008204811695830195909552650100000000008104851693820184905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004831660c082015292911415906200258460005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16149050818015620025df5750808015620025dd5750620025d06200358a565b836040015163ffffffff16115b155b1562002617576040517ffbc0357800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801580156200264a575060008481526005602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b1562002682576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006200268e6200358a565b905081620026a657620026a360328262004c40565b90505b6000858152600460205260409020805463ffffffff80841665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffff90921691909117909155620027029060029087906200357c16565b5060145460808501516bffffffffffffffffffffffff91821691600091168211156200276b576080860151620027399083620052a2565b90508560a001516bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156200276b575060a08501515b808660a001516200277d9190620052a2565b600088815260046020526040902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff166c010000000000000000000000006bffffffffffffffffffffffff93841602179055601554620027e5918391166200527a565b601580547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff9290921691909117905560405167ffffffffffffffff84169088907f91cb3bb75cfbd718bbfccc56b7f53d92d7048ef4ca39a3b7b7c6d4af1f79118190600090a350505050505050565b600060606000806000634b56a42e60e01b8888886040516024016200288a93929190620052ca565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915290506200291589826200068d565b929c919b50995090975095505050505050565b6200293262003646565b6200293d81620036c9565b50565b600060606000806000806000620029678860405180602001604052806000815250620009ff565b959e949d50929b5090995097509550909350915050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415155b90505b92915050565b6000806000620029d96001620029c76200358a565b620029d3919062004983565b620037c0565b601554604080516020810193909352309083015274010000000000000000000000000000000000000000900463ffffffff166060820152608001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201209083015201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060045b600f81101562002ae5578282828151811062002aa15762002aa162004c11565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508062002adc8162004c56565b91505062002a81565b5083600181111562002afb5762002afb620043e6565b60f81b81600f8151811062002b145762002b1462004c11565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535062002b4e81620052fe565b949350505050565b6012547e01000000000000000000000000000000000000000000000000000000000000900460ff161562002bb6576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601654835163ffffffff909116101562002bfc576040517fae7235df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108fc856020015163ffffffff16108062002c3a5750601554602086015163ffffffff70010000000000000000000000000000000090920482169116115b1562002c72576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868152600460205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff161562002cdc576040517f6e3b930b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000868152600460209081526040808320885181548a8501518b85015160608d01517fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009093169315157fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff169390931761010063ffffffff92831602177fffffff000000000000000000000000000000000000000000000000ffffffffff1665010000000000938216939093027fffffff0000000000000000000000000000000000000000ffffffffffffffffff1692909217690100000000000000000073ffffffffffffffffffffffffffffffffffffffff9283160217835560808b01516001909301805460a08d015160c08e01516bffffffffffffffffffffffff9687167fffffffffffffffff000000000000000000000000000000000000000000000000909316929092176c010000000000000000000000009690911695909502949094177fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff1678010000000000000000000000000000000000000000000000009490931693909302919091179091556005835281842080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169189169190911790556007909152902062002ecf848262005341565b508460a001516bffffffffffffffffffffffff1660195462002ef2919062004c40565b6019556000868152601b6020526040902062002f0f838262005341565b506000868152601c6020526040902062002f2a828262005341565b5062002f3860028762003928565b50505050505050565b3273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161462002fb1576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff16331462003011576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526004602052604090205465010000000000900463ffffffff908116146200293d576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818160045b600f811015620030fe577fff000000000000000000000000000000000000000000000000000000000000008216838260208110620030b257620030b262004c11565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614620030e957506000949350505050565b80620030f58162004c56565b91505062003070565b5081600f1a600181111562002b4e5762002b4e620043e6565b6000806000836080015162ffffff1690506000808263ffffffff161190506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015620031a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620031ca919062005483565b5094509092505050600081131580620031e257508142105b80620032075750828015620032075750620031fe824262004983565b8463ffffffff16105b15620032185760175495506200321c565b8095505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801562003288573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620032ae919062005483565b5094509092505050600081131580620032c657508142105b80620032eb5750828015620032eb5750620032e2824262004983565b8463ffffffff16105b15620032fc57601854945062003300565b8094505b50505050915091565b6000806200331d88878b60c0015162003936565b90506000806200333a8b8a63ffffffff16858a8a60018b620039d5565b90925090506200334b81836200527a565b9b9a5050505050505050505050565b60606000836001811115620033735762003373620043e6565b0362003440576000848152600760205260409081902090517f6e04ff0d0000000000000000000000000000000000000000000000000000000091620033bb916024016200557b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905062003575565b6001836001811115620034575762003457620043e6565b036200354357600082806020019051810190620034759190620055f2565b6000868152600760205260409081902090519192507f40691db40000000000000000000000000000000000000000000000000000000091620034bc91849160240162005706565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091529150620035759050565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b9392505050565b6000620029a9838362003e77565b600060017f00000000000000000000000000000000000000000000000000000000000000006002811115620035c357620035c3620043e6565b036200364157606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003616573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200363c9190620057ce565b905090565b504390565b60005473ffffffffffffffffffffffffffffffffffffffff16331462002fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016200118a565b3373ffffffffffffffffffffffffffffffffffffffff8216036200374a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200118a565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060017f00000000000000000000000000000000000000000000000000000000000000006002811115620037f957620037f9620043e6565b036200391e576000606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200384e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620038749190620057ce565b9050808310158062003892575061010062003890848362004983565b115b15620038a15750600092915050565b6040517f2b407a8200000000000000000000000000000000000000000000000000000000815260048101849052606490632b407a8290602401602060405180830381865afa158015620038f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620035759190620057ce565b504090565b919050565b6000620029a9838362003f82565b600080808560018111156200394f576200394f620043e6565b0362003960575062015f9062003983565b6001856001811115620039775762003977620043e6565b036200354357506201adb05b6200399663ffffffff85166014620057e8565b620039a384600162005802565b620039b49060ff16611d4c620057e8565b620039c0908362004c40565b620039cc919062004c40565b95945050505050565b60008060008960a0015161ffff1687620039f09190620057e8565b9050838015620039ff5750803a105b1562003a0857503a5b600060027f0000000000000000000000000000000000000000000000000000000000000000600281111562003a415762003a41620043e6565b0362003bb257604080516000815260208101909152851562003aa55760003660405180608001604052806048815260200162005cf36048913960405160200162003a8e939291906200581e565b604051602081830303815290604052905062003b13565b60165462003ac390640100000000900463ffffffff16600462005847565b63ffffffff1667ffffffffffffffff81111562003ae45762003ae4620040ca565b6040519080825280601f01601f19166020018201604052801562003b0f576020820181803683370190505b5090505b6040517f49948e0e00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000000f906349948e0e9062003b6590849060040162004923565b602060405180830381865afa15801562003b83573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003ba99190620057ce565b91505062003d1c565b60017f0000000000000000000000000000000000000000000000000000000000000000600281111562003be95762003be9620043e6565b0362003d1c57841562003c7157606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562003c43573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003c699190620057ce565b905062003d1c565b6000606c73ffffffffffffffffffffffffffffffffffffffff166341b247a86040518163ffffffff1660e01b815260040160c060405180830381865afa15801562003cc0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062003ce6919062005872565b505060165492945062003d0b93505050640100000000900463ffffffff1682620057e8565b62003d18906010620057e8565b9150505b8462003d3b57808b60a0015161ffff1662003d389190620057e8565b90505b62003d4b61ffff871682620058bd565b90506000878262003d5d8c8e62004c40565b62003d699086620057e8565b62003d75919062004c40565b62003d8990670de0b6b3a7640000620057e8565b62003d959190620058bd565b905060008c6040015163ffffffff1664e8d4a5100062003db69190620057e8565b898e6020015163ffffffff16858f8862003dd19190620057e8565b62003ddd919062004c40565b62003ded90633b9aca00620057e8565b62003df99190620057e8565b62003e059190620058bd565b62003e11919062004c40565b90506b033b2e3c9fd0803ce800000062003e2c828462004c40565b111562003e65576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b6000818152600183016020526040812054801562003f7057600062003e9e60018362004983565b855490915060009062003eb49060019062004983565b905081811462003f2057600086600001828154811062003ed85762003ed862004c11565b906000526020600020015490508087600001848154811062003efe5762003efe62004c11565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062003f345762003f34620058f9565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620029ac565b6000915050620029ac565b5092915050565b600081815260018301602052604081205462003fcb57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620029ac565b506000620029ac565b6103ca806200592983390190565b50805462003ff09062004a41565b6000825580601f1062004001575050565b601f0160209004906000526020600020908101906200293d91905b808211156200403257600081556001016200401c565b5090565b73ffffffffffffffffffffffffffffffffffffffff811681146200293d57600080fd5b803563ffffffff811681146200392357600080fd5b8035600281106200392357600080fd5b60008083601f8401126200409157600080fd5b50813567ffffffffffffffff811115620040aa57600080fd5b602083019150836020828501011115620040c357600080fd5b9250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160e0810167ffffffffffffffff811182821017156200411f576200411f620040ca565b60405290565b604051610100810167ffffffffffffffff811182821017156200411f576200411f620040ca565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715620041965762004196620040ca565b604052919050565b600067ffffffffffffffff821115620041bb57620041bb620040ca565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112620041f957600080fd5b8135620042106200420a826200419e565b6200414c565b8181528460208386010111156200422657600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060008060e0898b0312156200426057600080fd5b88356200426d8162004036565b97506200427d60208a0162004059565b965060408901356200428f8162004036565b95506200429f60608a016200406e565b9450608089013567ffffffffffffffff80821115620042bd57600080fd5b620042cb8c838d016200407e565b909650945060a08b0135915080821115620042e557600080fd5b620042f38c838d01620041e7565b935060c08b01359150808211156200430a57600080fd5b50620043198b828c01620041e7565b9150509295985092959890939650565b600080604083850312156200433d57600080fd5b82359150602083013567ffffffffffffffff8111156200435c57600080fd5b6200436a85828601620041e7565b9150509250929050565b60005b838110156200439157818101518382015260200162004377565b50506000910152565b60008151808452620043b481602086016020860162004374565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600a81106200444d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b84151581526080602082015260006200446e60808301866200439a565b90506200447f604083018562004415565b82606083015295945050505050565b600080600060408486031215620044a457600080fd5b83359250602084013567ffffffffffffffff811115620044c357600080fd5b620044d1868287016200407e565b9497909650939450505050565b600080600080600080600060a0888a031215620044fa57600080fd5b8735620045078162004036565b9650620045176020890162004059565b95506040880135620045298162004036565b9450606088013567ffffffffffffffff808211156200454757600080fd5b620045558b838c016200407e565b909650945060808a01359150808211156200456f57600080fd5b506200457e8a828b016200407e565b989b979a50959850939692959293505050565b871515815260e060208201526000620045ae60e08301896200439a565b9050620045bf604083018862004415565b8560608301528460808301528360a08301528260c083015298975050505050505050565b600080600060408486031215620045f957600080fd5b833567ffffffffffffffff808211156200461257600080fd5b818601915086601f8301126200462757600080fd5b8135818111156200463757600080fd5b8760208260051b85010111156200464d57600080fd5b60209283019550935050840135620046658162004036565b809150509250925092565b600080602083850312156200468457600080fd5b823567ffffffffffffffff8111156200469c57600080fd5b620046aa858286016200407e565b90969095509350505050565b80356bffffffffffffffffffffffff811681146200392357600080fd5b60008060408385031215620046e757600080fd5b82359150620046f960208401620046b6565b90509250929050565b6000602082840312156200471557600080fd5b5035919050565b600067ffffffffffffffff821115620047395762004739620040ca565b5060051b60200190565b600082601f8301126200475557600080fd5b81356020620047686200420a836200471c565b82815260059290921b840181019181810190868411156200478857600080fd5b8286015b84811015620047cd57803567ffffffffffffffff811115620047ae5760008081fd5b620047be8986838b0101620041e7565b8452509183019183016200478c565b509695505050505050565b60008060008060608587031215620047ef57600080fd5b84359350602085013567ffffffffffffffff808211156200480f57600080fd5b6200481d8883890162004743565b945060408701359150808211156200483457600080fd5b5062004843878288016200407e565b95989497509550505050565b6000602082840312156200486257600080fd5b8135620035758162004036565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600063ffffffff808316818103620048ba57620048ba6200486f565b6001019392505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60208152600062002b4e602083018486620048c4565b602081526000620029a960208301846200439a565b8051620039238162004036565b6000602082840312156200495857600080fd5b8151620035758162004036565b600082516200497981846020870162004374565b9190910192915050565b81810381811115620029ac57620029ac6200486f565b80151581146200293d57600080fd5b600082601f830112620049ba57600080fd5b8151620049cb6200420a826200419e565b818152846020838601011115620049e157600080fd5b62002b4e82602083016020870162004374565b6000806040838503121562004a0857600080fd5b825162004a158162004999565b602084015190925067ffffffffffffffff81111562004a3357600080fd5b6200436a85828601620049a8565b600181811c9082168062004a5657607f821691505b60208210810362004a90577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111562004ae457600081815260208120601f850160051c8101602086101562004abf5750805b601f850160051c820191505b8181101562004ae05782815560010162004acb565b5050505b505050565b67ffffffffffffffff83111562004b045762004b04620040ca565b62004b1c8362004b15835462004a41565b8362004a96565b6000601f84116001811462004b71576000851562004b3a5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b17835562004c0a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101562004bc2578685013582556020948501946001909201910162004ba0565b508682101562004bfe577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115620029ac57620029ac6200486f565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362004c8a5762004c8a6200486f565b5060010190565b600081518084526020808501945080840160005b8381101562004d505781518051151588528381015163ffffffff908116858a01526040808301519091169089015260608082015173ffffffffffffffffffffffffffffffffffffffff16908901526080808201516bffffffffffffffffffffffff169089015260a08082015162004d2b828b01826bffffffffffffffffffffffff169052565b505060c09081015163ffffffff169088015260e0909601959082019060010162004ca5565b509495945050505050565b600081518084526020808501945080840160005b8381101562004d5057815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010162004d6f565b600081518084526020808501808196508360051b8101915082860160005b8581101562004def57828403895262004ddc8483516200439a565b9885019893509084019060010162004dc1565b5091979650505050505050565b60e081528760e082015260006101007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8a111562004e3957600080fd5b8960051b808c8386013783018381038201602085015262004e5d8282018b62004c91565b915050828103604084015262004e74818962004d5b565b9050828103606084015262004e8a818862004d5b565b9050828103608084015262004ea0818762004da3565b905082810360a084015262004eb6818662004da3565b905082810360c08401526200334b818562004da3565b60006020828403121562004edf57600080fd5b815160ff811681146200357557600080fd5b60ff8416815260ff83166020820152606060408201526000620039cc60608301846200439a565b60006020828403121562004f2b57600080fd5b815167ffffffffffffffff81111562004f4357600080fd5b62002b4e84828501620049a8565b60006020828403121562004f6457600080fd5b8151620035758162004999565b600082601f83011262004f8357600080fd5b8135602062004f966200420a836200471c565b82815260059290921b8401810191818101908684111562004fb657600080fd5b8286015b84811015620047cd578035835291830191830162004fba565b600082601f83011262004fe557600080fd5b8135602062004ff86200420a836200471c565b82815260e092830285018201928282019190878511156200501857600080fd5b8387015b85811015620050cf5781818a031215620050365760008081fd5b62005040620040f9565b81356200504d8162004999565b81526200505c82870162004059565b8682015260406200506f81840162004059565b90820152606082810135620050848162004036565b90820152608062005097838201620046b6565b9082015260a0620050aa838201620046b6565b9082015260c0620050bd83820162004059565b9082015284529284019281016200501c565b5090979650505050505050565b600082601f830112620050ee57600080fd5b81356020620051016200420a836200471c565b82815260059290921b840181019181810190868411156200512157600080fd5b8286015b84811015620047cd5780356200513b8162004036565b835291830191830162005125565b600080600080600080600060e0888a0312156200516557600080fd5b873567ffffffffffffffff808211156200517e57600080fd5b6200518c8b838c0162004f71565b985060208a0135915080821115620051a357600080fd5b620051b18b838c0162004fd3565b975060408a0135915080821115620051c857600080fd5b620051d68b838c01620050dc565b965060608a0135915080821115620051ed57600080fd5b620051fb8b838c01620050dc565b955060808a01359150808211156200521257600080fd5b620052208b838c0162004743565b945060a08a01359150808211156200523757600080fd5b620052458b838c0162004743565b935060c08a01359150808211156200525c57600080fd5b506200526b8a828b0162004743565b91505092959891949750929550565b6bffffffffffffffffffffffff81811683821601908082111562003f7b5762003f7b6200486f565b6bffffffffffffffffffffffff82811682821603908082111562003f7b5762003f7b6200486f565b604081526000620052df604083018662004da3565b8281036020840152620052f4818587620048c4565b9695505050505050565b8051602080830151919081101562004a90577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60209190910360031b1b16919050565b815167ffffffffffffffff8111156200535e576200535e620040ca565b62005376816200536f845462004a41565b8462004a96565b602080601f831160018114620053cc5760008415620053955750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855562004ae0565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156200541b57888601518255948401946001909101908401620053fa565b50858210156200545857878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b805169ffffffffffffffffffff811681146200392357600080fd5b600080600080600060a086880312156200549c57600080fd5b620054a78662005468565b9450602086015193506040860151925060608601519150620054cc6080870162005468565b90509295509295909350565b60008154620054e78162004a41565b808552602060018381168015620055075760018114620055405762005570565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff008516838901528284151560051b890101955062005570565b866000528260002060005b85811015620055685781548a82018601529083019084016200554b565b890184019650505b505050505092915050565b602081526000620029a96020830184620054d8565b600082601f830112620055a257600080fd5b81516020620055b56200420a836200471c565b82815260059290921b84018101918181019086841115620055d557600080fd5b8286015b84811015620047cd5780518352918301918301620055d9565b6000602082840312156200560557600080fd5b815167ffffffffffffffff808211156200561e57600080fd5b9083019061010082860312156200563457600080fd5b6200563e62004125565b82518152602083015160208201526040830151604082015260608301516060820152608083015160808201526200567860a0840162004938565b60a082015260c0830151828111156200569057600080fd5b6200569e8782860162005590565b60c08301525060e083015182811115620056b757600080fd5b620056c587828601620049a8565b60e08301525095945050505050565b600081518084526020808501945080840160005b8381101562004d5057815187529582019590820190600101620056e8565b60408152825160408201526020830151606082015260408301516080820152606083015160a0820152608083015160c082015273ffffffffffffffffffffffffffffffffffffffff60a08401511660e0820152600060c084015161010080818501525062005779610140840182620056d4565b905060e08501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc084830301610120850152620057b782826200439a565b9150508281036020840152620039cc8185620054d8565b600060208284031215620057e157600080fd5b5051919050565b8082028115828204841417620029ac57620029ac6200486f565b60ff8181168382160190811115620029ac57620029ac6200486f565b8284823760008382016000815283516200583d81836020880162004374565b0195945050505050565b63ffffffff8181168382160280821691908281146200586a576200586a6200486f565b505092915050565b60008060008060008060c087890312156200588c57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b600082620058f4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe60c060405234801561001057600080fd5b506040516103ca3803806103ca83398101604081905261002f91610076565b600080546001600160a01b0319166001600160a01b039384161790559181166080521660a0526100b9565b80516001600160a01b038116811461007157600080fd5b919050565b60008060006060848603121561008b57600080fd5b6100948461005a565b92506100a26020850161005a565b91506100b06040850161005a565b90509250925092565b60805160a0516102e76100e36000396000603801526000818160c4015261011701526102e76000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806379188d161461007b578063f00e6a2a146100aa575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e808015610076573d6000f35b3d6000fd5b61008e6100893660046101c1565b6100ee565b6040805192151583526020830191909152015b60405180910390f35b60405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526020016100a1565b60008054819073ffffffffffffffffffffffffffffffffffffffff16331461011557600080fd5b7f00000000000000000000000000000000000000000000000000000000000000005a91505a61138881101561014957600080fd5b61138881039050856040820482031161016157600080fd5b50803b61016d57600080fd5b6000808551602087016000858af192505a610188908361029a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080604083850312156101d457600080fd5b82359150602083013567ffffffffffffffff808211156101f357600080fd5b818501915085601f83011261020757600080fd5b81358181111561021957610219610192565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561025f5761025f610192565b8160405282815288602084870101111561027857600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b818103818111156102d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea164736f6c6343000813000a307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a",
}
var AutomationRegistryLogicAABI = AutomationRegistryLogicAMetaData.ABI
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..9a95bc619b0 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
@@ -76,15 +76,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\":\"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\"},{\"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\":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\":\"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: "0x6101406040523480156200001257600080fd5b50604051620050aa380380620050aa8339810160408190526200003591620001f2565b8585858585853380600081620000925760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c557620000c5816200012a565b505050856002811115620000dd57620000dd62000278565b60e0816002811115620000f457620000f462000278565b9052506001600160a01b0394851660805292841660a05290831660c0528216610100521661012052506200028e95505050505050565b336001600160a01b03821603620001845760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000089565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b0381168114620001ed57600080fd5b919050565b60008060008060008060c087890312156200020c57600080fd5b8651600381106200021c57600080fd5b95506200022c60208801620001d5565b94506200023c60408801620001d5565b93506200024c60608801620001d5565b92506200025c60808801620001d5565b91506200026c60a08801620001d5565b90509295509295509295565b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05160e0516101005161012051614d866200032460003960006106ea015260006105920152600081816105300152818161343a015281816139bd0152613b500152600081816105ff015261322e01526000818161074d01526133080152600081816107db01528181611c9801528181611f6d015281816123d6015281816128e9015261296d0152614d866000f3fe608060405234801561001057600080fd5b50600436106103415760003560e01c806379ba5097116101bd578063b121e147116100f9578063ca30e603116100a2578063eb5dcd6c1161007c578063eb5dcd6c14610825578063ed56b3e114610838578063f2fde38b146108ab578063faa3e996146108be57600080fd5b8063ca30e603146107d9578063cd7f71b5146107ff578063d76326481461081257600080fd5b8063b657bc9c116100d3578063b657bc9c1461079e578063b79550be146107b1578063c7c3a19a146107b957600080fd5b8063b121e14714610771578063b148ab6b14610784578063b6511a2a1461079757600080fd5b80638dcf0fe711610166578063a72aa27e11610140578063a72aa27e14610721578063aab9edd614610734578063abc76ae014610743578063b10b673c1461074b57600080fd5b80638dcf0fe7146106d5578063a08714c0146106e8578063a710b2211461070e57600080fd5b80638456cb59116101975780638456cb591461069c5780638765ecbe146106a45780638da5cb5b146106b757600080fd5b806379ba50971461064957806379ea9943146106515780637d9b97e01461069457600080fd5b8063421d183b1161028c5780635165f2f5116102355780636209e1e91161020f5780636209e1e9146105ea5780636709d0e5146105fd578063671d36ed14610623578063744bfe611461063657600080fd5b80635165f2f51461057d5780635425d8ac146105905780635b6aa71c146105d757600080fd5b80634b4fd03b116102665780634b4fd03b1461052e5780634ca16c52146105545780635147cd591461055d57600080fd5b8063421d183b1461048557806344cb70b8146104eb57806348013d7b1461051e57600080fd5b80631a2af011116102ee578063232c1cc5116102c8578063232c1cc5146104635780633b9cce591461046a5780633f4ba83a1461047d57600080fd5b80631a2af011146103df5780631e010439146103f2578063207b65161461045057600080fd5b80631865c57d1161031f5780631865c57d14610393578063187256e8146103ac57806319d97a94146103bf57600080fd5b8063050ee65d1461034657806306e3b6321461035e5780630b7d33e61461037e575b600080fd5b6201adb05b6040519081526020015b60405180910390f35b61037161036c366004613edb565b610904565b6040516103559190613efd565b61039161038c366004613f8a565b610a21565b005b61039b610adb565b60405161035595949392919061419b565b6103916103ba3660046142d2565b610f3f565b6103d26103cd36600461430f565b610fb0565b6040516103559190614396565b6103916103ed3660046143a9565b611052565b61043361040036600461430f565b6000908152600460205260409020600101546c0100000000000000000000000090046bffffffffffffffffffffffff1690565b6040516bffffffffffffffffffffffff9091168152602001610355565b6103d261045e36600461430f565b611158565b601461034b565b6103916104783660046143ce565b611175565b6103916113cb565b610498610493366004614443565b611431565b60408051951515865260ff90941660208601526bffffffffffffffffffffffff9283169385019390935216606083015273ffffffffffffffffffffffffffffffffffffffff16608082015260a001610355565b61050e6104f936600461430f565b60009081526008602052604090205460ff1690565b6040519015158152602001610355565b60005b604051610355919061449f565b7f0000000000000000000000000000000000000000000000000000000000000000610521565b62015f9061034b565b61057061056b36600461430f565b611550565b60405161035591906144b2565b61039161058b36600461430f565b61155b565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610355565b6104336105e53660046144df565b6116d2565b6103d26105f8366004614443565b61186a565b7f00000000000000000000000000000000000000000000000000000000000000006105b2565b610391610631366004614518565b61189e565b6103916106443660046143a9565b611978565b610391611d93565b6105b261065f36600461430f565b6000908152600460205260409020546901000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1690565b610391611e95565b610391611ff0565b6103916106b236600461430f565b612071565b60005473ffffffffffffffffffffffffffffffffffffffff166105b2565b6103916106e3366004613f8a565b6121eb565b7f00000000000000000000000000000000000000000000000000000000000000006105b2565b61039161071c366004614554565b612240565b61039161072f366004614582565b6124a8565b60405160038152602001610355565b611d4c61034b565b7f00000000000000000000000000000000000000000000000000000000000000006105b2565b61039161077f366004614443565b61259d565b61039161079236600461430f565b612695565b603261034b565b6104336107ac36600461430f565b612883565b6103916128b0565b6107cc6107c736600461430f565b612a0c565b60405161035591906145a5565b7f00000000000000000000000000000000000000000000000000000000000000006105b2565b61039161080d366004613f8a565b612ddf565b61043361082036600461430f565b612e76565b610391610833366004614554565b612e81565b610892610846366004614443565b73ffffffffffffffffffffffffffffffffffffffff166000908152600c602090815260409182902082518084019093525460ff8082161515808552610100909204169290910182905291565b60408051921515835260ff909116602083015201610355565b6103916108b9366004614443565b612fdf565b6108f76108cc366004614443565b73ffffffffffffffffffffffffffffffffffffffff166000908152601a602052604090205460ff1690565b60405161035591906146dc565b606060006109126002612ff3565b905080841061094d576040517f1390f2a100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610959848661471f565b905081811180610967575083155b6109715780610973565b815b905060006109818683614732565b67ffffffffffffffff81111561099957610999614745565b6040519080825280602002602001820160405280156109c2578160200160208202803683370190505b50905060005b8151811015610a15576109e66109de888361471f565b600290612ffd565b8282815181106109f8576109f8614774565b602090810291909101015280610a0d816147a3565b9150506109c8565b50925050505b92915050565b6016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff163314610a82576040517f77c3599200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152601d60205260409020610a9b82848361487d565b50827f2fd8d70753a007014349d4591843cc031c2dd7a260d7dd82eca8253686ae77698383604051610ace929190614998565b60405180910390a2505050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152604080516102008101825260008082526020820181905291810182905260608082018390526080820183905260a0820183905260c0820183905260e08201839052610100820183905261012082018390526101408201839052610160820183905261018082018390526101a08201526101c081018290526101e0810191909152604080516101408101825260155463ffffffff7401000000000000000000000000000000000000000082041682526bffffffffffffffffffffffff90811660208301526019549282019290925260125490911660608281019190915290819060009060808101610c1c6002612ff3565b8152601554780100000000000000000000000000000000000000000000000080820463ffffffff9081166020808601919091527c01000000000000000000000000000000000000000000000000000000008404821660408087019190915260115460608088019190915260125474010000000000000000000000000000000000000000810485166080808a01919091527e01000000000000000000000000000000000000000000000000000000000000820460ff16151560a0998a01528351610200810185526c0100000000000000000000000080840488168252700100000000000000000000000000000000808504891697830197909752808a0488169582019590955296820462ffffff16928701929092527b01000000000000000000000000000000000000000000000000000000900461ffff16908501526014546bffffffffffffffffffffffff8116968501969096529304811660c083015260165480821660e08401526401000000008104821661010084015268010000000000000000900416610120820152601754610140820152601854610160820152910473ffffffffffffffffffffffffffffffffffffffff166101808201529095506101a08101610de96009613010565b81526016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1660208083019190915260135460ff9081161515604093840152601254600d80548551818602810186019096528086529599508a958a959194600e947d01000000000000000000000000000000000000000000000000000000000090940490931692859190830182828015610ebe57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610e93575b5050505050925081805480602002602001604051908101604052809291908181526020018280548015610f2757602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610efc575b50505050509150945094509450945094509091929394565b610f4761301d565b73ffffffffffffffffffffffffffffffffffffffff82166000908152601a6020526040902080548291907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001836003811115610fa757610fa7614460565b02179055505050565b6000818152601d60205260409020805460609190610fcd906147db565b80601f0160208091040260200160405190810160405280929190818152602001828054610ff9906147db565b80156110465780601f1061101b57610100808354040283529160200191611046565b820191906000526020600020905b81548152906001019060200180831161102957829003601f168201915b50505050509050919050565b61105b826130a0565b3373ffffffffffffffffffffffffffffffffffffffff8216036110aa576040517f8c8728c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff8281169116146111545760008281526006602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851690811790915590519091339185917fb1cbb2c4b8480034c27e06da5f096b8233a8fd4497028593a41ff6df79726b3591a45b5050565b6000818152601b60205260409020805460609190610fcd906147db565b61117d61301d565b600e5481146111b8576040517fcf54c06a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b600e5481101561138a576000600e82815481106111da576111da614774565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff908116808452600f9092526040832054919350169085858581811061122457611224614774565b90506020020160208101906112399190614443565b905073ffffffffffffffffffffffffffffffffffffffff811615806112cc575073ffffffffffffffffffffffffffffffffffffffff8216158015906112aa57508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b80156112cc575073ffffffffffffffffffffffffffffffffffffffff81811614155b15611303576040517fb387a23800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff818116146113745773ffffffffffffffffffffffffffffffffffffffff8381166000908152600f6020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169183169190911790555b5050508080611382906147a3565b9150506111bb565b507fa46de38886467c59be07a0675f14781206a5477d871628af46c2443822fcb725600e83836040516113bf939291906149e5565b60405180910390a15050565b6113d361301d565b601280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e0100000000000000000000000000009004909116606082015282918291829182919082906114f75760608201516012546000916114e3916bffffffffffffffffffffffff16614a97565b600e549091506114f39082614aeb565b9150505b81516020830151604084015161150e908490614b16565b6060949094015173ffffffffffffffffffffffffffffffffffffffff9a8b166000908152600f6020526040902054929b919a9499509750921694509092505050565b6000610a1b82613154565b611564816130a0565b600081815260046020908152604091829020825160e081018452815460ff8116151580835263ffffffff610100830481169584019590955265010000000000820485169583019590955273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290611663576040517f1b88a78400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556116a26002836131ff565b5060405182907f7bada562044eb163f6b4003c4553e4e62825344c0418eea087bed5ee05a4745690600090a25050565b60408051610140810182526012546bffffffffffffffffffffffff8116825263ffffffff6c010000000000000000000000008204811660208401527001000000000000000000000000000000008204811693830193909352740100000000000000000000000000000000000000008104909216606082015262ffffff7801000000000000000000000000000000000000000000000000830416608082015261ffff7b0100000000000000000000000000000000000000000000000000000083041660a082015260ff7d0100000000000000000000000000000000000000000000000000000000008304811660c08301527e0100000000000000000000000000000000000000000000000000000000000083048116151560e08301527f010000000000000000000000000000000000000000000000000000000000000090920482161515610100820152601354909116151561012082015260009081806118378361320b565b91509150611860838787601460020160049054906101000a900463ffffffff16868660006133e9565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152601e60205260409020805460609190610fcd906147db565b6016546c01000000000000000000000000900473ffffffffffffffffffffffffffffffffffffffff1633146118ff576040517f77c3599200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff83166000908152601e6020526040902061192f82848361487d565b508273ffffffffffffffffffffffffffffffffffffffff167f7c44b4eb59ee7873514e7e43e7718c269d872965938b288aa143befca62f99d28383604051610ace929190614998565b6012547f0100000000000000000000000000000000000000000000000000000000000000900460ff16156119d8576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f010000000000000000000000000000000000000000000000000000000000000017905573ffffffffffffffffffffffffffffffffffffffff8116611a6e576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600460209081526040808320815160e081018352815460ff81161515825263ffffffff610100820481168387015265010000000000820481168386015273ffffffffffffffffffffffffffffffffffffffff6901000000000000000000909204821660608401526001909301546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a08401527801000000000000000000000000000000000000000000000000900490921660c082015286855260059093529220549091163314611b75576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7d613434565b816040015163ffffffff161115611bc0576040517fff84e5dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600460205260409020600101546019546c010000000000000000000000009091046bffffffffffffffffffffffff1690611c00908290614732565b60195560008481526004602081905260409182902060010180547fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff16905590517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116928201929092526bffffffffffffffffffffffff831660248201527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015611ce3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d079190614b3b565b50604080516bffffffffffffffffffffffff8316815273ffffffffffffffffffffffffffffffffffffffff8516602082015285917ff3b5906e5672f3e524854103bcafbbdba80dbdfeca2c35e116127b1060a68318910160405180910390a25050601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690555050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611e19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b611e9d61301d565b6015546019546bffffffffffffffffffffffff90911690611ebf908290614732565b601955601580547fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001690556040516bffffffffffffffffffffffff821681527f1d07d0b0be43d3e5fee41a80b579af370affee03fa595bf56d5d4c19328162f19060200160405180910390a16040517fa9059cbb0000000000000000000000000000000000000000000000000000000081523360048201526bffffffffffffffffffffffff821660248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb906044015b6020604051808303816000875af1158015611fcc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111549190614b3b565b611ff861301d565b601280547fff00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e010000000000000000000000000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001611427565b61207a816130a0565b600081815260046020908152604091829020825160e081018452815460ff8116158015835263ffffffff610100830481169584019590955265010000000000820485169583019590955273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290612179576040517f514b6c2400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082815260046020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556121bb6002836134e9565b5060405182907f8ab10247ce168c27748e656ecf852b951fcaac790c18106b19aa0ae57a8b741f90600090a25050565b6121f4836130a0565b6000838152601c6020526040902061220d82848361487d565b50827f3e8740446213c8a77d40e08f79136ce3f347d13ed270a6ebdf57159e0faf48508383604051610ace929190614998565b73ffffffffffffffffffffffffffffffffffffffff811661228d576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600f60205260409020541633146122ed576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254600e546000916123109185916bffffffffffffffffffffffff16906134f5565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffff000000000000000000000000ffff16905560195490915061237a906bffffffffffffffffffffffff831690614732565b6019556040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526bffffffffffffffffffffffff831660248301527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af115801561241f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124439190614b3b565b5060405133815273ffffffffffffffffffffffffffffffffffffffff808416916bffffffffffffffffffffffff8416918616907f9819093176a1851202c7bcfa46845809b4e47c261866550e94ed3775d2f406989060200160405180910390a4505050565b6108fc8163ffffffff1610806124dd575060155463ffffffff7001000000000000000000000000000000009091048116908216115b15612514576040517f14c237fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61251d826130a0565b60008281526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ff1661010063ffffffff861690810291909117909155915191825283917fc24c07e655ce79fba8a589778987d3c015bc6af1632bb20cf9182e02a65d972c910160405180910390a25050565b73ffffffffffffffffffffffffffffffffffffffff8181166000908152601060205260409020541633146125fd576040517f6752e7aa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8181166000818152600f602090815260408083208054337fffffffffffffffffffffffff000000000000000000000000000000000000000080831682179093556010909452828520805490921690915590519416939092849290917f78af32efdcad432315431e9b03d27e6cd98fb79c405fdc5af7c1714d9c0f75b39190a45050565b600081815260046020908152604091829020825160e081018452815460ff81161515825263ffffffff6101008204811694830194909452650100000000008104841694820185905273ffffffffffffffffffffffffffffffffffffffff69010000000000000000009091041660608201526001909101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a083015278010000000000000000000000000000000000000000000000009004821660c08201529114612792576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1633146127ef576040517f6352a85300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008281526005602090815260408083208054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821790935560069094528285208054909216909155905173ffffffffffffffffffffffffffffffffffffffff90911692839186917f5cff4db96bef051785e999f44bfcd21c18823e034fb92dd376e3db4ce0feeb2c91a4505050565b6000610a1b61289183613154565b600084815260046020526040902054610100900463ffffffff166116d2565b6128b861301d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612945573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129699190614b5d565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33601954846129b69190614732565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401611fad565b604080516101408101825260008082526020820181905260609282018390528282018190526080820181905260a0820181905260c0820181905260e082018190526101008201526101208101919091526000828152600460209081526040808320815160e081018352815460ff811615158252610100810463ffffffff90811695830195909552650100000000008104851693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff16606083018190526001909101546bffffffffffffffffffffffff80821660808501526c0100000000000000000000000082041660a08401527801000000000000000000000000000000000000000000000000900490921660c0820152919015612ba457816060015173ffffffffffffffffffffffffffffffffffffffff1663f00e6a2a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612b7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b9f9190614b76565b612ba7565b60005b90506040518061014001604052808273ffffffffffffffffffffffffffffffffffffffff168152602001836020015163ffffffff168152602001600760008781526020019081526020016000208054612bff906147db565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2b906147db565b8015612c785780601f10612c4d57610100808354040283529160200191612c78565b820191906000526020600020905b815481529060010190602001808311612c5b57829003601f168201915b505050505081526020018360a001516bffffffffffffffffffffffff1681526020016005600087815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001836040015163ffffffff1667ffffffffffffffff1681526020018360c0015163ffffffff16815260200183608001516bffffffffffffffffffffffff168152602001836000015115158152602001601c60008781526020019081526020016000208054612d55906147db565b80601f0160208091040260200160405190810160405280929190818152602001828054612d81906147db565b8015612dce5780601f10612da357610100808354040283529160200191612dce565b820191906000526020600020905b815481529060010190602001808311612db157829003601f168201915b505050505081525092505050919050565b612de8836130a0565b60165463ffffffff16811115612e2a576040517fae7235df00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000838152600760205260409020612e4382848361487d565b50827fcba2d5723b2ee59e53a8e8a82a4a7caf4fdfe70e9f7c582950bf7e7a5c24e83d8383604051610ace929190614998565b6000610a1b82612883565b73ffffffffffffffffffffffffffffffffffffffff8281166000908152600f6020526040902054163314612ee1576040517fcebf515b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612f30576040517f8c8728c700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8281166000908152601060205260409020548116908216146111545773ffffffffffffffffffffffffffffffffffffffff82811660008181526010602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169486169485179055513392917f84f7c7c80bb8ed2279b4aab5f61cd05e6374073d38f46d7f32de8c30e9e3836791a45050565b612fe761301d565b612ff0816136fd565b50565b6000610a1b825490565b600061300983836137f2565b9392505050565b606060006130098361381c565b60005473ffffffffffffffffffffffffffffffffffffffff16331461309e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401611e10565b565b60008181526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1633146130fd576040517fa47c170600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526004602052604090205465010000000000900463ffffffff90811614612ff0576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818160045b600f8110156131e1577fff00000000000000000000000000000000000000000000000000000000000000821683826020811061319957613199614774565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146131cf57506000949350505050565b806131d9816147a3565b91505061315b565b5081600f1a60018111156131f7576131f7614460565b949350505050565b60006130098383613877565b6000806000836080015162ffffff1690506000808263ffffffff161190506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132bb9190614bad565b50945090925050506000811315806132d257508142105b806132f357508280156132f357506132ea8242614732565b8463ffffffff16105b15613302576017549550613306565b8095505b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015613371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133959190614bad565b50945090925050506000811315806133ac57508142105b806133cd57508280156133cd57506133c48242614732565b8463ffffffff16105b156133dc5760185494506133e0565b8094505b50505050915091565b6000806133fb88878b60c001516138c6565b90506000806134168b8a63ffffffff16858a8a60018b613988565b90925090506134258183614b16565b9b9a5050505050505050505050565b600060017f0000000000000000000000000000000000000000000000000000000000000000600281111561346a5761346a614460565b036134e457606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156134bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134df9190614b5d565b905090565b504390565b60006130098383613de1565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e01000000000000000000000000000090049091166060820152906136f157600081606001518561358d9190614a97565b9050600061359b8583614aeb565b905080836040018181516135af9190614b16565b6bffffffffffffffffffffffff169052506135ca8582614bfd565b836060018181516135db9190614b16565b6bffffffffffffffffffffffff90811690915273ffffffffffffffffffffffffffffffffffffffff89166000908152600b602090815260409182902087518154928901519389015160608a015186166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff919096166201000002167fffffffffffff000000000000000000000000000000000000000000000000ffff60ff95909516610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909416939093171792909216179190911790555050505b60400151949350505050565b3373ffffffffffffffffffffffffffffffffffffffff82160361377c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401611e10565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600082600001828154811061380957613809614774565b9060005260206000200154905092915050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561104657602002820191906000526020600020905b8154815260200190600101908083116138585750505050509050919050565b60008181526001830160205260408120546138be57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a1b565b506000610a1b565b600080808560018111156138dc576138dc614460565b036138eb575062015f90613940565b60018560018111156138ff576138ff614460565b0361390e57506201adb0613940565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61395163ffffffff85166014614c2d565b61395c846001614c44565b61396b9060ff16611d4c614c2d565b613975908361471f565b61397f919061471f565b95945050505050565b60008060008960a0015161ffff16876139a19190614c2d565b90508380156139af5750803a105b156139b757503a5b600060027f000000000000000000000000000000000000000000000000000000000000000060028111156139ed576139ed614460565b03613b4c576040805160008152602081019091528515613a4b57600036604051806080016040528060488152602001614d3260489139604051602001613a3593929190614c5d565b6040516020818303038152906040529050613ab3565b601654613a6790640100000000900463ffffffff166004614c84565b63ffffffff1667ffffffffffffffff811115613a8557613a85614745565b6040519080825280601f01601f191660200182016040528015613aaf576020820181803683370190505b5090505b6040517f49948e0e00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000000f906349948e0e90613b03908490600401614396565b602060405180830381865afa158015613b20573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b449190614b5d565b915050613ca6565b60017f00000000000000000000000000000000000000000000000000000000000000006002811115613b8057613b80614460565b03613ca6578415613c0257606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bfb9190614b5d565b9050613ca6565b6000606c73ffffffffffffffffffffffffffffffffffffffff166341b247a86040518163ffffffff1660e01b815260040160c060405180830381865afa158015613c50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c749190614ca4565b5050601654929450613c9793505050640100000000900463ffffffff1682614c2d565b613ca2906010614c2d565b9150505b84613cc257808b60a0015161ffff16613cbf9190614c2d565b90505b613cd061ffff871682614cee565b905060008782613ce08c8e61471f565b613cea9086614c2d565b613cf4919061471f565b613d0690670de0b6b3a7640000614c2d565b613d109190614cee565b905060008c6040015163ffffffff1664e8d4a51000613d2f9190614c2d565b898e6020015163ffffffff16858f88613d489190614c2d565b613d52919061471f565b613d6090633b9aca00614c2d565b613d6a9190614c2d565b613d749190614cee565b613d7e919061471f565b90506b033b2e3c9fd0803ce8000000613d97828461471f565b1115613dcf576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b60008181526001830160205260408120548015613eca576000613e05600183614732565b8554909150600090613e1990600190614732565b9050818114613e7e576000866000018281548110613e3957613e39614774565b9060005260206000200154905080876000018481548110613e5c57613e5c614774565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613e8f57613e8f614d02565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a1b565b6000915050610a1b565b5092915050565b60008060408385031215613eee57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015613f3557835183529284019291840191600101613f19565b50909695505050505050565b60008083601f840112613f5357600080fd5b50813567ffffffffffffffff811115613f6b57600080fd5b602083019150836020828501011115613f8357600080fd5b9250929050565b600080600060408486031215613f9f57600080fd5b83359250602084013567ffffffffffffffff811115613fbd57600080fd5b613fc986828701613f41565b9497909650939450505050565b600081518084526020808501945080840160005b8381101561401c57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101613fea565b509495945050505050565b805163ffffffff1682526000610200602083015161404d602086018263ffffffff169052565b506040830151614065604086018263ffffffff169052565b50606083015161407c606086018262ffffff169052565b506080830151614092608086018261ffff169052565b5060a08301516140b260a08601826bffffffffffffffffffffffff169052565b5060c08301516140ca60c086018263ffffffff169052565b5060e08301516140e260e086018263ffffffff169052565b506101008381015163ffffffff908116918601919091526101208085015190911690850152610140808401519085015261016080840151908501526101808084015173ffffffffffffffffffffffffffffffffffffffff16908501526101a08084015181860183905261415783870182613fd6565b925050506101c0808401516141838287018273ffffffffffffffffffffffffffffffffffffffff169052565b50506101e09283015115159390920192909252919050565b855163ffffffff16815260006101c060208801516141c960208501826bffffffffffffffffffffffff169052565b506040880151604084015260608801516141f360608501826bffffffffffffffffffffffff169052565b506080880151608084015260a088015161421560a085018263ffffffff169052565b5060c088015161422d60c085018263ffffffff169052565b5060e088015160e0840152610100808901516142508286018263ffffffff169052565b505061012088810151151590840152610140830181905261427381840188614027565b90508281036101608401526142888187613fd6565b905082810361018084015261429d8186613fd6565b9150506118606101a083018460ff169052565b73ffffffffffffffffffffffffffffffffffffffff81168114612ff057600080fd5b600080604083850312156142e557600080fd5b82356142f0816142b0565b915060208301356004811061430457600080fd5b809150509250929050565b60006020828403121561432157600080fd5b5035919050565b60005b8381101561434357818101518382015260200161432b565b50506000910152565b60008151808452614364816020860160208601614328565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000613009602083018461434c565b600080604083850312156143bc57600080fd5b823591506020830135614304816142b0565b600080602083850312156143e157600080fd5b823567ffffffffffffffff808211156143f957600080fd5b818501915085601f83011261440d57600080fd5b81358181111561441c57600080fd5b8660208260051b850101111561443157600080fd5b60209290920196919550909350505050565b60006020828403121561445557600080fd5b8135613009816142b0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110612ff057612ff0614460565b602081016144ac8361448f565b91905290565b60208101600283106144ac576144ac614460565b803563ffffffff811681146144da57600080fd5b919050565b600080604083850312156144f257600080fd5b82356002811061450157600080fd5b915061450f602084016144c6565b90509250929050565b60008060006040848603121561452d57600080fd5b8335614538816142b0565b9250602084013567ffffffffffffffff811115613fbd57600080fd5b6000806040838503121561456757600080fd5b8235614572816142b0565b91506020830135614304816142b0565b6000806040838503121561459557600080fd5b8235915061450f602084016144c6565b602081526145cc60208201835173ffffffffffffffffffffffffffffffffffffffff169052565b600060208301516145e5604084018263ffffffff169052565b50604083015161014080606085015261460261016085018361434c565b9150606085015161462360808601826bffffffffffffffffffffffff169052565b50608085015173ffffffffffffffffffffffffffffffffffffffff811660a08601525060a085015167ffffffffffffffff811660c08601525060c085015163ffffffff811660e08601525060e085015161010061468f818701836bffffffffffffffffffffffff169052565b86015190506101206146a48682018315159052565b8601518584037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001838701529050611860838261434c565b60208101600483106144ac576144ac614460565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610a1b57610a1b6146f0565b81810381811115610a1b57610a1b6146f0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036147d4576147d46146f0565b5060010190565b600181811c908216806147ef57607f821691505b602082108103614828577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b601f82111561487857600081815260208120601f850160051c810160208610156148555750805b601f850160051c820191505b8181101561487457828155600101614861565b5050505b505050565b67ffffffffffffffff83111561489557614895614745565b6148a9836148a383546147db565b8361482e565b6000601f8411600181146148fb57600085156148c55750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614991565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561494a578685013582556020948501946001909201910161492a565b5086821015614985577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60208152816020820152818360408301376000818301604090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160101919050565b6000604082016040835280865480835260608501915087600052602092508260002060005b82811015614a3c57815473ffffffffffffffffffffffffffffffffffffffff1684529284019260019182019101614a0a565b505050838103828501528481528590820160005b86811015614a8b578235614a63816142b0565b73ffffffffffffffffffffffffffffffffffffffff1682529183019190830190600101614a50565b50979650505050505050565b6bffffffffffffffffffffffff828116828216039080821115613ed457613ed46146f0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006bffffffffffffffffffffffff80841680614b0a57614b0a614abc565b92169190910492915050565b6bffffffffffffffffffffffff818116838216019080821115613ed457613ed46146f0565b600060208284031215614b4d57600080fd5b8151801515811461300957600080fd5b600060208284031215614b6f57600080fd5b5051919050565b600060208284031215614b8857600080fd5b8151613009816142b0565b805169ffffffffffffffffffff811681146144da57600080fd5b600080600080600060a08688031215614bc557600080fd5b614bce86614b93565b9450602086015193506040860151925060608601519150614bf160808701614b93565b90509295509295909350565b6bffffffffffffffffffffffff818116838216028082169190828114614c2557614c256146f0565b505092915050565b8082028115828204841417610a1b57610a1b6146f0565b60ff8181168382160190811115610a1b57610a1b6146f0565b828482376000838201600081528351614c7a818360208801614328565b0195945050505050565b63ffffffff818116838216028082169190828114614c2557614c256146f0565b60008060008060008060c08789031215614cbd57600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b600082614cfd57614cfd614abc565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a",
}
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, mode uint8, 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 +93,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, mode, link, linkNativeFeed, fastGasFeed, automationForwarderLogic, allowedReadOnlyAddress)
if err != nil {
return common.Address{}, nil, nil, err
}
@@ -260,6 +260,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")
@@ -5415,6 +5437,8 @@ 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)
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..3b5880fef9a 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
@@ -51,7 +51,7 @@ type AutomationRegistryBase22OnchainConfig struct {
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",
+ Bin: "0x6101606040523480156200001257600080fd5b506040516200564e3803806200564e83398101604081905262000035916200044b565b80816001600160a01b0316634b4fd03b6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000075573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009b919062000472565b826001600160a01b031663ca30e6036040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200010091906200044b565b836001600160a01b031663b10b673c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200013f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016591906200044b565b846001600160a01b0316636709d0e56040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001ca91906200044b565b856001600160a01b0316635425d8ac6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000209573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200022f91906200044b565b866001600160a01b031663a08714c06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200026e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029491906200044b565b3380600081620002eb5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b03848116919091179091558116156200031e576200031e8162000387565b50505085600281111562000336576200033662000495565b60e08160028111156200034d576200034d62000495565b9052506001600160a01b0394851660805292841660a05290831660c052821661010052811661012052919091166101405250620004ab9050565b336001600160a01b03821603620003e15760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401620002e2565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6001600160a01b03811681146200044857600080fd5b50565b6000602082840312156200045e57600080fd5b81516200046b8162000432565b9392505050565b6000602082840312156200048557600080fd5b8151600381106200046b57600080fd5b634e487b7160e01b600052602160045260246000fd5b60805160a05160c05160e051610100516101205161014051615136620005186000396000818160d6015261016f015260006127150152600050506000818161253d0152818161347e015281816136110152613b2e01526000505060005050600061134a01526151366000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c8063a4c0ed3611610081578063b1dc65a41161005b578063b1dc65a4146102e0578063e3d0e712146102f3578063f2fde38b14610306576100d4565b8063a4c0ed3614610262578063aed2e92914610275578063afcb95d71461029f576100d4565b806379ba5097116100b257806379ba5097146101c757806381ff7048146101cf5780638da5cb5b14610244576100d4565b8063181f5a771461011b578063349e8cca1461016d5780636cad5469146101b4575b7f00000000000000000000000000000000000000000000000000000000000000003660008037600080366000845af43d6000803e808015610114573d6000f35b3d6000fd5b005b6101576040518060400160405280601881526020017f4175746f6d6174696f6e526567697374727920322e322e30000000000000000081525081565b6040516101649190613dad565b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610164565b6101196101c23660046141dc565b610319565b610119611230565b61022160155460115463ffffffff780100000000000000000000000000000000000000000000000083048116937c01000000000000000000000000000000000000000000000000000000009093041691565b6040805163ffffffff948516815293909216602084015290820152606001610164565b60005473ffffffffffffffffffffffffffffffffffffffff1661018f565b6101196102703660046142f2565b611332565b61028861028336600461434e565b61154e565b604080519215158352602083019190915201610164565b601154601254604080516000815260208101939093527401000000000000000000000000000000000000000090910463ffffffff1690820152606001610164565b6101196102ee3660046143df565b6116c6565b610119610301366004614496565b61226f565b610119610314366004614525565b612298565b6103216122ac565b601f8651111561035d576040517f25d0209c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360ff1660000361039a576040517fe77dba5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845186511415806103b957506103b1846003614571565b60ff16865111155b156103f0576040517f1d2d1c5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601254600e546bffffffffffffffffffffffff9091169060005b816bffffffffffffffffffffffff168110156104725761045f600e82815481106104365761043661458d565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16848461232f565b508061046a816145bc565b91505061040a565b5060008060005b836bffffffffffffffffffffffff1681101561057b57600d81815481106104a2576104a261458d565b600091825260209091200154600e805473ffffffffffffffffffffffffffffffffffffffff909216945090829081106104dd576104dd61458d565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff8681168452600c8352604080852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001690559116808452600b90925290912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055915080610573816145bc565b915050610479565b50610588600d6000613c82565b610594600e6000613c82565b604080516080810182526000808252602082018190529181018290526060810182905290805b8c518110156109fd57600c60008e83815181106105d9576105d961458d565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040016000205460ff1615610644576040517f77cea0fa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168d828151811061066e5761066e61458d565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036106c3576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052806001151581526020018260ff16815250600c60008f84815181106106f4576106f461458d565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528181019290925260400160002082518154939092015160ff16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092171790558b518c908290811061079c5761079c61458d565b60200260200101519150600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361080c576040517f58a70a0a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600b60209081526040918290208251608081018452905460ff80821615801584526101008304909116938301939093526bffffffffffffffffffffffff6201000082048116948301949094526e010000000000000000000000000000900490921660608301529093506108c7576040517f6a7281ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001835260ff80821660208086019182526bffffffffffffffffffffffff808b166060880190815273ffffffffffffffffffffffffffffffffffffffff87166000908152600b909352604092839020885181549551948a0151925184166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff939094166201000002929092167fffffffffffff000000000000000000000000000000000000000000000000ffff94909616610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090951694909417179190911692909217919091179055806109f5816145bc565b9150506105ba565b50508a51610a139150600d9060208d0190613ca0565b508851610a2790600e9060208c0190613ca0565b50604051806101400160405280856bffffffffffffffffffffffff168152602001886000015163ffffffff168152602001886020015163ffffffff168152602001600063ffffffff168152602001886060015162ffffff168152602001886080015161ffff1681526020018960ff1681526020016012600001601e9054906101000a900460ff16151581526020016012600001601f9054906101000a900460ff1615158152602001886101e001511515815250601260008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548163ffffffff021916908363ffffffff16021790555060408201518160000160106101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160146101000a81548163ffffffff021916908363ffffffff16021790555060808201518160000160186101000a81548162ffffff021916908362ffffff16021790555060a082015181600001601b6101000a81548161ffff021916908361ffff16021790555060c082015181600001601d6101000a81548160ff021916908360ff16021790555060e082015181600001601e6101000a81548160ff02191690831515021790555061010082015181600001601f6101000a81548160ff0219169083151502179055506101208201518160010160006101000a81548160ff0219169083151502179055509050506040518061018001604052808860a001516bffffffffffffffffffffffff16815260200188610180015173ffffffffffffffffffffffffffffffffffffffff168152602001601460010160009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff168152602001886040015163ffffffff1681526020018860c0015163ffffffff168152602001601460010160149054906101000a900463ffffffff1663ffffffff168152602001601460010160189054906101000a900463ffffffff1663ffffffff1681526020016014600101601c9054906101000a900463ffffffff1663ffffffff1681526020018860e0015163ffffffff16815260200188610100015163ffffffff16815260200188610120015163ffffffff168152602001886101c0015173ffffffffffffffffffffffffffffffffffffffff16815250601460008201518160000160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550602082015181600001600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160010160006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550606082015181600101600c6101000a81548163ffffffff021916908363ffffffff16021790555060808201518160010160106101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160146101000a81548163ffffffff021916908363ffffffff16021790555060c08201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555060e082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055506101008201518160020160006101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160020160046101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160086101000a81548163ffffffff021916908363ffffffff16021790555061016082015181600201600c6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505086610140015160178190555086610160015160188190555060006014600101601c9054906101000a900463ffffffff169050611017612537565b601580547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167c010000000000000000000000000000000000000000000000000000000063ffffffff938416021780825560019260189161109291859178010000000000000000000000000000000000000000000000009004166145f4565b92506101000a81548163ffffffff021916908363ffffffff1602179055506000886040516020016110c39190614662565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905260155490915061112c90469030907801000000000000000000000000000000000000000000000000900463ffffffff168f8f8f878f8f6125ec565b60115560005b61113c6009612696565b81101561116c576111596111516009836126a6565b6009906126b9565b5080611164816145bc565b915050611132565b5060005b896101a00151518110156111c3576111b08a6101a0015182815181106111985761119861458d565b602002602001015160096126db90919063ffffffff16565b50806111bb816145bc565b915050611170565b507f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0582601154601460010160189054906101000a900463ffffffff168f8f8f878f8f60405161121a999897969594939291906147dd565b60405180910390a1505050505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146112b6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113a1576040517fc8bad78d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081146113db576040517fdfe9309000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006113e982840184614873565b60008181526004602052604090205490915065010000000000900463ffffffff90811614611443576040517f9c0083a200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008181526004602052604090206001015461147e9085906c0100000000000000000000000090046bffffffffffffffffffffffff1661488c565b600082815260046020526040902060010180546bffffffffffffffffffffffff929092166c01000000000000000000000000027fffffffffffffffff000000000000000000000000ffffffffffffffffffffffff9092169190911790556019546114e99085906148b1565b6019556040516bffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff86169082907fafd24114486da8ebfc32f3626dada8863652e187461aa74d4bfa7348915062039060200160405180910390a35050505050565b6000806115596126fd565b6012547e01000000000000000000000000000000000000000000000000000000000000900460ff16156115b8576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600085815260046020908152604091829020825160e081018452815460ff811615158252610100810463ffffffff908116838601819052650100000000008304821684880152690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff16606084018190526001909401546bffffffffffffffffffffffff80821660808601526c0100000000000000000000000082041660a0850152780100000000000000000000000000000000000000000000000090041660c08301528451601f890185900485028101850190955287855290936116b793899089908190840183828082843760009201919091525061276c92505050565b9093509150505b935093915050565b60005a60408051610140810182526012546bffffffffffffffffffffffff8116825263ffffffff6c010000000000000000000000008204811660208401527001000000000000000000000000000000008204811693830193909352740100000000000000000000000000000000000000008104909216606082015262ffffff7801000000000000000000000000000000000000000000000000830416608082015261ffff7b0100000000000000000000000000000000000000000000000000000083041660a082015260ff7d0100000000000000000000000000000000000000000000000000000000008304811660c08301527e010000000000000000000000000000000000000000000000000000000000008304811615801560e08401527f010000000000000000000000000000000000000000000000000000000000000090930481161515610100830152601354161515610120820152919250611858576040517f24522f3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b602052604090205460ff166118a1576040517f1099ed7500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6011548a35146118dd576040517fdfdcf8e700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c08101516118ed9060016148c4565b60ff16861415806118fe5750858414155b15611935576040517f0244f71a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119458a8a8a8a8a8a8a8a612995565b60006119518a8a612bfe565b9050600081604001515167ffffffffffffffff81111561197357611973613dc0565b604051908082528060200260200182016040528015611a3757816020015b604080516101e0810182526000610100820181815261012083018290526101408301829052610160830182905261018083018290526101a083018290526101c0830182905282526020808301829052928201819052606082018190526080820181905260a0820181905260c0820181905260e082015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816119915790505b5090506000805b836040015151811015611e81576004600085604001518381518110611a6557611a6561458d565b6020908102919091018101518252818101929092526040908101600020815160e081018352815460ff811615158252610100810463ffffffff90811695830195909552650100000000008104851693820193909352690100000000000000000090920473ffffffffffffffffffffffffffffffffffffffff166060830152600101546bffffffffffffffffffffffff80821660808401526c0100000000000000000000000082041660a08301527801000000000000000000000000000000000000000000000000900490911660c08201528351849083908110611b4a57611b4a61458d565b602002602001015160000181905250611b7f84604001518281518110611b7257611b7261458d565b6020026020010151612cb7565b838281518110611b9157611b9161458d565b6020026020010151608001906001811115611bae57611bae6148dd565b90816001811115611bc157611bc16148dd565b81525050611c3585848381518110611bdb57611bdb61458d565b60200260200101516080015186606001518481518110611bfd57611bfd61458d565b60200260200101518760a001518581518110611c1b57611c1b61458d565b602002602001015151886000015189602001516001612d62565b838281518110611c4757611c4761458d565b6020026020010151604001906bffffffffffffffffffffffff1690816bffffffffffffffffffffffff1681525050611cd484604001518281518110611c8e57611c8e61458d565b602002602001015185608001518381518110611cac57611cac61458d565b6020026020010151858481518110611cc657611cc661458d565b602002602001015188612dad565b848381518110611ce657611ce661458d565b6020026020010151602001858481518110611d0357611d0361458d565b602002602001015160e0018281525082151515158152505050828181518110611d2e57611d2e61458d565b60200260200101516020015115611d5157611d4a60018361490c565b9150611d56565b611e6f565b611dbc838281518110611d6b57611d6b61458d565b6020026020010151600001516060015185606001518381518110611d9157611d9161458d565b60200260200101518660a001518481518110611daf57611daf61458d565b602002602001015161276c565b848381518110611dce57611dce61458d565b6020026020010151606001858481518110611deb57611deb61458d565b602002602001015160a0018281525082151515158152505050828181518110611e1657611e1661458d565b602002602001015160a0015186611e2d9190614927565b9550611e6f84604001518281518110611e4857611e4861458d565b6020026020010151848381518110611e6257611e6261458d565b6020026020010151612f30565b80611e79816145bc565b915050611a3e565b508061ffff16600003611e98575050505050612265565b60c0840151611ea89060016148c4565b611eb79060ff1661044c61493a565b616b6c611ec58d601061493a565b5a611ed09089614927565b611eda91906148b1565b611ee491906148b1565b611eee91906148b1565b9450611b58611f0161ffff831687614980565b611f0b91906148b1565b945060008060008060005b87604001515181101561210c57868181518110611f3557611f3561458d565b602002602001015160200151156120fa57611f918a888381518110611f5c57611f5c61458d565b6020026020010151608001518a60a001518481518110611f7e57611f7e61458d565b6020026020010151518c60c00151613042565b878281518110611fa357611fa361458d565b602002602001015160c0018181525050611fff8989604001518381518110611fcd57611fcd61458d565b6020026020010151898481518110611fe757611fe761458d565b60200260200101518b600001518c602001518b613062565b909350915061200e828561488c565b935061201a838661488c565b945086818151811061202e5761202e61458d565b6020026020010151606001511515886040015182815181106120525761205261458d565b60200260200101517fad8cc9579b21dfe2c2f6ea35ba15b656e46b4f5b0cb424f52739b8ce5cac9c5b8486612087919061488c565b8a85815181106120995761209961458d565b602002602001015160a001518b86815181106120b7576120b761458d565b602002602001015160c001518d6080015187815181106120d9576120d961458d565b60200260200101516040516120f19493929190614994565b60405180910390a35b80612104816145bc565b915050611f16565b5050336000908152600b6020526040902080548492506002906121449084906201000090046bffffffffffffffffffffffff1661488c565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555080601260000160008282829054906101000a90046bffffffffffffffffffffffff1661219e919061488c565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555060008f6001600381106121e1576121e161458d565b602002013560001c9050600060088264ffffffffff16901c9050876060015163ffffffff168163ffffffff16111561225b57601280547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff8416021790555b5050505050505050505b5050505050505050565b612290868686868060200190518101906122899190614a77565b8686610319565b505050505050565b6122a06122ac565b6122a981613155565b50565b60005473ffffffffffffffffffffffffffffffffffffffff16331461232d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016112ad565b565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600b602090815260408083208151608081018352905460ff80821615801584526101008304909116948301949094526bffffffffffffffffffffffff6201000082048116938301939093526e010000000000000000000000000000900490911660608201529061252b5760008160600151856123c79190614be5565b905060006123d58583614c0a565b905080836040018181516123e9919061488c565b6bffffffffffffffffffffffff169052506124048582614c35565b83606001818151612415919061488c565b6bffffffffffffffffffffffff90811690915273ffffffffffffffffffffffffffffffffffffffff89166000908152600b602090815260409182902087518154928901519389015160608a015186166e010000000000000000000000000000027fffffffffffff000000000000000000000000ffffffffffffffffffffffffffff919096166201000002167fffffffffffff000000000000000000000000000000000000000000000000ffff60ff95909516610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff921515929092167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909416939093171792909216179190911790555050505b60400151949350505050565b600060017f0000000000000000000000000000000000000000000000000000000000000000600281111561256d5761256d6148dd565b036125e757606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156125be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e29190614c65565b905090565b504390565b6000808a8a8a8a8a8a8a8a8a60405160200161261099989796959493929190614c7e565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179b9a5050505050505050505050565b60006126a0825490565b92915050565b60006126b2838361324a565b9392505050565b60006126b28373ffffffffffffffffffffffffffffffffffffffff8416613274565b60006126b28373ffffffffffffffffffffffffffffffffffffffff841661336e565b3273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461232d576040517fb60ac5db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60125460009081907f0100000000000000000000000000000000000000000000000000000000000000900460ff16156127d1576040517f37ed32e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01000000000000000000000000000000000000000000000000000000000000001790556040517f4585e33b000000000000000000000000000000000000000000000000000000009061284d908590602401613dad565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290517f79188d1600000000000000000000000000000000000000000000000000000000815290935073ffffffffffffffffffffffffffffffffffffffff8616906379188d16906129209087908790600401614d13565b60408051808303816000875af115801561293e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129629190614d2c565b601280547effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16905590969095509350505050565b600087876040516129a7929190614d5a565b6040519081900381206129be918b90602001614d6a565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201208383019092526000808452908301819052909250906000805b88811015612b9557600185878360208110612a2a57612a2a61458d565b612a3791901a601b6148c4565b8c8c85818110612a4957612a4961458d565b905060200201358b8b86818110612a6257612a6261458d565b9050602002013560405160008152602001604052604051612a9f949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa158015612ac1573d6000803e3d6000fd5b5050604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081015173ffffffffffffffffffffffffffffffffffffffff81166000908152600c602090815290849020838501909452925460ff8082161515808552610100909204169383019390935290955093509050612b6f576040517f0f4c073700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826020015160080260ff166001901b840193508080612b8d906145bc565b915050612a0d565b50827e01010101010101010101010101010101010101010101010101010101010101841614612bf0576040517fc103be2e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050505050565b612c376040518060c001604052806000815260200160008152602001606081526020016060815260200160608152602001606081525090565b6000612c4583850185614e5b565b6040810151516060820151519192509081141580612c6857508082608001515114155b80612c785750808260a001515114155b15612caf576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b509392505050565b6000818160045b600f811015612d44577fff000000000000000000000000000000000000000000000000000000000000008216838260208110612cfc57612cfc61458d565b1a60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612d3257506000949350505050565b80612d3c816145bc565b915050612cbe565b5081600f1a6001811115612d5a57612d5a6148dd565b949350505050565b600080612d7488878b60c001516133bd565b9050600080612d8f8b8a63ffffffff16858a8a60018b613449565b9092509050612d9e818361488c565b9b9a5050505050505050505050565b600080808085608001516001811115612dc857612dc86148dd565b03612ded57612dd9878787876138a2565b612de857600092509050612f27565b612e64565b600185608001516001811115612e0557612e056148dd565b03612e32576000612e178888876139a4565b9250905080612e2c5750600092509050612f27565b50612e64565b6040517ff2b2d41200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612e6c612537565b85516040015163ffffffff1611612ec057867fc3237c8807c467c1b39b8d0395eff077313e691bf0a7388106792564ebfd563687604051612ead9190613dad565b60405180910390a2600092509050612f27565b84604001516bffffffffffffffffffffffff16856000015160a001516bffffffffffffffffffffffff161015612f2057867f377c8b0c126ae5248d27aca1c76fac4608aff85673ee3caf09747e1044549e0287604051612ead9190613dad565b6001925090505b94509492505050565b600081608001516001811115612f4857612f486148dd565b03612fba57612f55612537565b6000838152600460205260409020600101805463ffffffff929092167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9092169190911790555050565b600181608001516001811115612fd257612fd26148dd565b0361303e5760e08101805160009081526008602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055915191517fa4a4e334c0e330143f9437484fe516c13bc560b86b5b0daf58e7084aaac228f29190a25b5050565b600061304f8484846133bd565b905080851015612d5a5750929392505050565b60008061307d888760a001518860c001518888886001613449565b9092509050600061308e828461488c565b600089815260046020526040902060010180549192508291600c906130d29084906c0100000000000000000000000090046bffffffffffffffffffffffff16614be5565b82546101009290920a6bffffffffffffffffffffffff81810219909316918316021790915560008a81526004602052604081206001018054859450909261311b9185911661488c565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050965096945050505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036131d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016112ad565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008260000182815481106132615761326161458d565b9060005260206000200154905092915050565b6000818152600183016020526040812054801561335d576000613298600183614927565b85549091506000906132ac90600190614927565b90508181146133115760008660000182815481106132cc576132cc61458d565b90600052602060002001549050808760000184815481106132ef576132ef61458d565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061332257613322614f48565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506126a0565b60009150506126a0565b5092915050565b60008181526001830160205260408120546133b5575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556126a0565b5060006126a0565b600080808560018111156133d3576133d36148dd565b036133e2575062015f90613401565b60018560018111156133f6576133f66148dd565b03612e3257506201adb05b61341263ffffffff8516601461493a565b61341d8460016148c4565b61342c9060ff16611d4c61493a565b61343690836148b1565b61344091906148b1565b95945050505050565b60008060008960a0015161ffff1687613462919061493a565b90508380156134705750803a105b1561347857503a5b600060027f000000000000000000000000000000000000000000000000000000000000000060028111156134ae576134ae6148dd565b0361360d57604080516000815260208101909152851561350c576000366040518060800160405280604881526020016150e2604891396040516020016134f693929190614f77565b6040516020818303038152906040529050613574565b60165461352890640100000000900463ffffffff166004614f9e565b63ffffffff1667ffffffffffffffff81111561354657613546613dc0565b6040519080825280601f01601f191660200182016040528015613570576020820181803683370190505b5090505b6040517f49948e0e00000000000000000000000000000000000000000000000000000000815273420000000000000000000000000000000000000f906349948e0e906135c4908490600401613dad565b602060405180830381865afa1580156135e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136059190614c65565b915050613767565b60017f00000000000000000000000000000000000000000000000000000000000000006002811115613641576136416148dd565b036137675784156136c357606c73ffffffffffffffffffffffffffffffffffffffff1663c6f7de0e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613698573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136bc9190614c65565b9050613767565b6000606c73ffffffffffffffffffffffffffffffffffffffff166341b247a86040518163ffffffff1660e01b815260040160c060405180830381865afa158015613711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137359190614fbe565b505060165492945061375893505050640100000000900463ffffffff168261493a565b61376390601061493a565b9150505b8461378357808b60a0015161ffff16613780919061493a565b90505b61379161ffff871682614980565b9050600087826137a18c8e6148b1565b6137ab908661493a565b6137b591906148b1565b6137c790670de0b6b3a764000061493a565b6137d19190614980565b905060008c6040015163ffffffff1664e8d4a510006137f0919061493a565b898e6020015163ffffffff16858f88613809919061493a565b61381391906148b1565b61382190633b9aca0061493a565b61382b919061493a565b6138359190614980565b61383f91906148b1565b90506b033b2e3c9fd0803ce800000061385882846148b1565b1115613890576040517f2ad7547a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b909c909b509950505050505050505050565b600080848060200190518101906138b99190615008565b845160c00151815191925063ffffffff9081169116101561391657857f405288ea7be309e16cfdf481367f90a413e1d4634fcdaf8966546db9b93012e8866040516139049190613dad565b60405180910390a26000915050612d5a565b826101200151801561394a575060208101511580159061394a5750602081015181516139479063ffffffff16613b28565b14155b806139635750613958612537565b815163ffffffff1610155b1561399857857f6aa7f60c176da7af894b384daea2249497448137f5943c1237ada8bc92bdc301866040516139049190613dad565b50600195945050505050565b6000806000848060200190518101906139bd9190615060565b9050600086826000015183602001518460400151604051602001613a1f94939291909384526020840192909252604083015260e01b7fffffffff0000000000000000000000000000000000000000000000000000000016606082015260640190565b6040516020818303038152906040528051906020012090508461012001518015613a6d5750608082015115801590613a6d57508160800151613a6a836060015163ffffffff16613b28565b14155b80613a895750613a7b612537565b826060015163ffffffff1610155b15613ad357867f6aa7f60c176da7af894b384daea2249497448137f5943c1237ada8bc92bdc30187604051613abe9190613dad565b60405180910390a26000935091506116be9050565b60008181526008602052604090205460ff1615613b1a57867f405288ea7be309e16cfdf481367f90a413e1d4634fcdaf8966546db9b93012e887604051613abe9190613dad565b600197909650945050505050565b600060017f00000000000000000000000000000000000000000000000000000000000000006002811115613b5e57613b5e6148dd565b03613c78576000606473ffffffffffffffffffffffffffffffffffffffff1663a3b1b31d6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613bb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613bd59190614c65565b90508083101580613bf05750610100613bee8483614927565b115b15613bfe5750600092915050565b6040517f2b407a8200000000000000000000000000000000000000000000000000000000815260048101849052606490632b407a8290602401602060405180830381865afa158015613c54573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126b29190614c65565b504090565b919050565b50805460008255906000526020600020908101906122a99190613d2a565b828054828255906000526020600020908101928215613d1a579160200282015b82811115613d1a57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909116178255602090920191600190910190613cc0565b50613d26929150613d2a565b5090565b5b80821115613d265760008155600101613d2b565b60005b83811015613d5a578181015183820152602001613d42565b50506000910152565b60008151808452613d7b816020860160208601613d3f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006126b26020830184613d63565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610200810167ffffffffffffffff81118282101715613e1357613e13613dc0565b60405290565b60405160c0810167ffffffffffffffff81118282101715613e1357613e13613dc0565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613e8357613e83613dc0565b604052919050565b600067ffffffffffffffff821115613ea557613ea5613dc0565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146122a957600080fd5b8035613c7d81613eaf565b600082601f830112613eed57600080fd5b81356020613f02613efd83613e8b565b613e3c565b82815260059290921b84018101918181019086841115613f2157600080fd5b8286015b84811015613f45578035613f3881613eaf565b8352918301918301613f25565b509695505050505050565b803560ff81168114613c7d57600080fd5b63ffffffff811681146122a957600080fd5b8035613c7d81613f61565b62ffffff811681146122a957600080fd5b8035613c7d81613f7e565b61ffff811681146122a957600080fd5b8035613c7d81613f9a565b6bffffffffffffffffffffffff811681146122a957600080fd5b8035613c7d81613fb5565b80151581146122a957600080fd5b8035613c7d81613fda565b6000610200828403121561400657600080fd5b61400e613def565b905061401982613f73565b815261402760208301613f73565b602082015261403860408301613f73565b604082015261404960608301613f8f565b606082015261405a60808301613faa565b608082015261406b60a08301613fcf565b60a082015261407c60c08301613f73565b60c082015261408d60e08301613f73565b60e08201526101006140a0818401613f73565b908201526101206140b2838201613f73565b90820152610140828101359082015261016080830135908201526101806140da818401613ed1565b908201526101a08281013567ffffffffffffffff8111156140fa57600080fd5b61410685828601613edc565b8284015250506101c061411a818401613ed1565b908201526101e061412c838201613fe8565b9082015292915050565b803567ffffffffffffffff81168114613c7d57600080fd5b600082601f83011261415f57600080fd5b813567ffffffffffffffff81111561417957614179613dc0565b6141aa60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613e3c565b8181528460208386010111156141bf57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156141f557600080fd5b863567ffffffffffffffff8082111561420d57600080fd5b6142198a838b01613edc565b9750602089013591508082111561422f57600080fd5b61423b8a838b01613edc565b965061424960408a01613f50565b9550606089013591508082111561425f57600080fd5b61426b8a838b01613ff3565b945061427960808a01614136565b935060a089013591508082111561428f57600080fd5b5061429c89828a0161414e565b9150509295509295509295565b60008083601f8401126142bb57600080fd5b50813567ffffffffffffffff8111156142d357600080fd5b6020830191508360208285010111156142eb57600080fd5b9250929050565b6000806000806060858703121561430857600080fd5b843561431381613eaf565b935060208501359250604085013567ffffffffffffffff81111561433657600080fd5b614342878288016142a9565b95989497509550505050565b60008060006040848603121561436357600080fd5b83359250602084013567ffffffffffffffff81111561438157600080fd5b61438d868287016142a9565b9497909650939450505050565b60008083601f8401126143ac57600080fd5b50813567ffffffffffffffff8111156143c457600080fd5b6020830191508360208260051b85010111156142eb57600080fd5b60008060008060008060008060e0898b0312156143fb57600080fd5b606089018a81111561440c57600080fd5b8998503567ffffffffffffffff8082111561442657600080fd5b6144328c838d016142a9565b909950975060808b013591508082111561444b57600080fd5b6144578c838d0161439a565b909750955060a08b013591508082111561447057600080fd5b5061447d8b828c0161439a565b999c989b50969995989497949560c00135949350505050565b60008060008060008060c087890312156144af57600080fd5b863567ffffffffffffffff808211156144c757600080fd5b6144d38a838b01613edc565b975060208901359150808211156144e957600080fd5b6144f58a838b01613edc565b965061450360408a01613f50565b9550606089013591508082111561451957600080fd5b61426b8a838b0161414e565b60006020828403121561453757600080fd5b81356126b281613eaf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60ff818116838216029081169081811461336757613367614542565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ed576145ed614542565b5060010190565b63ffffffff81811683821601908082111561336757613367614542565b600081518084526020808501945080840160005b8381101561465757815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614625565b509495945050505050565b6020815261467960208201835163ffffffff169052565b60006020830151614692604084018263ffffffff169052565b50604083015163ffffffff8116606084015250606083015162ffffff8116608084015250608083015161ffff811660a08401525060a08301516bffffffffffffffffffffffff811660c08401525060c083015163ffffffff811660e08401525060e083015161010061470b8185018363ffffffff169052565b84015190506101206147248482018363ffffffff169052565b840151905061014061473d8482018363ffffffff169052565b840151610160848101919091528401516101808085019190915284015190506101a06147808185018373ffffffffffffffffffffffffffffffffffffffff169052565b808501519150506102006101c081818601526147a0610220860184614611565b908601519092506101e06147cb8682018373ffffffffffffffffffffffffffffffffffffffff169052565b90950151151593019290925250919050565b600061012063ffffffff808d1684528b6020850152808b1660408501525080606084015261480d8184018a614611565b905082810360808401526148218189614611565b905060ff871660a084015282810360c084015261483e8187613d63565b905067ffffffffffffffff851660e08401528281036101008401526148638185613d63565b9c9b505050505050505050505050565b60006020828403121561488557600080fd5b5035919050565b6bffffffffffffffffffffffff81811683821601908082111561336757613367614542565b808201808211156126a0576126a0614542565b60ff81811683821601908111156126a0576126a0614542565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b61ffff81811683821601908082111561336757613367614542565b818103818111156126a0576126a0614542565b80820281158282048414176126a0576126a0614542565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261498f5761498f614951565b500490565b6bffffffffffffffffffffffff851681528360208201528260408201526080606082015260006149c76080830184613d63565b9695505050505050565b8051613c7d81613f61565b8051613c7d81613f7e565b8051613c7d81613f9a565b8051613c7d81613fb5565b8051613c7d81613eaf565b600082601f830112614a1957600080fd5b81516020614a29613efd83613e8b565b82815260059290921b84018101918181019086841115614a4857600080fd5b8286015b84811015613f45578051614a5f81613eaf565b8352918301918301614a4c565b8051613c7d81613fda565b600060208284031215614a8957600080fd5b815167ffffffffffffffff80821115614aa157600080fd5b908301906102008286031215614ab657600080fd5b614abe613def565b614ac7836149d1565b8152614ad5602084016149d1565b6020820152614ae6604084016149d1565b6040820152614af7606084016149dc565b6060820152614b08608084016149e7565b6080820152614b1960a084016149f2565b60a0820152614b2a60c084016149d1565b60c0820152614b3b60e084016149d1565b60e0820152610100614b4e8185016149d1565b90820152610120614b608482016149d1565b9082015261014083810151908201526101608084015190820152610180614b888185016149fd565b908201526101a08381015183811115614ba057600080fd5b614bac88828701614a08565b8284015250506101c09150614bc28284016149fd565b828201526101e09150614bd6828401614a6c565b91810191909152949350505050565b6bffffffffffffffffffffffff82811682821603908082111561336757613367614542565b60006bffffffffffffffffffffffff80841680614c2957614c29614951565b92169190910492915050565b6bffffffffffffffffffffffff818116838216028082169190828114614c5d57614c5d614542565b505092915050565b600060208284031215614c7757600080fd5b5051919050565b60006101208b835273ffffffffffffffffffffffffffffffffffffffff8b16602084015267ffffffffffffffff808b166040850152816060850152614cc58285018b614611565b91508382036080850152614cd9828a614611565b915060ff881660a085015283820360c0850152614cf68288613d63565b90861660e085015283810361010085015290506148638185613d63565b828152604060208201526000612d5a6040830184613d63565b60008060408385031215614d3f57600080fd5b8251614d4a81613fda565b6020939093015192949293505050565b8183823760009101908152919050565b8281526080810160608360208401379392505050565b600082601f830112614d9157600080fd5b81356020614da1613efd83613e8b565b82815260059290921b84018101918181019086841115614dc057600080fd5b8286015b84811015613f455780358352918301918301614dc4565b600082601f830112614dec57600080fd5b81356020614dfc613efd83613e8b565b82815260059290921b84018101918181019086841115614e1b57600080fd5b8286015b84811015613f4557803567ffffffffffffffff811115614e3f5760008081fd5b614e4d8986838b010161414e565b845250918301918301614e1f565b600060208284031215614e6d57600080fd5b813567ffffffffffffffff80821115614e8557600080fd5b9083019060c08286031215614e9957600080fd5b614ea1613e19565b8235815260208301356020820152604083013582811115614ec157600080fd5b614ecd87828601614d80565b604083015250606083013582811115614ee557600080fd5b614ef187828601614d80565b606083015250608083013582811115614f0957600080fd5b614f1587828601614ddb565b60808301525060a083013582811115614f2d57600080fd5b614f3987828601614ddb565b60a08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b828482376000838201600081528351614f94818360208801613d3f565b0195945050505050565b63ffffffff818116838216028082169190828114614c5d57614c5d614542565b60008060008060008060c08789031215614fd757600080fd5b865195506020870151945060408701519350606087015192506080870151915060a087015190509295509295509295565b60006040828403121561501a57600080fd5b6040516040810181811067ffffffffffffffff8211171561503d5761503d613dc0565b604052825161504b81613f61565b81526020928301519281019290925250919050565b600060a0828403121561507257600080fd5b60405160a0810181811067ffffffffffffffff8211171561509557615095613dc0565b8060405250825181526020830151602082015260408301516150b681613f61565b604082015260608301516150c981613f61565b6060820152608092830151928101929092525091905056fe307866666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666666a164736f6c6343000813000a",
}
var AutomationRegistryABI = AutomationRegistryMetaData.ABI
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 fb90f241339..6e5681bb0fc 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
@@ -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 297e3b22f8087dc79bb76e06b8e605ee855c1ba60466bdc4b3a879dc633d4fd3
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 89a18aa7b49178520a7195cef1c2f1069a600c17a62c0efc92a4ee365b39eca1
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 c775e0bb87a7e6d04ac36312d7dea65162a71777556edb41b0d1060c67f61d20
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 55c423335ec7fe67ae99be7a9f617740946abeccf86b2eed03b77d447f0ca8b4
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
From f90e419c7f2e06ed4092d0788ea4560b55072e8f Mon Sep 17 00:00:00 2001
From: Sam
Date: Wed, 7 Feb 2024 17:29:09 -0500
Subject: [PATCH 12/12] Implement LLO relayer interface (#11935)
* Implement LLO relayer interface
* Fix case coverage for loops
* Point chain repos to latest
* generate mocks
* Adding ocr2 to configs + fix solana e2e tests (#11952)
* Minor changes (#11943)
* core/chains/evm/assets: FuzzWei skip large exponents (#11948)
* core/chains/evm/assets: fix FuzzWei range detection (#11950)
* Adding ocr2 to configs
* Solana bumps
* Reverting mistake rebase changes
* Bump go deps
* Added ocr2 conf
* fix typo + gomodtidy
* bump solana
* bump solana: fix test compilation
* fix: setup CI to pull CL image version for toml
* bump solana to merged commit
---------
Co-authored-by: aalu1418 <50029043+aalu1418@users.noreply.github.com>
* Add MockRelayer function
* Make sonarqube run
* Exclude integration tests from sonarqube duplicate coverage
* Properly format sonarqube file
---------
Co-authored-by: Damjan Smickovski <32773226+smickovskid@users.noreply.github.com>
Co-authored-by: aalu1418 <50029043+aalu1418@users.noreply.github.com>
---
.github/workflows/integration-tests.yml | 13 +++
core/scripts/go.mod | 8 +-
core/scripts/go.sum | 16 ++--
core/services/relay/evm/evm.go | 4 +
.../relay/evm/mocks/loop_relay_adapter.go | 30 ++++++
core/services/relay/relay.go | 2 +-
core/web/testutils/mock_relayer.go | 4 +
go.mod | 8 +-
go.sum | 16 ++--
integration-tests/go.mod | 8 +-
integration-tests/go.sum | 16 ++--
.../testconfig/ocr2/example.toml | 96 +++++++++++++++++++
integration-tests/testconfig/ocr2/ocr2.go | 57 +++++++++++
integration-tests/testconfig/ocr2/ocr2.toml | 43 +++++++++
integration-tests/testconfig/testconfig.go | 6 ++
integration-tests/types/testconfigs.go | 6 ++
sonar-project.properties | 2 +-
17 files changed, 297 insertions(+), 38 deletions(-)
create mode 100644 integration-tests/testconfig/ocr2/example.toml
create mode 100644 integration-tests/testconfig/ocr2/ocr2.go
create mode 100644 integration-tests/testconfig/ocr2/ocr2.toml
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index d759a439907..0ca66905f68 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -1021,6 +1021,19 @@ 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
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index 32dfd6a5818..73307549f53 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -19,7 +19,7 @@ require (
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.20240205180946-df826cb540ce
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
@@ -246,11 +246,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-cosmos v0.4.1-0.20240206150430-fbccaa95af62 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1 // 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.20240207182351-414a66663857 // indirect
+ github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944 // 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
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index 86c6bc84e53..5c4ccc848d3 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -1169,18 +1169,18 @@ 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-common v0.1.7-0.20240205180946-df826cb540ce h1:+6MzHiHMPBddiR9tnkXA7pjgd2mNaboPck8cNsSfYrs=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240205180946-df826cb540ce/go.mod h1:05rRF84QKlIOF5LfTBPkHdw4UpBI2G3zxRcuZ65bPjk=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240206150430-fbccaa95af62 h1:DuSQLuq+Ilm3Q+2zn5agLrAi9UvFQmOUdKwZQKX0AFA=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240206150430-fbccaa95af62/go.mod h1:Ny6kBD8Houh5yZRmGiB0ovsLHdb4qOHHwBno9JZUT+Y=
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-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.20240207182351-414a66663857 h1:HTJykZVLsHFTNIZYR/QioAPdImmb3ftOmNZ5UXJFiYo=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240207182351-414a66663857/go.mod h1:NCy9FZ8xONgJ618kmJbks6wCN0nALodUmhZuvwY5hHs=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944 h1:1Cb/XqEs38SFpkBHHxdhYqS8RZR7qXGaXH9+lxtMGJo=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944/go.mod h1:pGnBsaraD3vPjnak8jbu9U+OWZrCVHzGMjA/5++E1PI=
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=
diff --git a/core/services/relay/evm/evm.go b/core/services/relay/evm/evm.go
index 34d353c48d4..596f53308b6 100644
--- a/core/services/relay/evm/evm.go
+++ b/core/services/relay/evm/evm.go
@@ -187,6 +187,10 @@ func (r *Relayer) NewMercuryProvider(rargs commontypes.RelayArgs, pargs commonty
return NewMercuryProvider(cw, 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) {
lggr := r.lggr.Named("FunctionsProvider").Named(rargs.ExternalJobID.String())
// TODO(FUN-668): Not ready yet (doesn't implement FunctionsEvents() properly)
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/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/web/testutils/mock_relayer.go b/core/web/testutils/mock_relayer.go
index d1972f52626..d6a44a2379d 100644
--- a/core/web/testutils/mock_relayer.go
+++ b/core/web/testutils/mock_relayer.go
@@ -51,3 +51,7 @@ func (m MockRelayer) NewConfigProvider(ctx context.Context, args commontypes.Rel
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/go.mod b/go.mod
index 6c0ea3281c0..c3c6aeb505b 100644
--- a/go.mod
+++ b/go.mod
@@ -66,12 +66,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-common v0.1.7-0.20240205180946-df826cb540ce
+ github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240206150430-fbccaa95af62
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1
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.20240207182351-414a66663857
+ github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944
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
diff --git a/go.sum b/go.sum
index c8f6620af85..35e1703f7ef 100644
--- a/go.sum
+++ b/go.sum
@@ -1164,18 +1164,18 @@ 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-common v0.1.7-0.20240205180946-df826cb540ce h1:+6MzHiHMPBddiR9tnkXA7pjgd2mNaboPck8cNsSfYrs=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240205180946-df826cb540ce/go.mod h1:05rRF84QKlIOF5LfTBPkHdw4UpBI2G3zxRcuZ65bPjk=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240206150430-fbccaa95af62 h1:DuSQLuq+Ilm3Q+2zn5agLrAi9UvFQmOUdKwZQKX0AFA=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240206150430-fbccaa95af62/go.mod h1:Ny6kBD8Houh5yZRmGiB0ovsLHdb4qOHHwBno9JZUT+Y=
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-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.20240207182351-414a66663857 h1:HTJykZVLsHFTNIZYR/QioAPdImmb3ftOmNZ5UXJFiYo=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240207182351-414a66663857/go.mod h1:NCy9FZ8xONgJ618kmJbks6wCN0nALodUmhZuvwY5hHs=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944 h1:1Cb/XqEs38SFpkBHHxdhYqS8RZR7qXGaXH9+lxtMGJo=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944/go.mod h1:pGnBsaraD3vPjnak8jbu9U+OWZrCVHzGMjA/5++E1PI=
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=
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index 36ce802621d..70b9e772e3b 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -24,7 +24,7 @@ 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.20240205180946-df826cb540ce
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
@@ -368,11 +368,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-cosmos v0.4.1-0.20240206150430-fbccaa95af62 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20231204152908-a6e3fe8ff2a1 // 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.20240207182351-414a66663857 // indirect
+ github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944 // 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
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index 3a7652dc967..82897ad46df 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -1502,18 +1502,18 @@ 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-common v0.1.7-0.20240205180946-df826cb540ce h1:+6MzHiHMPBddiR9tnkXA7pjgd2mNaboPck8cNsSfYrs=
+github.com/smartcontractkit/chainlink-common v0.1.7-0.20240205180946-df826cb540ce/go.mod h1:05rRF84QKlIOF5LfTBPkHdw4UpBI2G3zxRcuZ65bPjk=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240206150430-fbccaa95af62 h1:DuSQLuq+Ilm3Q+2zn5agLrAi9UvFQmOUdKwZQKX0AFA=
+github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240206150430-fbccaa95af62/go.mod h1:Ny6kBD8Houh5yZRmGiB0ovsLHdb4qOHHwBno9JZUT+Y=
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-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.20240207182351-414a66663857 h1:HTJykZVLsHFTNIZYR/QioAPdImmb3ftOmNZ5UXJFiYo=
+github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240207182351-414a66663857/go.mod h1:NCy9FZ8xONgJ618kmJbks6wCN0nALodUmhZuvwY5hHs=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944 h1:1Cb/XqEs38SFpkBHHxdhYqS8RZR7qXGaXH9+lxtMGJo=
+github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240206145519-35a4346b5944/go.mod h1:pGnBsaraD3vPjnak8jbu9U+OWZrCVHzGMjA/5++E1PI=
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=
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..0913e09b5da 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"`
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/sonar-project.properties b/sonar-project.properties
index 6ffaba8b19b..db2a6be1f3b 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -7,7 +7,7 @@ sonar.exclusions=**/node_modules/**/*,**/mocks/**/*, **/testdata/**/*, **/contra
# 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.cpd.exclusions=**/contracts/**/*.sol, **/config.go, /core/services/ocr2/plugins/ocr2keeper/evm*/*,**/integration-tests/testconfig/**/*
# Tests' root folder, inclusions (tests to check and count) and exclusions
sonar.tests=.