From 5c245ebb29058fa440ce168378a59639632d65bc Mon Sep 17 00:00:00 2001
From: chainchad <96362174+chainchad@users.noreply.github.com>
Date: Wed, 24 Jul 2024 12:24:42 -0400
Subject: [PATCH 01/28] Bump libocr to fix nil msg error (#13919)
---
core/scripts/go.mod | 2 +-
core/scripts/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
integration-tests/go.mod | 2 +-
integration-tests/go.sum | 4 ++--
integration-tests/load/go.mod | 2 +-
integration-tests/load/go.sum | 4 ++--
8 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index 723063c4b5..1eee65e859 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -27,7 +27,7 @@ require (
github.com/smartcontractkit/chainlink-common v0.1.7-0.20240702120320-563bf07487fe
github.com/smartcontractkit/chainlink-vrf v0.0.0-20240222010609-cd67d123c772
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
- github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e
+ github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
github.com/spf13/cobra v1.8.0
github.com/spf13/viper v1.15.0
github.com/stretchr/testify v1.9.0
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index aa1780090f..d38f8f9adf 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -1231,8 +1231,8 @@ github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16 h1:TFe+
github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0=
-github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e h1:9ypZ/8aW8Vm497i1gXHcT96oNLiu88jbg9QdX+IUE3E=
-github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 h1:e38V5FYE7DA1JfKXeD5Buo/7lczALuVXlJ8YNTAUxcw=
+github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 h1:yiKnypAqP8l0OX0P3klzZ7SCcBUxy5KqTAKZmQOvSQE=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1/go.mod h1:q6f4fe39oZPdsh1i57WznEZgxd8siidMaSFq3wdPmVg=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1 h1:Dai1bn+Q5cpeGMQwRdjOdVjG8mmFFROVkSKuUgBErRQ=
diff --git a/go.mod b/go.mod
index db79820dfd..59e47518bb 100644
--- a/go.mod
+++ b/go.mod
@@ -79,7 +79,7 @@ require (
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240701154249-032706dcb7c8
github.com/smartcontractkit/chainlink-starknet/relayer v0.0.1-beta-test.0.20240625074951-06ab5e670dba
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868
- github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e
+ github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1
github.com/smartcontractkit/wsrpc v0.7.3
diff --git a/go.sum b/go.sum
index c142992a74..f947f5f596 100644
--- a/go.sum
+++ b/go.sum
@@ -1188,8 +1188,8 @@ github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16 h1:TFe+
github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0=
-github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e h1:9ypZ/8aW8Vm497i1gXHcT96oNLiu88jbg9QdX+IUE3E=
-github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 h1:e38V5FYE7DA1JfKXeD5Buo/7lczALuVXlJ8YNTAUxcw=
+github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 h1:yiKnypAqP8l0OX0P3klzZ7SCcBUxy5KqTAKZmQOvSQE=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1/go.mod h1:q6f4fe39oZPdsh1i57WznEZgxd8siidMaSFq3wdPmVg=
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1 h1:Dai1bn+Q5cpeGMQwRdjOdVjG8mmFFROVkSKuUgBErRQ=
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index 82b832ed4d..a3778c2c04 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -34,7 +34,7 @@ require (
github.com/smartcontractkit/chainlink-vrf v0.0.0-20231120191722-fef03814f868
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37
- github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e
+ github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
github.com/smartcontractkit/seth v1.0.12
github.com/smartcontractkit/wasp v0.4.7
github.com/spf13/cobra v1.8.0
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index fa10b57305..5c2e0ffe29 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -1538,8 +1538,8 @@ github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJ
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0=
github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37 h1:ZEhn2Yo1jY4hqy8nasDL4k4pNtopT3rS3Ap1GDb7ODc=
github.com/smartcontractkit/havoc/k8schaos v0.0.0-20240409145249-e78d20847e37/go.mod h1:/kFr0D7SI/vueXl1N03uzOun4nViGPFRyA5X6eL3jXw=
-github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e h1:9ypZ/8aW8Vm497i1gXHcT96oNLiu88jbg9QdX+IUE3E=
-github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 h1:e38V5FYE7DA1JfKXeD5Buo/7lczALuVXlJ8YNTAUxcw=
+github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/seth v1.0.12 h1:iVdgMx42XWanPPnBaM5StR4c1XsTr/0/B/kKRZL5BsY=
github.com/smartcontractkit/seth v1.0.12/go.mod h1:thWtbLyW4nRHJGzC5heknQDORoJPErE15sF34LHkorg=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 h1:yiKnypAqP8l0OX0P3klzZ7SCcBUxy5KqTAKZmQOvSQE=
diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod
index 4f79098242..09c048b73f 100644
--- a/integration-tests/load/go.mod
+++ b/integration-tests/load/go.mod
@@ -20,7 +20,7 @@ require (
github.com/smartcontractkit/chainlink-testing-framework v1.31.7
github.com/smartcontractkit/chainlink/integration-tests v0.0.0-20240214231432-4ad5eb95178c
github.com/smartcontractkit/chainlink/v2 v2.9.0-beta0.0.20240216210048-da02459ddad8
- github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e
+ github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7
github.com/smartcontractkit/seth v1.0.12
github.com/smartcontractkit/tdh2/go/tdh2 v0.0.0-20230906073235-9e478e5e19f1
github.com/smartcontractkit/wasp v0.4.7
diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum
index 81b2b64be2..6901045716 100644
--- a/integration-tests/load/go.sum
+++ b/integration-tests/load/go.sum
@@ -1526,8 +1526,8 @@ github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16 h1:TFe+
github.com/smartcontractkit/go-plugin v0.0.0-20240208201424-b3b91517de16/go.mod h1:lBS5MtSSBZk0SHc66KACcjjlU6WzEVP/8pwz68aMkCI=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f h1:hgJif132UCdjo8u43i7iPN1/MFnu49hv7lFGFftCHKU=
github.com/smartcontractkit/grpc-proxy v0.0.0-20230731113816-f1be6620749f/go.mod h1:MvMXoufZAtqExNexqi4cjrNYE9MefKddKylxjS+//n0=
-github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e h1:9ypZ/8aW8Vm497i1gXHcT96oNLiu88jbg9QdX+IUE3E=
-github.com/smartcontractkit/libocr v0.0.0-20240702141926-063ceef8c42e/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
+github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7 h1:e38V5FYE7DA1JfKXeD5Buo/7lczALuVXlJ8YNTAUxcw=
+github.com/smartcontractkit/libocr v0.0.0-20240717100443-f6226e09bee7/go.mod h1:fb1ZDVXACvu4frX3APHZaEBp0xi1DIm34DcA0CwTsZM=
github.com/smartcontractkit/seth v1.0.12 h1:iVdgMx42XWanPPnBaM5StR4c1XsTr/0/B/kKRZL5BsY=
github.com/smartcontractkit/seth v1.0.12/go.mod h1:thWtbLyW4nRHJGzC5heknQDORoJPErE15sF34LHkorg=
github.com/smartcontractkit/tdh2/go/ocr2/decryptionplugin v0.0.0-20230906073235-9e478e5e19f1 h1:yiKnypAqP8l0OX0P3klzZ7SCcBUxy5KqTAKZmQOvSQE=
From 64d9abed9110cdce0cc95815b8ac10b6d5f693da Mon Sep 17 00:00:00 2001
From: Finley Decker
Date: Fri, 26 Jul 2024 12:32:57 +0200
Subject: [PATCH 02/28] added astar config
---
.../chains/evm/config/toml/defaults/Astar_Mainnet.toml | 10 ++++++++++
.../chains/evm/config/toml/defaults/Astar_Shibuya.toml | 10 ++++++++++
2 files changed, 20 insertions(+)
create mode 100644 core/chains/evm/config/toml/defaults/Astar_Mainnet.toml
create mode 100644 core/chains/evm/config/toml/defaults/Astar_Shibuya.toml
diff --git a/core/chains/evm/config/toml/defaults/Astar_Mainnet.toml b/core/chains/evm/config/toml/defaults/Astar_Mainnet.toml
new file mode 100644
index 0000000000..2d356d9564
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/Astar_Mainnet.toml
@@ -0,0 +1,10 @@
+ChainID = '592'
+# FinalityTag will be enabled once the custom tag is implemented
+# FinalityTagEnabled = true
+FinalityDepth = 100
+LogPollInterval = '6s'
+
+[GasEstimator]
+EIP1559DynamicFees = false
+PriceMax = '100000 gwei'
+LimitDefault = 8000000
\ No newline at end of file
diff --git a/core/chains/evm/config/toml/defaults/Astar_Shibuya.toml b/core/chains/evm/config/toml/defaults/Astar_Shibuya.toml
new file mode 100644
index 0000000000..36f42b7f02
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/Astar_Shibuya.toml
@@ -0,0 +1,10 @@
+ChainID = '81'
+# FinalityTag will be enabled once the custom tag is implemented
+# FinalityTagEnabled = true
+FinalityDepth = 100
+LogPollInterval = '6s'
+
+[GasEstimator]
+EIP1559DynamicFees = false
+PriceMax = '100000 gwei'
+LimitDefault = 8000000
\ No newline at end of file
From 5f21e99e052e1ea785ea8f397539990ad6825ee2 Mon Sep 17 00:00:00 2001
From: Finley Decker
Date: Fri, 26 Jul 2024 12:36:42 +0200
Subject: [PATCH 03/28] updated docs
---
docs/CONFIG.md | 184 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 184 insertions(+)
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 4d8d6f6cf1..5a27de9e6e 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -2795,6 +2795,98 @@ GasLimit = 5400000
+Mode Sepolia (919)
```toml
From 777b69b6ea9cd99b35744836c2678fd1c49511e2 Mon Sep 17 00:00:00 2001
From: chainchad <96362174+chainchad@users.noreply.github.com>
Date: Mon, 29 Jul 2024 09:19:19 -0400
Subject: [PATCH 04/28] Finalize date on changelog for 2.14.0 (#13943)
---
CHANGELOG.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f212445503..d25c84b322 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
# Changelog Chainlink Core
-## 2.14.0 - UNRELEASED
+## 2.14.0 - 2024-07-29
### Minor Changes
From 451984ad0469c7d685e305dba0a0d94eb0c9a053 Mon Sep 17 00:00:00 2001
From: nogo <110664798+0xnogo@users.noreply.github.com>
Date: Tue, 30 Jul 2024 18:18:58 +0200
Subject: [PATCH 05/28] Zk Overflow in Execution Plugin (#947)
Changes to make the execution plugin overflow-compatible
---
.mockery.yaml | 3 +
core/services/ocr2/delegate.go | 10 +-
.../ocr2/plugins/ccip/ccipexec/batching.go | 345 +++++++
.../plugins/ccip/ccipexec/batching_test.go | 844 ++++++++++++++++++
.../ocr2/plugins/ccip/ccipexec/factory.go | 6 +
.../plugins/ccip/ccipexec/initializers.go | 2 +
.../ocr2/plugins/ccip/ccipexec/ocr2.go | 223 +----
.../ocr2/plugins/ccip/ccipexec/ocr2_test.go | 450 +---------
.../ccip/internal/ccipdata/v1_0_0/offramp.go | 3 +
.../internal/ccipdata/v1_0_0/offramp_test.go | 7 +-
.../ccip/internal/ccipdata/v1_2_0/offramp.go | 3 +
.../internal/ccipdata/v1_2_0/offramp_test.go | 45 +-
.../ccip/internal/ccipdata/v1_5_0/offramp.go | 1 +
.../plugins/ccip/transmitter/transmitter.go | 143 +++
.../ccip/transmitter/transmitter_test.go | 282 ++++++
core/services/relay/evm/evm.go | 12 +
.../mocks/ccip_transaction_status_checker.go | 104 +++
.../evm/statuschecker/txm_status_checker.go | 54 ++
.../statuschecker/txm_status_checker_test.go | 103 +++
19 files changed, 1990 insertions(+), 650 deletions(-)
create mode 100644 core/services/ocr2/plugins/ccip/transmitter/transmitter.go
create mode 100644 core/services/ocr2/plugins/ccip/transmitter/transmitter_test.go
create mode 100644 core/services/relay/evm/statuschecker/mocks/ccip_transaction_status_checker.go
create mode 100644 core/services/relay/evm/statuschecker/txm_status_checker.go
create mode 100644 core/services/relay/evm/statuschecker/txm_status_checker_test.go
diff --git a/.mockery.yaml b/.mockery.yaml
index 529a3f22ad..d458eef5d5 100644
--- a/.mockery.yaml
+++ b/.mockery.yaml
@@ -511,6 +511,9 @@ packages:
PriceGetter:
config:
mockname: "Mock{{ .InterfaceName }}"
+ github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/statuschecker:
+ interfaces:
+ CCIPTransactionStatusChecker:
github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/rpclib:
config:
outpkg: rpclibmocks
diff --git a/core/services/ocr2/delegate.go b/core/services/ocr2/delegate.go
index 5246780e04..92d6cc65bc 100644
--- a/core/services/ocr2/delegate.go
+++ b/core/services/ocr2/delegate.go
@@ -330,15 +330,15 @@ func (d *Delegate) cleanupEVM(ctx context.Context, jb job.Job, relayID types.Rel
dstProvider, err2 := d.ccipCommitGetDstProvider(ctx, jb, pluginJobSpecConfig, transmitterID)
if err2 != nil {
- return err2
+ return err
}
srcProvider, _, err2 := d.ccipCommitGetSrcProvider(ctx, jb, pluginJobSpecConfig, transmitterID, dstProvider)
if err2 != nil {
- return err2
+ return err
}
err2 = ccipcommit.UnregisterCommitPluginLpFilters(srcProvider, dstProvider)
- if err != nil {
+ if err2 != nil {
d.lggr.Errorw("failed to unregister ccip commit plugin filters", "err", err2, "spec", spec)
}
return nil
@@ -353,12 +353,12 @@ func (d *Delegate) cleanupEVM(ctx context.Context, jb job.Job, relayID types.Rel
dstProvider, err2 := d.ccipExecGetDstProvider(ctx, jb, pluginJobSpecConfig, transmitterID)
if err2 != nil {
- return err2
+ return err
}
srcProvider, _, err2 := d.ccipExecGetSrcProvider(ctx, jb, pluginJobSpecConfig, transmitterID, dstProvider)
if err2 != nil {
- return err2
+ return err
}
err2 = ccipexec.UnregisterExecPluginLpFilters(srcProvider, dstProvider)
if err2 != nil {
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/batching.go b/core/services/ocr2/plugins/ccip/ccipexec/batching.go
index e3e7ae3253..b457dd986d 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/batching.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/batching.go
@@ -3,19 +3,303 @@ package ccipexec
import (
"context"
"fmt"
+ "math/big"
+ "time"
+ mapset "github.com/deckarep/golang-set/v2"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/pkg/errors"
"github.com/smartcontractkit/chainlink-common/pkg/hashutil"
"github.com/smartcontractkit/chainlink-common/pkg/merklemulti"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/prices"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/tokendata"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/statuschecker"
)
+type BatchContext struct {
+ report commitReportWithSendRequests
+ inflight []InflightInternalExecutionReport
+ inflightAggregateValue *big.Int
+ lggr logger.Logger
+ availableDataLen int
+ availableGas uint64
+ expectedNonces map[cciptypes.Address]uint64
+ sendersNonce map[cciptypes.Address]uint64
+ sourceTokenPricesUSD map[cciptypes.Address]*big.Int
+ destTokenPricesUSD map[cciptypes.Address]*big.Int
+ gasPrice *big.Int
+ sourceToDestToken map[cciptypes.Address]cciptypes.Address
+ aggregateTokenLimit *big.Int
+ tokenDataRemainingDuration time.Duration
+ tokenDataWorker tokendata.Worker
+ gasPriceEstimator prices.GasPriceEstimatorExec
+ destWrappedNative cciptypes.Address
+ offchainConfig cciptypes.ExecOffchainConfig
+}
+
+type BatchingStrategy interface {
+ BuildBatch(ctx context.Context, batchCtx *BatchContext) ([]ccip.ObservedMessage, []messageExecStatus)
+}
+
+type BestEffortBatchingStrategy struct{}
+
+type ZKOverflowBatchingStrategy struct {
+ statuschecker statuschecker.CCIPTransactionStatusChecker
+}
+
+func NewBatchingStrategy(batchingStrategyID uint32, statusChecker statuschecker.CCIPTransactionStatusChecker) (BatchingStrategy, error) {
+ var batchingStrategy BatchingStrategy
+ switch batchingStrategyID {
+ case 0:
+ batchingStrategy = &BestEffortBatchingStrategy{}
+ case 1:
+ batchingStrategy = &ZKOverflowBatchingStrategy{
+ statuschecker: statusChecker,
+ }
+ default:
+ return nil, errors.Errorf("unknown batching strategy ID %d", batchingStrategyID)
+ }
+ return batchingStrategy, nil
+}
+
+// BestEffortBatchingStrategy is a batching strategy that tries to batch as many messages as possible (up to certain limits).
+func (s *BestEffortBatchingStrategy) BuildBatch(
+ ctx context.Context,
+ batchCtx *BatchContext,
+) ([]ccip.ObservedMessage, []messageExecStatus) {
+ batchBuilder := newBatchBuildContainer(len(batchCtx.report.sendRequestsWithMeta))
+ for _, msg := range batchCtx.report.sendRequestsWithMeta {
+ msgLggr := batchCtx.lggr.With("messageID", hexutil.Encode(msg.MessageID[:]), "seqNr", msg.SequenceNumber)
+ status, messageMaxGas, tokenData, msgValue, err := performCommonChecks(ctx, batchCtx, msg, msgLggr)
+
+ if err != nil {
+ return []ccip.ObservedMessage{}, []messageExecStatus{}
+ }
+
+ if status.shouldBeSkipped() {
+ batchBuilder.skip(msg, status)
+ continue
+ }
+
+ updateBatchContext(batchCtx, msg, messageMaxGas, msgValue, msgLggr)
+ batchBuilder.addToBatch(msg, tokenData)
+ }
+ return batchBuilder.batch, batchBuilder.statuses
+}
+
+// ZKOverflowBatchingStrategy is a batching strategy for ZK chains overflowing under certain conditions.
+// It is a simple batching strategy that only allows one message to be added to the batch.
+// TXM is used to perform the ZK check: if the message failed the check, it will be skipped.
+func (bs ZKOverflowBatchingStrategy) BuildBatch(
+ ctx context.Context,
+ batchCtx *BatchContext,
+) ([]ccip.ObservedMessage, []messageExecStatus) {
+ batchBuilder := newBatchBuildContainer(len(batchCtx.report.sendRequestsWithMeta))
+ inflightSeqNums := getInflightSeqNums(batchCtx.inflight)
+
+ for _, msg := range batchCtx.report.sendRequestsWithMeta {
+ msgId := hexutil.Encode(msg.MessageID[:])
+ msgLggr := batchCtx.lggr.With("messageID", msgId, "seqNr", msg.SequenceNumber)
+
+ // Check if msg is inflight
+ if exists := inflightSeqNums.Contains(msg.SequenceNumber); exists {
+ // Message is inflight, skip it
+ msgLggr.Infow("Skipping message - already inflight", "message", msgId)
+ batchBuilder.skip(msg, SkippedInflight)
+ continue
+ }
+ // Message is not inflight, continue with checks
+ // Check if the messsage is overflown using TXM
+ statuses, count, err := bs.statuschecker.CheckMessageStatus(ctx, msgId)
+ if err != nil {
+ batchBuilder.skip(msg, TXMCheckError)
+ continue
+ }
+
+ msgLggr.Infow("TXM check result", "statuses", statuses, "count", count)
+
+ if len(statuses) == 0 {
+ // No status found for message = first time we see it
+ msgLggr.Infow("No status found for message - proceeding with checks", "message", msgId)
+ } else {
+ // Status(es) found for message = check if any of them is final to decide if we should add it to the batch
+ hasFatalStatus := false
+ for _, s := range statuses {
+ if s == types.Fatal {
+ msgLggr.Infow("Skipping message - found a fatal TXM status", "message", msgId)
+ batchBuilder.skip(msg, TXMFatalStatus)
+ hasFatalStatus = true
+ break
+ }
+ }
+ if hasFatalStatus {
+ continue
+ }
+ msgLggr.Infow("No fatal status found for message - proceeding with checks", "message", msgId)
+ }
+
+ status, messageMaxGas, tokenData, msgValue, err := performCommonChecks(ctx, batchCtx, msg, msgLggr)
+
+ if err != nil {
+ return []ccip.ObservedMessage{}, []messageExecStatus{}
+ }
+
+ if status.shouldBeSkipped() {
+ batchBuilder.skip(msg, status)
+ continue
+ }
+
+ updateBatchContext(batchCtx, msg, messageMaxGas, msgValue, msgLggr)
+ msgLggr.Infow("Adding message to batch", "message", msgId)
+ batchBuilder.addToBatch(msg, tokenData)
+
+ // Batch size is limited to 1 for ZK Overflow chains
+ break
+ }
+ return batchBuilder.batch, batchBuilder.statuses
+}
+
+func performCommonChecks(
+ ctx context.Context,
+ batchCtx *BatchContext,
+ msg cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta,
+ msgLggr logger.Logger,
+) (messageStatus, uint64, [][]byte, *big.Int, error) {
+ if msg.Executed {
+ msgLggr.Infow("Skipping message - already executed")
+ return AlreadyExecuted, 0, nil, nil, nil
+ }
+
+ if len(msg.Data) > batchCtx.availableDataLen {
+ msgLggr.Infow("Skipping message - insufficient remaining batch data length", "msgDataLen", len(msg.Data), "availableBatchDataLen", batchCtx.availableDataLen)
+ return InsufficientRemainingBatchDataLength, 0, nil, nil, nil
+ }
+
+ messageMaxGas, err1 := calculateMessageMaxGas(
+ msg.GasLimit,
+ len(batchCtx.report.sendRequestsWithMeta),
+ len(msg.Data),
+ len(msg.TokenAmounts),
+ )
+ if err1 != nil {
+ msgLggr.Errorw("Skipping message - message max gas calculation error", "err", err1)
+ return MessageMaxGasCalcError, 0, nil, nil, nil
+ }
+
+ // Check sufficient gas in batch
+ if batchCtx.availableGas < messageMaxGas {
+ msgLggr.Infow("Skipping message - insufficient remaining batch gas limit", "availableGas", batchCtx.availableGas, "messageMaxGas", messageMaxGas)
+ return InsufficientRemainingBatchGas, 0, nil, nil, nil
+ }
+
+ if _, ok := batchCtx.expectedNonces[msg.Sender]; !ok {
+ nonce, ok1 := batchCtx.sendersNonce[msg.Sender]
+ if !ok1 {
+ msgLggr.Errorw("Skipping message - missing nonce", "sender", msg.Sender)
+ return MissingNonce, 0, nil, nil, nil
+ }
+ batchCtx.expectedNonces[msg.Sender] = nonce + 1
+ }
+
+ // Check expected nonce is valid for sequenced messages.
+ // Sequenced messages have non-zero nonces.
+ if msg.Nonce > 0 && msg.Nonce != batchCtx.expectedNonces[msg.Sender] {
+ msgLggr.Warnw("Skipping message - invalid nonce", "have", msg.Nonce, "want", batchCtx.expectedNonces[msg.Sender])
+ return InvalidNonce, 0, nil, nil, nil
+ }
+
+ msgValue, err1 := aggregateTokenValue(batchCtx.lggr, batchCtx.destTokenPricesUSD, batchCtx.sourceToDestToken, msg.TokenAmounts)
+ if err1 != nil {
+ msgLggr.Errorw("Skipping message - aggregate token value compute error", "err", err1)
+ return AggregateTokenValueComputeError, 0, nil, nil, nil
+ }
+
+ // if token limit is smaller than message value skip message
+ if tokensLeft, hasCapacity := hasEnoughTokens(batchCtx.aggregateTokenLimit, msgValue, batchCtx.inflightAggregateValue); !hasCapacity {
+ msgLggr.Warnw("Skipping message - aggregate token limit exceeded", "aggregateTokenLimit", tokensLeft.String(), "msgValue", msgValue.String())
+ return AggregateTokenLimitExceeded, 0, nil, nil, nil
+ }
+
+ tokenData, elapsed, err1 := getTokenDataWithTimeout(ctx, msg, batchCtx.tokenDataRemainingDuration, batchCtx.tokenDataWorker)
+ batchCtx.tokenDataRemainingDuration -= elapsed
+ if err1 != nil {
+ if errors.Is(err1, tokendata.ErrNotReady) {
+ msgLggr.Warnw("Skipping message - token data not ready", "err", err1)
+ return TokenDataNotReady, 0, nil, nil, nil
+ }
+ msgLggr.Errorw("Skipping message - token data fetch error", "err", err1)
+ return TokenDataFetchError, 0, nil, nil, nil
+ }
+
+ dstWrappedNativePrice, exists := batchCtx.destTokenPricesUSD[batchCtx.destWrappedNative]
+ if !exists {
+ msgLggr.Errorw("Skipping message - token not in destination token prices", "token", batchCtx.destWrappedNative)
+ return TokenNotInDestTokenPrices, 0, nil, nil, nil
+ }
+
+ // calculating the source chain fee, dividing by 1e18 for denomination.
+ // For example:
+ // FeeToken=link; FeeTokenAmount=1e17 i.e. 0.1 link, price is 6e18 USD/link (1 USD = 1e18),
+ // availableFee is 1e17*6e18/1e18 = 6e17 = 0.6 USD
+ sourceFeeTokenPrice, exists := batchCtx.sourceTokenPricesUSD[msg.FeeToken]
+ if !exists {
+ msgLggr.Errorw("Skipping message - token not in source token prices", "token", msg.FeeToken)
+ return TokenNotInSrcTokenPrices, 0, nil, nil, nil
+ }
+
+ // Fee boosting
+ execCostUsd, err1 := batchCtx.gasPriceEstimator.EstimateMsgCostUSD(batchCtx.gasPrice, dstWrappedNativePrice, msg)
+ if err1 != nil {
+ msgLggr.Errorw("Failed to estimate message cost USD", "err", err1)
+ return "", 0, nil, nil, errors.New("failed to estimate message cost USD")
+ }
+
+ availableFee := big.NewInt(0).Mul(msg.FeeTokenAmount, sourceFeeTokenPrice)
+ availableFee = availableFee.Div(availableFee, big.NewInt(1e18))
+ availableFeeUsd := waitBoostedFee(time.Since(msg.BlockTimestamp), availableFee, batchCtx.offchainConfig.RelativeBoostPerWaitHour)
+ if availableFeeUsd.Cmp(execCostUsd) < 0 {
+ msgLggr.Infow(
+ "Skipping message - insufficient remaining fee",
+ "availableFeeUsd", availableFeeUsd,
+ "execCostUsd", execCostUsd,
+ "sourceBlockTimestamp", msg.BlockTimestamp,
+ "waitTime", time.Since(msg.BlockTimestamp),
+ "boost", batchCtx.offchainConfig.RelativeBoostPerWaitHour,
+ )
+ return InsufficientRemainingFee, 0, nil, nil, nil
+ }
+
+ return SuccesfullyValidated, messageMaxGas, tokenData, msgValue, nil
+}
+
+// getTokenDataWithCappedLatency gets the token data for the provided message.
+// Stops and returns an error if more than allowedWaitingTime is passed.
+func getTokenDataWithTimeout(
+ ctx context.Context,
+ msg cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta,
+ timeout time.Duration,
+ tokenDataWorker tokendata.Worker,
+) ([][]byte, time.Duration, error) {
+ if len(msg.TokenAmounts) == 0 {
+ return nil, 0, nil
+ }
+
+ ctxTimeout, cf := context.WithTimeout(ctx, timeout)
+ defer cf()
+ tStart := time.Now()
+ tokenData, err := tokenDataWorker.GetMsgTokenData(ctxTimeout, msg)
+ tDur := time.Since(tStart)
+ return tokenData, tDur, err
+}
+
func getProofData(
ctx context.Context,
sourceReader ccipdata.OnRampReader,
@@ -67,6 +351,59 @@ func validateSendRequests(sendReqs []cciptypes.EVM2EVMMessageWithTxMeta, interva
return nil
}
+func getInflightSeqNums(inflight []InflightInternalExecutionReport) mapset.Set[uint64] {
+ seqNums := mapset.NewSet[uint64]()
+ for _, report := range inflight {
+ for _, msg := range report.messages {
+ seqNums.Add(msg.SequenceNumber)
+ }
+ }
+ return seqNums
+}
+
+func aggregateTokenValue(lggr logger.Logger, destTokenPricesUSD map[cciptypes.Address]*big.Int, sourceToDest map[cciptypes.Address]cciptypes.Address, tokensAndAmount []cciptypes.TokenAmount) (*big.Int, error) {
+ sum := big.NewInt(0)
+ for i := 0; i < len(tokensAndAmount); i++ {
+ price, ok := destTokenPricesUSD[sourceToDest[tokensAndAmount[i].Token]]
+ if !ok {
+ // If we don't have a price for the token, we will assume it's worth 0.
+ lggr.Infof("No price for token %s, assuming 0", tokensAndAmount[i].Token)
+ continue
+ }
+ sum.Add(sum, new(big.Int).Quo(new(big.Int).Mul(price, tokensAndAmount[i].Amount), big.NewInt(1e18)))
+ }
+ return sum, nil
+}
+
+func updateBatchContext(
+ batchCtx *BatchContext,
+ msg cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta,
+ messageMaxGas uint64,
+ msgValue *big.Int,
+ msgLggr logger.Logger) {
+ batchCtx.availableGas -= messageMaxGas
+ batchCtx.availableDataLen -= len(msg.Data)
+ batchCtx.aggregateTokenLimit.Sub(batchCtx.aggregateTokenLimit, msgValue)
+ if msg.Nonce > 0 {
+ batchCtx.expectedNonces[msg.Sender] = msg.Nonce + 1
+ }
+
+ msgLggr.Infow(
+ "Message successfully added to execution batch",
+ "nonce", msg.Nonce,
+ "sender", msg.Sender,
+ "value", msgValue,
+ "availableAggrTokenLimit", batchCtx.aggregateTokenLimit,
+ "availableGas", batchCtx.availableGas,
+ "availableDataLen", batchCtx.availableDataLen,
+ )
+}
+
+func hasEnoughTokens(tokenLimit *big.Int, msgValue *big.Int, inflightValue *big.Int) (*big.Int, bool) {
+ tokensLeft := big.NewInt(0).Sub(tokenLimit, inflightValue)
+ return tokensLeft, tokensLeft.Cmp(msgValue) >= 0
+}
+
func buildExecutionReportForMessages(
msgsInRoot []cciptypes.EVM2EVMMessageWithTxMeta,
tree *merklemulti.Tree[[32]byte],
@@ -138,6 +475,7 @@ func getCommitReportForSeqNum(ctx context.Context, commitStoreReader ccipdata.Co
type messageStatus string
const (
+ SuccesfullyValidated messageStatus = "successfully_validated"
AlreadyExecuted messageStatus = "already_executed"
SenderAlreadySkipped messageStatus = "sender_already_skipped"
MessageMaxGasCalcError messageStatus = "message_max_gas_calc_error"
@@ -153,8 +491,15 @@ const (
TokenNotInSrcTokenPrices messageStatus = "token_not_in_src_token_prices"
InsufficientRemainingFee messageStatus = "insufficient_remaining_fee"
AddedToBatch messageStatus = "added_to_batch"
+ TXMCheckError messageStatus = "txm_check_error"
+ TXMFatalStatus messageStatus = "txm_fatal_status"
+ SkippedInflight messageStatus = "skipped_inflight"
)
+func (m messageStatus) shouldBeSkipped() bool {
+ return m != SuccesfullyValidated
+}
+
type messageExecStatus struct {
SeqNr uint64
MessageId string
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/batching_test.go b/core/services/ocr2/plugins/ccip/ccipexec/batching_test.go
index dc3594c820..3647556a6d 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/batching_test.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/batching_test.go
@@ -1,13 +1,62 @@
package ccipexec
import (
+ "bytes"
+ "context"
+ "encoding/binary"
+ "math"
+ "math/big"
+ "reflect"
"testing"
+ "time"
+ "github.com/pkg/errors"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/mock"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/prices"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/tokendata"
+ mockstatuschecker "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/statuschecker/mocks"
)
+type testCase struct {
+ name string
+ reqs []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta
+ inflight []InflightInternalExecutionReport
+ tokenLimit, destGasPrice, inflightAggregateValue *big.Int
+ srcPrices, dstPrices map[cciptypes.Address]*big.Int
+ offRampNoncesBySender map[cciptypes.Address]uint64
+ srcToDestTokens map[cciptypes.Address]cciptypes.Address
+ expectedSeqNrs []ccip.ObservedMessage
+ expectedStates []messageExecStatus
+ statuschecker func(m *mockstatuschecker.CCIPTransactionStatusChecker)
+ skipGasPriceEstimator bool
+}
+
+func Test_NewBatchingStrategy(t *testing.T) {
+ t.Parallel()
+
+ mockStatusChecker := mockstatuschecker.NewCCIPTransactionStatusChecker(t)
+
+ testCases := []int{0, 1, 2}
+
+ for _, batchingStrategyId := range testCases {
+ factory, err := NewBatchingStrategy(uint32(batchingStrategyId), mockStatusChecker)
+ if batchingStrategyId == 2 {
+ assert.Error(t, err)
+ } else {
+ assert.NotNil(t, factory)
+ assert.NoError(t, err)
+ }
+ }
+}
+
func Test_validateSendRequests(t *testing.T) {
testCases := []struct {
name string
@@ -64,3 +113,798 @@ func Test_validateSendRequests(t *testing.T) {
})
}
}
+
+type delayedTokenDataWorker struct {
+ delay time.Duration
+ tokendata.Worker
+}
+
+func (m delayedTokenDataWorker) GetMsgTokenData(ctx context.Context, msg cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta) ([][]byte, error) {
+ time.Sleep(m.delay)
+ return nil, ctx.Err()
+}
+
+func TestExecutionReportingPlugin_getTokenDataWithCappedLatency(t *testing.T) {
+ testCases := []struct {
+ name string
+ allowedWaitingTime time.Duration
+ workerLatency time.Duration
+ expErr bool
+ }{
+ {
+ name: "happy flow",
+ allowedWaitingTime: 10 * time.Millisecond,
+ workerLatency: time.Nanosecond,
+ expErr: false,
+ },
+ {
+ name: "worker takes long to reply",
+ allowedWaitingTime: 10 * time.Millisecond,
+ workerLatency: 20 * time.Millisecond,
+ expErr: true,
+ },
+ }
+
+ ctx := testutils.Context(t)
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ tokenDataWorker := delayedTokenDataWorker{delay: tc.workerLatency}
+
+ msg := cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{TokenAmounts: make([]cciptypes.TokenAmount, 1)},
+ }
+
+ _, _, err := getTokenDataWithTimeout(ctx, msg, tc.allowedWaitingTime, tokenDataWorker)
+ if tc.expErr {
+ assert.Error(t, err)
+ return
+ }
+ assert.NoError(t, err)
+ })
+ }
+}
+
+func TestBatchingStrategies(t *testing.T) {
+ sender1 := ccipcalc.HexToAddress("0xa")
+ destNative := ccipcalc.HexToAddress("0xb")
+ srcNative := ccipcalc.HexToAddress("0xc")
+
+ msg1 := createTestMessage(1, sender1, 1, srcNative, big.NewInt(1e9), false, nil)
+
+ msg2 := msg1
+ msg2.Executed = true
+
+ msg3 := msg1
+ msg3.Executed = true
+ msg3.Finalized = true
+
+ msg4 := msg1
+ msg4.TokenAmounts = []cciptypes.TokenAmount{
+ {Token: srcNative, Amount: big.NewInt(100)},
+ }
+
+ msg5 := msg4
+ msg5.SequenceNumber = msg5.SequenceNumber + 1
+ msg5.Nonce = msg5.Nonce + 1
+
+ zkMsg1 := createTestMessage(1, sender1, 0, srcNative, big.NewInt(1e9), false, nil)
+ zkMsg2 := createTestMessage(2, sender1, 0, srcNative, big.NewInt(1e9), false, nil)
+ zkMsg3 := createTestMessage(3, sender1, 0, srcNative, big.NewInt(1e9), false, nil)
+ zkMsg4 := createTestMessage(4, sender1, 0, srcNative, big.NewInt(1e9), false, nil)
+
+ testCases := []testCase{
+ {
+ name: "single message no tokens",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(1)}},
+ expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, AddedToBatch)},
+ },
+ {
+ name: "gasPriceEstimator returns error",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ },
+ {
+ name: "executed non finalized messages should be skipped",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg2},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{newMessageExecState(msg2.SequenceNumber, msg2.MessageID, AlreadyExecuted)},
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "finalized executed log",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg3},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{newMessageExecState(msg3.SequenceNumber, msg3.MessageID, AlreadyExecuted)},
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "dst token price does not exist",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, TokenNotInDestTokenPrices)},
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "src token price does not exist",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, TokenNotInSrcTokenPrices)},
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "message with tokens is not executed if limit is reached",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg4},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(99),
+ destGasPrice: big.NewInt(1),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1e18)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1e18)},
+ srcToDestTokens: map[cciptypes.Address]cciptypes.Address{
+ srcNative: destNative,
+ },
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{newMessageExecState(msg4.SequenceNumber, msg4.MessageID, AggregateTokenLimitExceeded)},
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "message with tokens is not executed if limit is reached when inflight is full",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg5},
+ inflight: []InflightInternalExecutionReport{{createdAt: time.Now(), messages: []cciptypes.EVM2EVMMessage{msg4.EVM2EVMMessage}}},
+ inflightAggregateValue: big.NewInt(100),
+ tokenLimit: big.NewInt(50),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1e18)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1e18)},
+ srcToDestTokens: map[cciptypes.Address]cciptypes.Address{
+ srcNative: destNative,
+ },
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 1},
+ expectedStates: []messageExecStatus{newMessageExecState(msg5.SequenceNumber, msg5.MessageID, AggregateTokenLimitExceeded)},
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "skip when nonce doesn't match chain value",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 123},
+ expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, InvalidNonce)},
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "skip when nonce not found",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{},
+ expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, MissingNonce)},
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "unordered messages",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 10,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 0,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ },
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(10)}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(10, [32]byte{}, AddedToBatch),
+ },
+ },
+ {
+ name: "unordered messages not blocked by nonce",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 9,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 5,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 10,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 0,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ },
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 3},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(10)}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(9, [32]byte{}, InvalidNonce),
+ newMessageExecState(10, [32]byte{}, AddedToBatch),
+ },
+ },
+ }
+
+ bestEffortTestCases := []testCase{
+ {
+ name: "skip when batch gas limit is reached",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 10,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 1,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 11,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 2,
+ GasLimit: big.NewInt(math.MaxInt64),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 12,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 3,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ },
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(10)}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(10, [32]byte{}, AddedToBatch),
+ newMessageExecState(11, [32]byte{}, InsufficientRemainingBatchGas),
+ newMessageExecState(12, [32]byte{}, InvalidNonce),
+ },
+ },
+ {
+ name: "some messages skipped after hitting max batch data len",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 10,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 1,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 11,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 2,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, MaxDataLenPerBatch-500), // skipped from batch
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 12,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 3,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ },
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(10)}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(10, [32]byte{}, AddedToBatch),
+ newMessageExecState(11, [32]byte{}, InsufficientRemainingBatchDataLength),
+ newMessageExecState(12, [32]byte{}, InvalidNonce),
+ },
+ },
+ {
+ name: "unordered messages then ordered messages",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 9,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 0,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ {
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: 10,
+ FeeTokenAmount: big.NewInt(1e9),
+ Sender: sender1,
+ Nonce: 5,
+ GasLimit: big.NewInt(1),
+ Data: bytes.Repeat([]byte{'a'}, 1000),
+ FeeToken: srcNative,
+ MessageID: [32]byte{},
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ },
+ },
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 4},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(9)}, {SeqNr: uint64(10)}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(9, [32]byte{}, AddedToBatch),
+ newMessageExecState(10, [32]byte{}, AddedToBatch),
+ },
+ },
+ }
+
+ specificZkOverflowTestCases := []testCase{
+ {
+ name: "batch size is 1",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1, zkMsg2, zkMsg3},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: zkMsg1.SequenceNumber}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, AddedToBatch),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, mock.Anything).Return([]types.TransactionStatus{}, -1, nil)
+ },
+ },
+ {
+ name: "snooze fatal message and return empty batch",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, TXMFatalStatus),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg1.MessageID.String()).Return([]types.TransactionStatus{types.Fatal}, 0, nil)
+ },
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "snooze fatal message and add next message to batch",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1, zkMsg2},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: zkMsg2.SequenceNumber}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, TXMFatalStatus),
+ newMessageExecState(zkMsg2.SequenceNumber, zkMsg2.MessageID, AddedToBatch),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg1.MessageID.String()).Return([]types.TransactionStatus{types.Fatal}, 0, nil)
+ m.On("CheckMessageStatus", mock.Anything, zkMsg2.MessageID.String()).Return([]types.TransactionStatus{}, -1, nil)
+ },
+ },
+ {
+ name: "all messages are fatal and batch is empty",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1, zkMsg2},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, TXMFatalStatus),
+ newMessageExecState(zkMsg2.SequenceNumber, zkMsg2.MessageID, TXMFatalStatus),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg1.MessageID.String()).Return([]types.TransactionStatus{types.Fatal}, 0, nil)
+ m.On("CheckMessageStatus", mock.Anything, zkMsg2.MessageID.String()).Return([]types.TransactionStatus{types.Fatal}, 0, nil)
+ },
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "message batched when unconfirmed or failed",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1, zkMsg2},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: zkMsg1.SequenceNumber}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, AddedToBatch),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg1.MessageID.String()).Return([]types.TransactionStatus{types.Unconfirmed, types.Failed}, 1, nil)
+ },
+ },
+ {
+ name: "message snoozed when multiple statuses with fatal",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1, zkMsg2},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: zkMsg2.SequenceNumber}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, TXMFatalStatus),
+ newMessageExecState(zkMsg2.SequenceNumber, zkMsg2.MessageID, AddedToBatch),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg1.MessageID.String()).Return([]types.TransactionStatus{types.Unconfirmed, types.Failed, types.Fatal}, 2, nil)
+ m.On("CheckMessageStatus", mock.Anything, zkMsg2.MessageID.String()).Return([]types.TransactionStatus{}, -1, nil)
+ },
+ },
+ {
+ name: "txm return error for message",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1, zkMsg2},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: zkMsg2.SequenceNumber}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, TXMCheckError),
+ newMessageExecState(zkMsg2.SequenceNumber, zkMsg2.MessageID, AddedToBatch),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg1.MessageID.String()).Return([]types.TransactionStatus{}, -1, errors.New("dummy txm error"))
+ m.On("CheckMessageStatus", mock.Anything, zkMsg2.MessageID.String()).Return([]types.TransactionStatus{}, -1, nil)
+ },
+ },
+ {
+ name: "snooze message when inflight",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1},
+ inflight: createInflight(zkMsg1),
+ inflightAggregateValue: zkMsg1.FeeTokenAmount,
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, SkippedInflight),
+ },
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "snooze when not inflight but txm returns error",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, TXMCheckError),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg1.MessageID.String()).Return([]types.TransactionStatus{}, -1, errors.New("dummy txm error"))
+ },
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "snooze when not inflight but txm returns fatal status",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1},
+ inflight: []InflightInternalExecutionReport{},
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, TXMFatalStatus),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg1.MessageID.String()).Return([]types.TransactionStatus{types.Unconfirmed, types.Failed, types.Fatal}, 2, nil)
+ },
+ skipGasPriceEstimator: true,
+ },
+ {
+ name: "snooze messages when inflight but batch valid messages",
+ reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{zkMsg1, zkMsg2, zkMsg3, zkMsg4},
+ inflight: createInflight(zkMsg1, zkMsg2),
+ inflightAggregateValue: big.NewInt(0),
+ tokenLimit: big.NewInt(0),
+ destGasPrice: big.NewInt(10),
+ srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
+ dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
+ offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
+ expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: zkMsg3.SequenceNumber}},
+ expectedStates: []messageExecStatus{
+ newMessageExecState(zkMsg1.SequenceNumber, zkMsg1.MessageID, SkippedInflight),
+ newMessageExecState(zkMsg2.SequenceNumber, zkMsg2.MessageID, SkippedInflight),
+ newMessageExecState(zkMsg3.SequenceNumber, zkMsg3.MessageID, AddedToBatch),
+ },
+ statuschecker: func(m *mockstatuschecker.CCIPTransactionStatusChecker) {
+ m.Mock = mock.Mock{} // reset mock
+ m.On("CheckMessageStatus", mock.Anything, zkMsg3.MessageID.String()).Return([]types.TransactionStatus{}, -1, nil)
+ },
+ skipGasPriceEstimator: false,
+ },
+ }
+
+ t.Run("BestEffortBatchingStrategy", func(t *testing.T) {
+ strategy := &BestEffortBatchingStrategy{}
+ runBatchingStrategyTests(t, strategy, 1_000_000, append(testCases, bestEffortTestCases...))
+ })
+
+ t.Run("ZKOverflowBatchingStrategy", func(t *testing.T) {
+ mockedStatusChecker := mockstatuschecker.NewCCIPTransactionStatusChecker(t)
+ strategy := &ZKOverflowBatchingStrategy{
+ statuschecker: mockedStatusChecker,
+ }
+ runBatchingStrategyTests(t, strategy, 1_000_000, append(testCases, specificZkOverflowTestCases...))
+ })
+}
+
+// Function to set up and run tests for a given batching strategy
+func runBatchingStrategyTests(t *testing.T, strategy BatchingStrategy, availableGas uint64, testCases []testCase) {
+ destNative := ccipcalc.HexToAddress("0xb")
+
+ for _, tc := range testCases {
+ tc := tc
+ t.Run(tc.name, func(t *testing.T) {
+ lggr := logger.TestLogger(t)
+
+ gasPriceEstimator := prices.NewMockGasPriceEstimatorExec(t)
+ if !tc.skipGasPriceEstimator {
+ if tc.expectedSeqNrs != nil {
+ gasPriceEstimator.On("EstimateMsgCostUSD", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(0), nil)
+ } else {
+ gasPriceEstimator.On("EstimateMsgCostUSD", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(0), errors.New("error"))
+ }
+ }
+
+ // default case for ZKOverflowBatchingStrategy
+ if strategyType := reflect.TypeOf(strategy); tc.statuschecker == nil && strategyType == reflect.TypeOf(&ZKOverflowBatchingStrategy{}) {
+ strategy.(*ZKOverflowBatchingStrategy).statuschecker.(*mockstatuschecker.CCIPTransactionStatusChecker).On("CheckMessageStatus", mock.Anything, mock.Anything).Return([]types.TransactionStatus{}, -1, nil)
+ }
+
+ // Mock calls to TXM
+ if tc.statuschecker != nil {
+ tc.statuschecker(strategy.(*ZKOverflowBatchingStrategy).statuschecker.(*mockstatuschecker.CCIPTransactionStatusChecker))
+ }
+
+ batchContext := &BatchContext{
+ report: commitReportWithSendRequests{sendRequestsWithMeta: tc.reqs},
+ inflight: tc.inflight,
+ inflightAggregateValue: tc.inflightAggregateValue,
+ lggr: lggr,
+ availableDataLen: MaxDataLenPerBatch,
+ availableGas: availableGas,
+ expectedNonces: make(map[cciptypes.Address]uint64),
+ sendersNonce: tc.offRampNoncesBySender,
+ sourceTokenPricesUSD: tc.srcPrices,
+ destTokenPricesUSD: tc.dstPrices,
+ gasPrice: tc.destGasPrice,
+ sourceToDestToken: tc.srcToDestTokens,
+ aggregateTokenLimit: tc.tokenLimit,
+ tokenDataRemainingDuration: 5 * time.Second,
+ tokenDataWorker: tokendata.NewBackgroundWorker(map[cciptypes.Address]tokendata.Reader{}, 10, 5*time.Second, time.Hour),
+ gasPriceEstimator: gasPriceEstimator,
+ destWrappedNative: destNative,
+ offchainConfig: cciptypes.ExecOffchainConfig{
+ DestOptimisticConfirmations: 1,
+ BatchGasLimit: 300_000,
+ RelativeBoostPerWaitHour: 1,
+ },
+ }
+
+ seqNrs, execStates := strategy.BuildBatch(context.Background(), batchContext)
+
+ runAssertions(t, tc, seqNrs, execStates)
+ })
+ }
+}
+
+// Utility function to run common assertions
+func runAssertions(t *testing.T, tc testCase, seqNrs []ccip.ObservedMessage, execStates []messageExecStatus) {
+ if tc.expectedSeqNrs == nil {
+ assert.Len(t, seqNrs, 0)
+ } else {
+ assert.Equal(t, tc.expectedSeqNrs, seqNrs)
+ }
+
+ if tc.expectedStates == nil {
+ assert.Len(t, execStates, 0)
+ } else {
+ assert.Equal(t, tc.expectedStates, execStates)
+ }
+}
+
+func createTestMessage(seqNr uint64, sender cciptypes.Address, nonce uint64, feeToken cciptypes.Address, feeAmount *big.Int, executed bool, data []byte) cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta {
+ return cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
+ EVM2EVMMessage: cciptypes.EVM2EVMMessage{
+ SequenceNumber: seqNr,
+ FeeTokenAmount: feeAmount,
+ Sender: sender,
+ Nonce: nonce,
+ GasLimit: big.NewInt(1),
+ Strict: false,
+ Receiver: "",
+ Data: data,
+ TokenAmounts: nil,
+ FeeToken: feeToken,
+ MessageID: generateMessageIDFromInt(seqNr),
+ },
+ BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
+ Executed: executed,
+ }
+}
+
+func generateMessageIDFromInt(input uint64) [32]byte {
+ var messageID [32]byte
+ binary.LittleEndian.PutUint32(messageID[:], uint32(input))
+ return messageID
+}
+
+func createInflight(msgs ...cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta) []InflightInternalExecutionReport {
+ reports := make([]InflightInternalExecutionReport, len(msgs))
+
+ for i, msg := range msgs {
+ reports[i] = InflightInternalExecutionReport{
+ messages: []cciptypes.EVM2EVMMessage{msg.EVM2EVMMessage},
+ createdAt: msg.BlockTimestamp,
+ }
+ }
+
+ return reports
+}
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/factory.go b/core/services/ocr2/plugins/ccip/ccipexec/factory.go
index 1a18793a83..7cc9111f37 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/factory.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/factory.go
@@ -111,6 +111,11 @@ func (rf *ExecutionReportingPluginFactory) NewReportingPluginFn(config types.Rep
return reportingPluginAndInfo{}, fmt.Errorf("get onchain config from offramp: %w", err)
}
+ batchingStrategy, err := NewBatchingStrategy(offchainConfig.BatchingStrategyID, rf.config.txmStatusChecker)
+ if err != nil {
+ return reportingPluginAndInfo{}, fmt.Errorf("get batching strategy: %w", err)
+ }
+
msgVisibilityInterval := offchainConfig.MessageVisibilityInterval.Duration()
if msgVisibilityInterval.Seconds() == 0 {
rf.config.lggr.Info("MessageVisibilityInterval not set, falling back to PermissionLessExecutionThreshold")
@@ -139,6 +144,7 @@ func (rf *ExecutionReportingPluginFactory) NewReportingPluginFn(config types.Rep
commitRootsCache: cache.NewCommitRootsCache(lggr, msgVisibilityInterval, offchainConfig.RootSnoozeTime.Duration()),
metricsCollector: rf.config.metricsCollector,
chainHealthcheck: rf.config.chainHealthcheck,
+ batchingStrategy: batchingStrategy,
}
pluginInfo := types.ReportingPluginInfo{
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/initializers.go b/core/services/ocr2/plugins/ccip/ccipexec/initializers.go
index dfd3d287af..7826f6058f 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/initializers.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/initializers.go
@@ -20,6 +20,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcalc"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/statuschecker"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
"github.com/smartcontractkit/chainlink/v2/core/logger"
@@ -165,6 +166,7 @@ func NewExecServices(ctx context.Context, lggr logger.Logger, jb job.Job, srcPro
metricsCollector: metricsCollector,
chainHealthcheck: chainHealthcheck,
newReportingPluginRetryConfig: defaultNewReportingPluginRetryConfig,
+ txmStatusChecker: statuschecker.NewTxmStatusChecker(dstProvider.GetTransactionStatus),
})
argsNoPlugin.ReportingPluginFactory = promwrapper.NewPromFactory(wrappedPluginFactory, "CCIPExecution", jb.OCR2OracleSpec.Relay, big.NewInt(0).SetInt64(dstChainID))
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go b/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
index 3f594a423b..51c8c4e305 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
@@ -17,7 +17,6 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/hashutil"
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
-
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache"
@@ -27,6 +26,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/ccipdataprovider"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/prices"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/tokendata"
+ "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/statuschecker"
)
const (
@@ -63,6 +63,7 @@ type ExecutionPluginStaticConfig struct {
metricsCollector ccip.PluginMetricsCollector
chainHealthcheck cache.ChainHealthcheck
newReportingPluginRetryConfig ccipdata.RetryConfig
+ txmStatusChecker statuschecker.CCIPTransactionStatusChecker
}
type ExecutionReportingPlugin struct {
@@ -72,6 +73,8 @@ type ExecutionReportingPlugin struct {
offchainConfig cciptypes.ExecOffchainConfig
tokenDataWorker tokendata.Worker
metricsCollector ccip.PluginMetricsCollector
+ batchingStrategy BatchingStrategy
+
// Source
gasPriceEstimator prices.GasPriceEstimatorExec
sourcePriceRegistry ccipdata.PriceRegistryReader
@@ -79,8 +82,8 @@ type ExecutionReportingPlugin struct {
sourcePriceRegistryLock sync.RWMutex
sourceWrappedNativeToken cciptypes.Address
onRampReader ccipdata.OnRampReader
- // Dest
+ // Dest
commitStoreReader ccipdata.CommitStoreReader
destPriceRegistry ccipdata.PriceRegistryReader
destWrappedNative cciptypes.Address
@@ -206,17 +209,11 @@ func (r *ExecutionReportingPlugin) getExecutableObservations(ctx context.Context
return nil, err
}
- inflightAggregateValue, err := getInflightAggregateRateLimit(lggr, inflight, tokenExecData.destTokenPrices, tokenExecData.sourceToDestTokens)
- if err != nil {
- lggr.Errorw("Unexpected error computing inflight values", "err", err)
- return []ccip.ObservedMessage{}, nil
- }
-
batch, msgExecStates := r.buildBatch(
ctx,
+ inflight,
rootLggr,
rep,
- inflightAggregateValue,
tokenExecData.rateLimiterTokenBucket.Tokens,
tokenExecData.sourceTokenPrices,
tokenExecData.destTokenPrices,
@@ -257,9 +254,9 @@ func (r *ExecutionReportingPlugin) getExecutedSeqNrsInRange(ctx context.Context,
// profitability of execution.
func (r *ExecutionReportingPlugin) buildBatch(
ctx context.Context,
+ inflight []InflightInternalExecutionReport,
lggr logger.Logger,
report commitReportWithSendRequests,
- inflightAggregateValue *big.Int,
aggregateTokenLimit *big.Int,
sourceTokenPricesUSD map[cciptypes.Address]*big.Int,
destTokenPricesUSD map[cciptypes.Address]*big.Int,
@@ -277,174 +274,34 @@ func (r *ExecutionReportingPlugin) buildBatch(
return []ccip.ObservedMessage{}, []messageExecStatus{}
}
- availableGas := uint64(r.offchainConfig.BatchGasLimit)
- expectedNonces := make(map[cciptypes.Address]uint64)
- availableDataLen := MaxDataLenPerBatch
- tokenDataRemainingDuration := MaximumAllowedTokenDataWaitTimePerBatch
- batchBuilder := newBatchBuildContainer(len(report.sendRequestsWithMeta))
-
- for _, msg := range report.sendRequestsWithMeta {
- msgLggr := lggr.With("messageID", hexutil.Encode(msg.MessageID[:]), "seqNr", msg.SequenceNumber)
-
- if msg.Executed {
- msgLggr.Infow("Skipping message - already executed")
- batchBuilder.skip(msg, AlreadyExecuted)
- continue
- }
-
- if len(msg.Data) > availableDataLen {
- msgLggr.Infow("Skipping message - insufficient remaining batch data length", "msgDataLen", len(msg.Data), "availableBatchDataLen", availableDataLen)
- batchBuilder.skip(msg, InsufficientRemainingBatchDataLength)
- continue
- }
-
- messageMaxGas, err1 := calculateMessageMaxGas(
- msg.GasLimit,
- len(report.sendRequestsWithMeta),
- len(msg.Data),
- len(msg.TokenAmounts),
- )
- if err1 != nil {
- msgLggr.Errorw("Skipping message - message max gas calculation error", "err", err1)
- batchBuilder.skip(msg, MessageMaxGasCalcError)
- continue
- }
-
- // Check sufficient gas in batch
- if availableGas < messageMaxGas {
- msgLggr.Infow("Skipping message - insufficient remaining batch gas limit", "availableGas", availableGas, "messageMaxGas", messageMaxGas)
- batchBuilder.skip(msg, InsufficientRemainingBatchGas)
- continue
- }
-
- if _, ok := expectedNonces[msg.Sender]; !ok {
- nonce, ok1 := sendersNonce[msg.Sender]
- if !ok1 {
- msgLggr.Errorw("Skipping message - missing nonce", "sender", msg.Sender)
- batchBuilder.skip(msg, MissingNonce)
- continue
- }
- expectedNonces[msg.Sender] = nonce + 1
- }
-
- // Check expected nonce is valid for sequenced messages.
- // Sequenced messages have non-zero nonces.
- if msg.Nonce > 0 && msg.Nonce != expectedNonces[msg.Sender] {
- msgLggr.Warnw("Skipping message - invalid nonce", "have", msg.Nonce, "want", expectedNonces[msg.Sender])
- batchBuilder.skip(msg, InvalidNonce)
- continue
- }
-
- msgValue, err1 := aggregateTokenValue(lggr, destTokenPricesUSD, sourceToDestToken, msg.TokenAmounts)
- if err1 != nil {
- msgLggr.Errorw("Skipping message - aggregate token value compute error", "err", err1)
- batchBuilder.skip(msg, AggregateTokenValueComputeError)
- continue
- }
-
- // if token limit is smaller than message value skip message
- if tokensLeft, hasCapacity := hasEnoughTokens(aggregateTokenLimit, msgValue, inflightAggregateValue); !hasCapacity {
- msgLggr.Warnw("Skipping message - aggregate token limit exceeded", "aggregateTokenLimit", tokensLeft.String(), "msgValue", msgValue.String())
- batchBuilder.skip(msg, AggregateTokenLimitExceeded)
- continue
- }
-
- tokenData, elapsed, err1 := r.getTokenDataWithTimeout(ctx, msg, tokenDataRemainingDuration)
- tokenDataRemainingDuration -= elapsed
- if err1 != nil {
- if errors.Is(err1, tokendata.ErrNotReady) {
- msgLggr.Warnw("Skipping message - token data not ready", "err", err1)
- batchBuilder.skip(msg, TokenDataNotReady)
- continue
- }
- msgLggr.Errorw("Skipping message - token data fetch error", "err", err1)
- batchBuilder.skip(msg, TokenDataFetchError)
- continue
- }
-
- dstWrappedNativePrice, exists := destTokenPricesUSD[r.destWrappedNative]
- if !exists {
- msgLggr.Errorw("Skipping message - token not in destination token prices", "token", r.destWrappedNative)
- batchBuilder.skip(msg, TokenNotInDestTokenPrices)
- continue
- }
-
- // calculating the source chain fee, dividing by 1e18 for denomination.
- // For example:
- // FeeToken=link; FeeTokenAmount=1e17 i.e. 0.1 link, price is 6e18 USD/link (1 USD = 1e18),
- // availableFee is 1e17*6e18/1e18 = 6e17 = 0.6 USD
- sourceFeeTokenPrice, exists := sourceTokenPricesUSD[msg.FeeToken]
- if !exists {
- msgLggr.Errorw("Skipping message - token not in source token prices", "token", msg.FeeToken)
- batchBuilder.skip(msg, TokenNotInSrcTokenPrices)
- continue
- }
-
- // Fee boosting
- execCostUsd, err1 := r.gasPriceEstimator.EstimateMsgCostUSD(gasPrice, dstWrappedNativePrice, msg)
- if err1 != nil {
- msgLggr.Errorw("Failed to estimate message cost USD", "err", err1)
- return []ccip.ObservedMessage{}, []messageExecStatus{}
- }
-
- availableFee := big.NewInt(0).Mul(msg.FeeTokenAmount, sourceFeeTokenPrice)
- availableFee = availableFee.Div(availableFee, big.NewInt(1e18))
- availableFeeUsd := waitBoostedFee(time.Since(msg.BlockTimestamp), availableFee, r.offchainConfig.RelativeBoostPerWaitHour)
- if availableFeeUsd.Cmp(execCostUsd) < 0 {
- msgLggr.Infow(
- "Skipping message - insufficient remaining fee",
- "availableFeeUsd", availableFeeUsd,
- "execCostUsd", execCostUsd,
- "sourceBlockTimestamp", msg.BlockTimestamp,
- "waitTime", time.Since(msg.BlockTimestamp),
- "boost", r.offchainConfig.RelativeBoostPerWaitHour,
- )
- batchBuilder.skip(msg, InsufficientRemainingFee)
- continue
- }
-
- availableGas -= messageMaxGas
- availableDataLen -= len(msg.Data)
- aggregateTokenLimit.Sub(aggregateTokenLimit, msgValue)
- expectedNonces[msg.Sender] = msg.Nonce + 1
- batchBuilder.addToBatch(msg, tokenData)
-
- msgLggr.Infow(
- "Message added to execution batch",
- "nonce", msg.Nonce,
- "sender", msg.Sender,
- "value", msgValue,
- "availableAggrTokenLimit", aggregateTokenLimit,
- "availableGas", availableGas,
- "availableDataLen", availableDataLen,
- )
+ inflightAggregateValue, err := getInflightAggregateRateLimit(lggr, inflight, destTokenPricesUSD, sourceToDestToken)
+ if err != nil {
+ lggr.Errorw("Unexpected error computing inflight values", "err", err)
+ return []ccip.ObservedMessage{}, nil
}
- return batchBuilder.batch, batchBuilder.statuses
-}
-
-// getTokenDataWithCappedLatency gets the token data for the provided message.
-// Stops and returns an error if more than allowedWaitingTime is passed.
-func (r *ExecutionReportingPlugin) getTokenDataWithTimeout(
- ctx context.Context,
- msg cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta,
- timeout time.Duration,
-) ([][]byte, time.Duration, error) {
- if len(msg.TokenAmounts) == 0 {
- return nil, 0, nil
- }
-
- ctxTimeout, cf := context.WithTimeout(ctx, timeout)
- defer cf()
- tStart := time.Now()
- tokenData, err := r.tokenDataWorker.GetMsgTokenData(ctxTimeout, msg)
- tDur := time.Since(tStart)
- return tokenData, tDur, err
-}
-
-func hasEnoughTokens(tokenLimit *big.Int, msgValue *big.Int, inflightValue *big.Int) (*big.Int, bool) {
- tokensLeft := big.NewInt(0).Sub(tokenLimit, inflightValue)
- return tokensLeft, tokensLeft.Cmp(msgValue) >= 0
+ batchCtx := &BatchContext{
+ report,
+ inflight,
+ inflightAggregateValue,
+ lggr,
+ MaxDataLenPerBatch,
+ uint64(r.offchainConfig.BatchGasLimit),
+ make(map[cciptypes.Address]uint64),
+ sendersNonce,
+ sourceTokenPricesUSD,
+ destTokenPricesUSD,
+ gasPrice,
+ sourceToDestToken,
+ aggregateTokenLimit,
+ MaximumAllowedTokenDataWaitTimePerBatch,
+ r.tokenDataWorker,
+ r.gasPriceEstimator,
+ r.destWrappedNative,
+ r.offchainConfig,
+ }
+
+ return r.batchingStrategy.BuildBatch(ctx, batchCtx)
}
func calculateMessageMaxGas(gasLimit *big.Int, numRequests, dataLen, numTokens int) (uint64, error) {
@@ -546,20 +403,6 @@ func (r *ExecutionReportingPlugin) getReportsWithSendRequests(
return reportsWithSendReqs, nil
}
-func aggregateTokenValue(lggr logger.Logger, destTokenPricesUSD map[cciptypes.Address]*big.Int, sourceToDest map[cciptypes.Address]cciptypes.Address, tokensAndAmount []cciptypes.TokenAmount) (*big.Int, error) {
- sum := big.NewInt(0)
- for i := 0; i < len(tokensAndAmount); i++ {
- price, ok := destTokenPricesUSD[sourceToDest[tokensAndAmount[i].Token]]
- if !ok {
- // If we don't have a price for the token, we will assume it's worth 0.
- lggr.Infof("No price for token %s, assuming 0", tokensAndAmount[i].Token)
- continue
- }
- sum.Add(sum, new(big.Int).Quo(new(big.Int).Mul(price, tokensAndAmount[i].Amount), big.NewInt(1e18)))
- }
- return sum, nil
-}
-
// Assumes non-empty report. Messages to execute can span more than one report, but are assumed to be in order of increasing
// sequence number.
func (r *ExecutionReportingPlugin) buildReport(ctx context.Context, lggr logger.Logger, observedMessages []ccip.ObservedMessage) ([]byte, error) {
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go b/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
index bbb59179aa..626448b0f2 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
@@ -218,6 +218,9 @@ func TestExecutionReportingPlugin_Observation(t *testing.T) {
p.commitRootsCache = cache.NewCommitRootsCache(logger.TestLogger(t), time.Minute, time.Minute)
p.chainHealthcheck = cache.NewChainHealthcheck(p.lggr, mockOnRampReader, commitStoreReader)
+ bs := &BestEffortBatchingStrategy{}
+ p.batchingStrategy = bs
+
_, err = p.Observation(ctx, types.ReportTimestamp{}, types.Query{})
if tc.expErr {
assert.Error(t, err)
@@ -458,401 +461,6 @@ func TestExecutionReportingPlugin_buildReport(t *testing.T) {
assert.LessOrEqual(t, len(execReport), MaxExecutionReportLength, "built execution report length")
}
-func TestExecutionReportingPlugin_buildBatch(t *testing.T) {
- offRamp, _ := testhelpers.NewFakeOffRamp(t)
- lggr := logger.TestLogger(t)
-
- sender1 := ccipcalc.HexToAddress("0xa")
- destNative := ccipcalc.HexToAddress("0xb")
- srcNative := ccipcalc.HexToAddress("0xc")
-
- msg1 := cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 1,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 1,
- GasLimit: big.NewInt(1),
- Strict: false,
- Receiver: "",
- Data: nil,
- TokenAmounts: nil,
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- }
-
- msg2 := msg1
- msg2.Executed = true
-
- msg3 := msg1
- msg3.Executed = true
- msg3.Finalized = true
-
- msg4 := msg1
- msg4.TokenAmounts = []cciptypes.TokenAmount{
- {Token: srcNative, Amount: big.NewInt(100)},
- }
-
- msg5 := msg4
- msg5.SequenceNumber = msg5.SequenceNumber + 1
- msg5.Nonce = msg5.Nonce + 1
-
- var tt = []struct {
- name string
- reqs []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta
- inflight *big.Int
- tokenRateLimitCapacity, destGasPrice *big.Int
- srcPrices, dstPrices map[cciptypes.Address]*big.Int
- offRampNoncesBySender map[cciptypes.Address]uint64
- srcToDestTokens map[cciptypes.Address]cciptypes.Address
- expectedSeqNrs []ccip.ObservedMessage
- expectedStates []messageExecStatus
- }{
- {
- name: "single message no tokens",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(1)}},
- expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, AddedToBatch)},
- },
- {
- name: "executed non finalized messages should be skipped",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg2},
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedStates: []messageExecStatus{newMessageExecState(msg2.SequenceNumber, msg2.MessageID, AlreadyExecuted)},
- },
- {
- name: "finalized executed log",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg3},
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedStates: []messageExecStatus{newMessageExecState(msg3.SequenceNumber, msg3.MessageID, AlreadyExecuted)},
- },
- {
- name: "dst token price does not exist",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, TokenNotInDestTokenPrices)},
- },
- {
- name: "src token price does not exist",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, TokenNotInSrcTokenPrices)},
- },
- {
- name: "message with tokens is not executed if limit is reached",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg4},
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(2),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1e18)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1e18)},
- srcToDestTokens: map[cciptypes.Address]cciptypes.Address{
- srcNative: destNative,
- },
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedStates: []messageExecStatus{newMessageExecState(msg4.SequenceNumber, msg4.MessageID, AggregateTokenLimitExceeded)},
- },
- {
- name: "message with tokens is not executed if limit is reached when inflight is full",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg5},
- inflight: new(big.Int).Mul(big.NewInt(1e18), big.NewInt(100)),
- tokenRateLimitCapacity: big.NewInt(19),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1e18)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1e18)},
- srcToDestTokens: map[cciptypes.Address]cciptypes.Address{
- srcNative: destNative,
- },
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 1},
- expectedStates: []messageExecStatus{newMessageExecState(msg5.SequenceNumber, msg5.MessageID, AggregateTokenLimitExceeded)},
- },
- {
- name: "skip when nonce doesn't match chain value",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 123},
- expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, InvalidNonce)},
- },
- {
- name: "skip when nonce not found",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{msg1},
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{},
- expectedStates: []messageExecStatus{newMessageExecState(msg1.SequenceNumber, msg1.MessageID, MissingNonce)},
- },
- {
- name: "skip when batch gas limit is reached",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 10,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 1,
- GasLimit: big.NewInt(1),
- Data: bytes.Repeat([]byte{'a'}, 1000),
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 11,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 2,
- GasLimit: big.NewInt(math.MaxInt64),
- Data: bytes.Repeat([]byte{'a'}, 1000),
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 12,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 3,
- GasLimit: big.NewInt(1),
- Data: bytes.Repeat([]byte{'a'}, 1000),
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- },
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(10)}},
- expectedStates: []messageExecStatus{
- newMessageExecState(10, [32]byte{}, AddedToBatch),
- newMessageExecState(11, [32]byte{}, InsufficientRemainingBatchGas),
- newMessageExecState(12, [32]byte{}, InvalidNonce),
- },
- },
- {
- name: "some messages skipped after hitting max batch data len",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 10,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 1,
- GasLimit: big.NewInt(1),
- Data: bytes.Repeat([]byte{'a'}, 1000),
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 11,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 2,
- GasLimit: big.NewInt(1),
- Data: bytes.Repeat([]byte{'a'}, MaxDataLenPerBatch-500), // skipped from batch
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 12,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 3,
- GasLimit: big.NewInt(1),
- Data: bytes.Repeat([]byte{'a'}, 1000),
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- },
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(10)}},
- expectedStates: []messageExecStatus{
- newMessageExecState(10, [32]byte{}, AddedToBatch),
- newMessageExecState(11, [32]byte{}, InsufficientRemainingBatchDataLength),
- newMessageExecState(12, [32]byte{}, InvalidNonce),
- },
- },
- {
- name: "unordered messages",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 10,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 0,
- GasLimit: big.NewInt(1),
- Data: bytes.Repeat([]byte{'a'}, 1000),
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- },
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 0},
- expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(10)}},
- expectedStates: []messageExecStatus{
- newMessageExecState(10, [32]byte{}, AddedToBatch),
- },
- },
- {
- name: "unordered messages not blocked by nonce",
- reqs: []cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 9,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 5,
- GasLimit: big.NewInt(1),
- Data: bytes.Repeat([]byte{'a'}, 1000),
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- {
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{
- SequenceNumber: 10,
- FeeTokenAmount: big.NewInt(1e9),
- Sender: sender1,
- Nonce: 0,
- GasLimit: big.NewInt(1),
- Data: bytes.Repeat([]byte{'a'}, 1000),
- FeeToken: srcNative,
- MessageID: [32]byte{},
- },
- BlockTimestamp: time.Date(2010, 1, 1, 12, 12, 12, 0, time.UTC),
- },
- },
- inflight: big.NewInt(0),
- tokenRateLimitCapacity: big.NewInt(0),
- destGasPrice: big.NewInt(10),
- srcPrices: map[cciptypes.Address]*big.Int{srcNative: big.NewInt(1)},
- dstPrices: map[cciptypes.Address]*big.Int{destNative: big.NewInt(1)},
- offRampNoncesBySender: map[cciptypes.Address]uint64{sender1: 3},
- expectedSeqNrs: []ccip.ObservedMessage{{SeqNr: uint64(10)}},
- expectedStates: []messageExecStatus{
- newMessageExecState(9, [32]byte{}, InvalidNonce),
- newMessageExecState(10, [32]byte{}, AddedToBatch),
- },
- },
- }
-
- for _, tc := range tt {
- tc := tc
- t.Run(tc.name, func(t *testing.T) {
- offRamp.SetSenderNonces(tc.offRampNoncesBySender)
-
- gasPriceEstimator := prices.NewMockGasPriceEstimatorExec(t)
- if tc.expectedSeqNrs != nil {
- gasPriceEstimator.On("EstimateMsgCostUSD", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(big.NewInt(0), nil)
- }
-
- // Mock calls to reader.
- mockOffRampReader := ccipdatamocks.NewOffRampReader(t)
- mockOffRampReader.On("ListSenderNonces", mock.Anything, mock.Anything).Return(tc.offRampNoncesBySender, nil).Maybe()
-
- plugin := ExecutionReportingPlugin{
- tokenDataWorker: tokendata.NewBackgroundWorker(map[cciptypes.Address]tokendata.Reader{}, 10, 5*time.Second, time.Hour),
- offRampReader: mockOffRampReader,
- destWrappedNative: destNative,
- offchainConfig: cciptypes.ExecOffchainConfig{
- DestOptimisticConfirmations: 1,
- BatchGasLimit: 500_000,
- RelativeBoostPerWaitHour: 1,
- },
- lggr: logger.TestLogger(t),
- gasPriceEstimator: gasPriceEstimator,
- }
-
- seqNrs, execStates := plugin.buildBatch(
- context.Background(),
- lggr,
- commitReportWithSendRequests{sendRequestsWithMeta: tc.reqs},
- tc.inflight,
- tc.tokenRateLimitCapacity,
- tc.srcPrices,
- tc.dstPrices,
- tc.destGasPrice,
- tc.srcToDestTokens,
- )
- if tc.expectedSeqNrs == nil {
- assert.Len(t, seqNrs, 0)
- } else {
- assert.Equal(t, tc.expectedSeqNrs, seqNrs)
- }
-
- if tc.expectedStates == nil {
- assert.Len(t, execStates, 0)
- } else {
- assert.Equal(t, tc.expectedStates, execStates)
- }
- })
- }
-}
-
func TestExecutionReportingPlugin_getReportsWithSendRequests(t *testing.T) {
testCases := []struct {
name string
@@ -985,58 +593,6 @@ func TestExecutionReportingPlugin_getReportsWithSendRequests(t *testing.T) {
}
}
-type delayedTokenDataWorker struct {
- delay time.Duration
- tokendata.Worker
-}
-
-func (m delayedTokenDataWorker) GetMsgTokenData(ctx context.Context, msg cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta) ([][]byte, error) {
- time.Sleep(m.delay)
- return nil, ctx.Err()
-}
-
-func TestExecutionReportingPlugin_getTokenDataWithCappedLatency(t *testing.T) {
- testCases := []struct {
- name string
- allowedWaitingTime time.Duration
- workerLatency time.Duration
- expErr bool
- }{
- {
- name: "happy flow",
- allowedWaitingTime: 10 * time.Millisecond,
- workerLatency: time.Nanosecond,
- expErr: false,
- },
- {
- name: "worker takes long to reply",
- allowedWaitingTime: 10 * time.Millisecond,
- workerLatency: 20 * time.Millisecond,
- expErr: true,
- },
- }
-
- ctx := testutils.Context(t)
-
- for _, tc := range testCases {
- t.Run(tc.name, func(t *testing.T) {
- p := &ExecutionReportingPlugin{}
- p.tokenDataWorker = delayedTokenDataWorker{delay: tc.workerLatency}
-
- msg := cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta{
- EVM2EVMMessage: cciptypes.EVM2EVMMessage{TokenAmounts: make([]cciptypes.TokenAmount, 1)},
- }
-
- _, _, err := p.getTokenDataWithTimeout(ctx, msg, tc.allowedWaitingTime)
- if tc.expErr {
- assert.Error(t, err)
- return
- }
- assert.NoError(t, err)
- })
- }
-}
-
func Test_calculateObservedMessagesConsensus(t *testing.T) {
type args struct {
observations []ccip.ExecutionObservation
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/offramp.go
index 410b91328a..137cbaf451 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/offramp.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/offramp.go
@@ -109,6 +109,8 @@ type ExecOffchainConfig struct {
InflightCacheExpiry config.Duration
// See [ccipdata.ExecOffchainConfig.RootSnoozeTime]
RootSnoozeTime config.Duration
+ // See [ccipdata.ExecOffchainConfig.BatchingStrategyID]
+ BatchingStrategyID uint32
// See [ccipdata.ExecOffchainConfig.MessageVisibilityInterval]
MessageVisibilityInterval config.Duration
}
@@ -416,6 +418,7 @@ func (o *OffRamp) ChangeConfig(ctx context.Context, onchainConfigBytes []byte, o
InflightCacheExpiry: offchainConfigParsed.InflightCacheExpiry,
RootSnoozeTime: offchainConfigParsed.RootSnoozeTime,
MessageVisibilityInterval: offchainConfigParsed.MessageVisibilityInterval,
+ BatchingStrategyID: offchainConfigParsed.BatchingStrategyID,
}
onchainConfig := cciptypes.ExecOnchainConfig{
PermissionLessExecutionThresholdSeconds: time.Second * time.Duration(onchainConfigParsed.PermissionLessExecutionThresholdSeconds),
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/offramp_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/offramp_test.go
index 657617c34a..44fb6ca063 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/offramp_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/offramp_test.go
@@ -94,6 +94,7 @@ func TestExecOffchainConfig100_AllFieldsRequired(t *testing.T) {
RelativeBoostPerWaitHour: 0.07,
InflightCacheExpiry: *config.MustNewDuration(64 * time.Second),
RootSnoozeTime: *config.MustNewDuration(128 * time.Minute),
+ BatchingStrategyID: 0,
}
encoded, err := ccipconfig.EncodeOffchainConfig(&cfg)
require.NoError(t, err)
@@ -115,7 +116,11 @@ func TestExecOffchainConfig100_AllFieldsRequired(t *testing.T) {
encodedPartialConfig, err := json.Marshal(partialConfig)
require.NoError(t, err)
_, err = ccipconfig.DecodeOffchainConfig[ExecOffchainConfig](encodedPartialConfig)
- require.ErrorContains(t, err, keyToDelete)
+ if keyToDelete == "BatchingStrategyID" {
+ require.NoError(t, err)
+ } else {
+ require.ErrorContains(t, err, keyToDelete)
+ }
}
}
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go
index 94c9a45e26..fa00894b38 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp.go
@@ -94,6 +94,8 @@ type JSONExecOffchainConfig struct {
InflightCacheExpiry config.Duration
// See [ccipdata.ExecOffchainConfig.RootSnoozeTime]
RootSnoozeTime config.Duration
+ // See [ccipdata.ExecOffchainConfig.BatchingStrategyID]
+ BatchingStrategyID uint32
// See [ccipdata.ExecOffchainConfig.MessageVisibilityInterval]
MessageVisibilityInterval config.Duration
}
@@ -172,6 +174,7 @@ func (o *OffRamp) ChangeConfig(ctx context.Context, onchainConfigBytes []byte, o
InflightCacheExpiry: offchainConfigParsed.InflightCacheExpiry,
RootSnoozeTime: offchainConfigParsed.RootSnoozeTime,
MessageVisibilityInterval: offchainConfigParsed.MessageVisibilityInterval,
+ BatchingStrategyID: offchainConfigParsed.BatchingStrategyID,
}
onchainConfig := cciptypes.ExecOnchainConfig{
PermissionLessExecutionThresholdSeconds: time.Second * time.Duration(onchainConfigParsed.PermissionLessExecutionThresholdSeconds),
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_test.go
index df7f7ead59..7d174d5db7 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/offramp_test.go
@@ -26,6 +26,7 @@ func TestExecOffchainConfig120_Encoding(t *testing.T) {
RelativeBoostPerWaitHour: 0.07,
InflightCacheExpiry: *config.MustNewDuration(64 * time.Second),
RootSnoozeTime: *config.MustNewDuration(128 * time.Minute),
+ BatchingStrategyID: 0,
}
tests := []struct {
@@ -79,6 +80,12 @@ func TestExecOffchainConfig120_Encoding(t *testing.T) {
}),
errPattern: "RootSnoozeTime",
},
+ {
+ name: "must set BatchingStrategyId",
+ want: modifyCopy(validConfig, func(c *JSONExecOffchainConfig) {
+ c.BatchingStrategyID = 1
+ }),
+ },
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
@@ -125,18 +132,42 @@ func TestExecOffchainConfig120_ParseRawJson(t *testing.T) {
"RootSnoozeTime": "128m"
}`),
},
+ {
+ name: "with BatchingStrategyId",
+ config: []byte(`{
+ "DestOptimisticConfirmations": 6,
+ "BatchGasLimit": 5000000,
+ "RelativeBoostPerWaitHour": 0.07,
+ "InflightCacheExpiry": "64s",
+ "RootSnoozeTime": "128m",
+ "BatchingStrategyId": 1
+ }`),
+ },
}
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
decoded, err := ccipconfig.DecodeOffchainConfig[JSONExecOffchainConfig](tc.config)
require.NoError(t, err)
- require.Equal(t, JSONExecOffchainConfig{
- DestOptimisticConfirmations: 6,
- BatchGasLimit: 5_000_000,
- RelativeBoostPerWaitHour: 0.07,
- InflightCacheExpiry: *config.MustNewDuration(64 * time.Second),
- RootSnoozeTime: *config.MustNewDuration(128 * time.Minute),
- }, decoded)
+
+ if tc.name == "with BatchingStrategyId" {
+ require.Equal(t, JSONExecOffchainConfig{
+ DestOptimisticConfirmations: 6,
+ BatchGasLimit: 5_000_000,
+ RelativeBoostPerWaitHour: 0.07,
+ InflightCacheExpiry: *config.MustNewDuration(64 * time.Second),
+ RootSnoozeTime: *config.MustNewDuration(128 * time.Minute),
+ BatchingStrategyID: 1, // Actual value
+ }, decoded)
+ } else {
+ require.Equal(t, JSONExecOffchainConfig{
+ DestOptimisticConfirmations: 6,
+ BatchGasLimit: 5_000_000,
+ RelativeBoostPerWaitHour: 0.07,
+ InflightCacheExpiry: *config.MustNewDuration(64 * time.Second),
+ RootSnoozeTime: *config.MustNewDuration(128 * time.Minute),
+ BatchingStrategyID: 0, // Default
+ }, decoded)
+ }
})
}
}
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go
index 89d3047381..cac61c6787 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go
@@ -157,6 +157,7 @@ func (o *OffRamp) ChangeConfig(ctx context.Context, onchainConfigBytes []byte, o
InflightCacheExpiry: offchainConfigParsed.InflightCacheExpiry,
RootSnoozeTime: offchainConfigParsed.RootSnoozeTime,
MessageVisibilityInterval: offchainConfigParsed.MessageVisibilityInterval,
+ BatchingStrategyID: offchainConfigParsed.BatchingStrategyID,
}
onchainConfig := cciptypes.ExecOnchainConfig{
PermissionLessExecutionThresholdSeconds: time.Second * time.Duration(onchainConfigParsed.PermissionLessExecutionThresholdSeconds),
diff --git a/core/services/ocr2/plugins/ccip/transmitter/transmitter.go b/core/services/ocr2/plugins/ccip/transmitter/transmitter.go
new file mode 100644
index 0000000000..3e2962b33a
--- /dev/null
+++ b/core/services/ocr2/plugins/ccip/transmitter/transmitter.go
@@ -0,0 +1,143 @@
+package transmitter
+
+import (
+ "context"
+ "fmt"
+ "math/big"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/pkg/errors"
+
+ commontypes "github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink/v2/common/txmgr/types"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
+ statuschecker "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/statuschecker"
+)
+
+type roundRobinKeystore interface {
+ GetRoundRobinAddress(ctx context.Context, chainID *big.Int, addresses ...common.Address) (address common.Address, err error)
+}
+
+type txManager interface {
+ CreateTransaction(ctx context.Context, txRequest txmgr.TxRequest) (tx txmgr.Tx, err error)
+ GetTransactionStatus(ctx context.Context, transactionID string) (state commontypes.TransactionStatus, err error)
+}
+
+type Transmitter interface {
+ CreateEthTransaction(ctx context.Context, toAddress common.Address, payload []byte, txMeta *txmgr.TxMeta) error
+ FromAddress() common.Address
+}
+
+type transmitter struct {
+ txm txManager
+ fromAddresses []common.Address
+ gasLimit uint64
+ effectiveTransmitterAddress common.Address
+ strategy types.TxStrategy
+ checker txmgr.TransmitCheckerSpec
+ chainID *big.Int
+ keystore roundRobinKeystore
+ statuschecker statuschecker.CCIPTransactionStatusChecker // Used for CCIP's idempotency key generation
+}
+
+// NewTransmitter creates a new eth transmitter
+func NewTransmitter(
+ txm txManager,
+ fromAddresses []common.Address,
+ gasLimit uint64,
+ effectiveTransmitterAddress common.Address,
+ strategy types.TxStrategy,
+ checker txmgr.TransmitCheckerSpec,
+ chainID *big.Int,
+ keystore roundRobinKeystore,
+) (Transmitter, error) {
+ // Ensure that a keystore is provided.
+ if keystore == nil {
+ return nil, errors.New("nil keystore provided to transmitter")
+ }
+
+ return &transmitter{
+ txm: txm,
+ fromAddresses: fromAddresses,
+ gasLimit: gasLimit,
+ effectiveTransmitterAddress: effectiveTransmitterAddress,
+ strategy: strategy,
+ checker: checker,
+ chainID: chainID,
+ keystore: keystore,
+ }, nil
+}
+
+func NewTransmitterWithStatusChecker(
+ txm txManager,
+ fromAddresses []common.Address,
+ gasLimit uint64,
+ effectiveTransmitterAddress common.Address,
+ strategy types.TxStrategy,
+ checker txmgr.TransmitCheckerSpec,
+ chainID *big.Int,
+ keystore roundRobinKeystore,
+) (Transmitter, error) {
+ t, err := NewTransmitter(txm, fromAddresses, gasLimit, effectiveTransmitterAddress, strategy, checker, chainID, keystore)
+
+ if err != nil {
+ return nil, err
+ }
+
+ transmitter, ok := t.(*transmitter)
+ if !ok {
+ return nil, errors.New("failed to type assert Transmitter to *transmitter")
+ }
+ transmitter.statuschecker = statuschecker.NewTxmStatusChecker(txm.GetTransactionStatus)
+
+ return transmitter, nil
+}
+
+func (t *transmitter) CreateEthTransaction(ctx context.Context, toAddress common.Address, payload []byte, txMeta *txmgr.TxMeta) error {
+ roundRobinFromAddress, err := t.keystore.GetRoundRobinAddress(ctx, t.chainID, t.fromAddresses...)
+ if err != nil {
+ return fmt.Errorf("skipped OCR transmission, error getting round-robin address: %w", err)
+ }
+
+ var idempotencyKey *string
+
+ // Define idempotency key for CCIP Execution Plugin
+ if len(txMeta.MessageIDs) == 1 && t.statuschecker != nil {
+ messageId := txMeta.MessageIDs[0]
+ _, count, err1 := t.statuschecker.CheckMessageStatus(ctx, messageId)
+
+ if err1 != nil {
+ return errors.Wrap(err, "skipped OCR transmission, error getting message status")
+ }
+ idempotencyKey = func() *string {
+ s := fmt.Sprintf("%s-%d", messageId, count+1)
+ return &s
+ }()
+ }
+
+ _, err = t.txm.CreateTransaction(ctx, txmgr.TxRequest{
+ IdempotencyKey: idempotencyKey,
+ FromAddress: roundRobinFromAddress,
+ ToAddress: toAddress,
+ EncodedPayload: payload,
+ FeeLimit: t.gasLimit,
+ ForwarderAddress: t.forwarderAddress(),
+ Strategy: t.strategy,
+ Checker: t.checker,
+ Meta: txMeta,
+ })
+ return errors.Wrap(err, "skipped OCR transmission")
+}
+
+func (t *transmitter) FromAddress() common.Address {
+ return t.effectiveTransmitterAddress
+}
+
+func (t *transmitter) forwarderAddress() common.Address {
+ for _, a := range t.fromAddresses {
+ if a == t.effectiveTransmitterAddress {
+ return common.Address{}
+ }
+ }
+ return t.effectiveTransmitterAddress
+}
diff --git a/core/services/ocr2/plugins/ccip/transmitter/transmitter_test.go b/core/services/ocr2/plugins/ccip/transmitter/transmitter_test.go
new file mode 100644
index 0000000000..d177f1baa5
--- /dev/null
+++ b/core/services/ocr2/plugins/ccip/transmitter/transmitter_test.go
@@ -0,0 +1,282 @@
+package transmitter
+
+import (
+ "math/big"
+ "testing"
+
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/pkg/errors"
+ "github.com/stretchr/testify/mock"
+ "github.com/stretchr/testify/require"
+
+ ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/sqlutil"
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+ commontxmmocks "github.com/smartcontractkit/chainlink/v2/common/txmgr/types/mocks"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr"
+ txmmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr/mocks"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore"
+ "github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ethkey"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon"
+
+ "github.com/smartcontractkit/chainlink/v2/core/utils"
+)
+
+var (
+ FixtureChainID = *testutils.FixtureChainID
+ Password = testutils.Password
+)
+
+func newMockTxStrategy(t *testing.T) *commontxmmocks.TxStrategy {
+ return commontxmmocks.NewTxStrategy(t)
+}
+
+func Test_DefaultTransmitter_CreateEthTransaction(t *testing.T) {
+ t.Parallel()
+
+ db := pgtest.NewSqlxDB(t)
+ ethKeyStore := NewKeyStore(t, db).Eth()
+
+ _, fromAddress := MustInsertRandomKey(t, ethKeyStore)
+
+ gasLimit := uint64(1000)
+ chainID := big.NewInt(0)
+ effectiveTransmitterAddress := fromAddress
+ toAddress := testutils.NewAddress()
+ payload := []byte{1, 2, 3}
+ txm := txmmocks.NewMockEvmTxManager(t)
+ strategy := newMockTxStrategy(t)
+
+ transmitter, err := ocrcommon.NewTransmitter(
+ txm,
+ []common.Address{fromAddress},
+ gasLimit,
+ effectiveTransmitterAddress,
+ strategy,
+ txmgr.TransmitCheckerSpec{},
+ chainID,
+ ethKeyStore,
+ )
+ require.NoError(t, err)
+
+ txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{
+ FromAddress: fromAddress,
+ ToAddress: toAddress,
+ EncodedPayload: payload,
+ FeeLimit: gasLimit,
+ ForwarderAddress: common.Address{},
+ Meta: nil,
+ Strategy: strategy,
+ }).Return(txmgr.Tx{}, nil).Once()
+ require.NoError(t, transmitter.CreateEthTransaction(testutils.Context(t), toAddress, payload, nil))
+}
+
+func Test_DefaultTransmitter_Forwarding_Enabled_CreateEthTransaction(t *testing.T) {
+ t.Parallel()
+
+ db := pgtest.NewSqlxDB(t)
+ ethKeyStore := NewKeyStore(t, db).Eth()
+
+ _, fromAddress := MustInsertRandomKey(t, ethKeyStore)
+ _, fromAddress2 := MustInsertRandomKey(t, ethKeyStore)
+
+ gasLimit := uint64(1000)
+ chainID := big.NewInt(0)
+ effectiveTransmitterAddress := common.Address{}
+ toAddress := testutils.NewAddress()
+ payload := []byte{1, 2, 3}
+ txm := txmmocks.NewMockEvmTxManager(t)
+ strategy := newMockTxStrategy(t)
+
+ transmitter, err := ocrcommon.NewTransmitter(
+ txm,
+ []common.Address{fromAddress, fromAddress2},
+ gasLimit,
+ effectiveTransmitterAddress,
+ strategy,
+ txmgr.TransmitCheckerSpec{},
+ chainID,
+ ethKeyStore,
+ )
+ require.NoError(t, err)
+
+ txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{
+ FromAddress: fromAddress,
+ ToAddress: toAddress,
+ EncodedPayload: payload,
+ FeeLimit: gasLimit,
+ ForwarderAddress: common.Address{},
+ Meta: nil,
+ Strategy: strategy,
+ }).Return(txmgr.Tx{}, nil).Once()
+ txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{
+ FromAddress: fromAddress2,
+ ToAddress: toAddress,
+ EncodedPayload: payload,
+ FeeLimit: gasLimit,
+ ForwarderAddress: common.Address{},
+ Meta: nil,
+ Strategy: strategy,
+ }).Return(txmgr.Tx{}, nil).Once()
+ require.NoError(t, transmitter.CreateEthTransaction(testutils.Context(t), toAddress, payload, nil))
+ require.NoError(t, transmitter.CreateEthTransaction(testutils.Context(t), toAddress, payload, nil))
+}
+
+func Test_DefaultTransmitter_Forwarding_Enabled_CreateEthTransaction_Round_Robin_Error(t *testing.T) {
+ t.Parallel()
+
+ db := pgtest.NewSqlxDB(t)
+ ethKeyStore := NewKeyStore(t, db).Eth()
+
+ fromAddress := common.Address{}
+
+ gasLimit := uint64(1000)
+ chainID := big.NewInt(0)
+ effectiveTransmitterAddress := common.Address{}
+ toAddress := testutils.NewAddress()
+ payload := []byte{1, 2, 3}
+ txm := txmmocks.NewMockEvmTxManager(t)
+ strategy := newMockTxStrategy(t)
+
+ transmitter, err := ocrcommon.NewTransmitter(
+ txm,
+ []common.Address{fromAddress},
+ gasLimit,
+ effectiveTransmitterAddress,
+ strategy,
+ txmgr.TransmitCheckerSpec{},
+ chainID,
+ ethKeyStore,
+ )
+ require.NoError(t, err)
+ require.Error(t, transmitter.CreateEthTransaction(testutils.Context(t), toAddress, payload, nil))
+}
+
+func Test_DefaultTransmitter_Forwarding_Enabled_CreateEthTransaction_No_Keystore_Error(t *testing.T) {
+ t.Parallel()
+
+ db := pgtest.NewSqlxDB(t)
+ ethKeyStore := NewKeyStore(t, db).Eth()
+
+ _, fromAddress := MustInsertRandomKey(t, ethKeyStore)
+ _, fromAddress2 := MustInsertRandomKey(t, ethKeyStore)
+
+ gasLimit := uint64(1000)
+ chainID := big.NewInt(0)
+ effectiveTransmitterAddress := common.Address{}
+ txm := txmmocks.NewMockEvmTxManager(t)
+ strategy := newMockTxStrategy(t)
+
+ _, err := ocrcommon.NewTransmitter(
+ txm,
+ []common.Address{fromAddress, fromAddress2},
+ gasLimit,
+ effectiveTransmitterAddress,
+ strategy,
+ txmgr.TransmitCheckerSpec{},
+ chainID,
+ nil,
+ )
+ require.Error(t, err)
+}
+
+func Test_Transmitter_With_StatusChecker_CreateEthTransaction(t *testing.T) {
+ t.Parallel()
+
+ db := pgtest.NewSqlxDB(t)
+ ethKeyStore := NewKeyStore(t, db).Eth()
+
+ _, fromAddress := MustInsertRandomKey(t, ethKeyStore)
+
+ gasLimit := uint64(1000)
+ chainID := big.NewInt(0)
+ effectiveTransmitterAddress := fromAddress
+ txm := txmmocks.NewMockEvmTxManager(t)
+ strategy := newMockTxStrategy(t)
+ toAddress := testutils.NewAddress()
+ payload := []byte{1, 2, 3}
+ idempotencyKey := "1-0"
+ txMeta := &txmgr.TxMeta{MessageIDs: []string{"1"}}
+
+ transmitter, err := NewTransmitterWithStatusChecker(
+ txm,
+ []common.Address{fromAddress},
+ gasLimit,
+ effectiveTransmitterAddress,
+ strategy,
+ txmgr.TransmitCheckerSpec{},
+ chainID,
+ ethKeyStore,
+ )
+ require.NoError(t, err)
+
+ // This case is for when the message ID was not found in the status checker
+ txm.On("GetTransactionStatus", mock.Anything, idempotencyKey).Return(types.Unknown, errors.New("dummy")).Once()
+
+ txm.On("CreateTransaction", mock.Anything, txmgr.TxRequest{
+ IdempotencyKey: &idempotencyKey,
+ FromAddress: fromAddress,
+ ToAddress: toAddress,
+ EncodedPayload: payload,
+ FeeLimit: gasLimit,
+ ForwarderAddress: common.Address{},
+ Meta: txMeta,
+ Strategy: strategy,
+ }).Return(txmgr.Tx{}, nil).Once()
+
+ require.NoError(t, transmitter.CreateEthTransaction(testutils.Context(t), toAddress, payload, txMeta))
+ txm.AssertExpectations(t)
+}
+
+func NewKeyStore(t testing.TB, ds sqlutil.DataSource) keystore.Master {
+ ctx := testutils.Context(t)
+ keystore := keystore.NewInMemory(ds, utils.FastScryptParams, logger.TestLogger(t))
+ require.NoError(t, keystore.Unlock(ctx, Password))
+ return keystore
+}
+
+type RandomKey struct {
+ Nonce int64
+ Disabled bool
+
+ chainIDs []ubig.Big // nil: Fixture, set empty for none
+}
+
+func (r RandomKey) MustInsert(t testing.TB, keystore keystore.Eth) (ethkey.KeyV2, common.Address) {
+ ctx := testutils.Context(t)
+ chainIDs := r.chainIDs
+ if chainIDs == nil {
+ chainIDs = []ubig.Big{*ubig.New(&FixtureChainID)}
+ }
+
+ key := MustGenerateRandomKey(t)
+ keystore.XXXTestingOnlyAdd(ctx, key)
+
+ for _, cid := range chainIDs {
+ require.NoError(t, keystore.Add(ctx, key.Address, cid.ToInt()))
+ require.NoError(t, keystore.Enable(ctx, key.Address, cid.ToInt()))
+ if r.Disabled {
+ require.NoError(t, keystore.Disable(ctx, key.Address, cid.ToInt()))
+ }
+ }
+
+ return key, key.Address
+}
+
+func MustInsertRandomKey(t testing.TB, keystore keystore.Eth, chainIDs ...ubig.Big) (ethkey.KeyV2, common.Address) {
+ r := RandomKey{}
+ if len(chainIDs) > 0 {
+ r.chainIDs = chainIDs
+ }
+ return r.MustInsert(t, keystore)
+}
+
+func MustGenerateRandomKey(t testing.TB) ethkey.KeyV2 {
+ key, err := ethkey.NewV2()
+ require.NoError(t, err)
+ return key
+}
diff --git a/core/services/relay/evm/evm.go b/core/services/relay/evm/evm.go
index 676dbd54b5..73a3aed4a1 100644
--- a/core/services/relay/evm/evm.go
+++ b/core/services/relay/evm/evm.go
@@ -17,6 +17,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/ccipcommit"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/ccipexec"
ccipconfig "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/config"
+ cciptransmitter "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/transmitter"
"github.com/ethereum/go-ethereum/accounts/abi"
"github.com/ethereum/go-ethereum/common"
@@ -829,6 +830,17 @@ func generateTransmitterFrom(ctx context.Context, rargs commontypes.RelayArgs, e
configWatcher.chain.ID(),
ethKeystore,
)
+ case commontypes.CCIPExecution:
+ transmitter, err = cciptransmitter.NewTransmitterWithStatusChecker(
+ configWatcher.chain.TxManager(),
+ fromAddresses,
+ gasLimit,
+ effectiveTransmitterAddress,
+ strategy,
+ checker,
+ configWatcher.chain.ID(),
+ ethKeystore,
+ )
default:
transmitter, err = ocrcommon.NewTransmitter(
configWatcher.chain.TxManager(),
diff --git a/core/services/relay/evm/statuschecker/mocks/ccip_transaction_status_checker.go b/core/services/relay/evm/statuschecker/mocks/ccip_transaction_status_checker.go
new file mode 100644
index 0000000000..9bd59ccf4e
--- /dev/null
+++ b/core/services/relay/evm/statuschecker/mocks/ccip_transaction_status_checker.go
@@ -0,0 +1,104 @@
+// Code generated by mockery v2.43.2. DO NOT EDIT.
+
+package mocks
+
+import (
+ context "context"
+
+ mock "github.com/stretchr/testify/mock"
+
+ types "github.com/smartcontractkit/chainlink-common/pkg/types"
+)
+
+// CCIPTransactionStatusChecker is an autogenerated mock type for the CCIPTransactionStatusChecker type
+type CCIPTransactionStatusChecker struct {
+ mock.Mock
+}
+
+type CCIPTransactionStatusChecker_Expecter struct {
+ mock *mock.Mock
+}
+
+func (_m *CCIPTransactionStatusChecker) EXPECT() *CCIPTransactionStatusChecker_Expecter {
+ return &CCIPTransactionStatusChecker_Expecter{mock: &_m.Mock}
+}
+
+// CheckMessageStatus provides a mock function with given fields: ctx, msgID
+func (_m *CCIPTransactionStatusChecker) CheckMessageStatus(ctx context.Context, msgID string) ([]types.TransactionStatus, int, error) {
+ ret := _m.Called(ctx, msgID)
+
+ if len(ret) == 0 {
+ panic("no return value specified for CheckMessageStatus")
+ }
+
+ var r0 []types.TransactionStatus
+ var r1 int
+ var r2 error
+ if rf, ok := ret.Get(0).(func(context.Context, string) ([]types.TransactionStatus, int, error)); ok {
+ return rf(ctx, msgID)
+ }
+ if rf, ok := ret.Get(0).(func(context.Context, string) []types.TransactionStatus); ok {
+ r0 = rf(ctx, msgID)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).([]types.TransactionStatus)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(context.Context, string) int); ok {
+ r1 = rf(ctx, msgID)
+ } else {
+ r1 = ret.Get(1).(int)
+ }
+
+ if rf, ok := ret.Get(2).(func(context.Context, string) error); ok {
+ r2 = rf(ctx, msgID)
+ } else {
+ r2 = ret.Error(2)
+ }
+
+ return r0, r1, r2
+}
+
+// CCIPTransactionStatusChecker_CheckMessageStatus_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'CheckMessageStatus'
+type CCIPTransactionStatusChecker_CheckMessageStatus_Call struct {
+ *mock.Call
+}
+
+// CheckMessageStatus is a helper method to define mock.On call
+// - ctx context.Context
+// - msgID string
+func (_e *CCIPTransactionStatusChecker_Expecter) CheckMessageStatus(ctx interface{}, msgID interface{}) *CCIPTransactionStatusChecker_CheckMessageStatus_Call {
+ return &CCIPTransactionStatusChecker_CheckMessageStatus_Call{Call: _e.mock.On("CheckMessageStatus", ctx, msgID)}
+}
+
+func (_c *CCIPTransactionStatusChecker_CheckMessageStatus_Call) Run(run func(ctx context.Context, msgID string)) *CCIPTransactionStatusChecker_CheckMessageStatus_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(context.Context), args[1].(string))
+ })
+ return _c
+}
+
+func (_c *CCIPTransactionStatusChecker_CheckMessageStatus_Call) Return(transactionStatuses []types.TransactionStatus, retryCounter int, err error) *CCIPTransactionStatusChecker_CheckMessageStatus_Call {
+ _c.Call.Return(transactionStatuses, retryCounter, err)
+ return _c
+}
+
+func (_c *CCIPTransactionStatusChecker_CheckMessageStatus_Call) RunAndReturn(run func(context.Context, string) ([]types.TransactionStatus, int, error)) *CCIPTransactionStatusChecker_CheckMessageStatus_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
+// NewCCIPTransactionStatusChecker creates a new instance of CCIPTransactionStatusChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
+// The first argument is typically a *testing.T value.
+func NewCCIPTransactionStatusChecker(t interface {
+ mock.TestingT
+ Cleanup(func())
+}) *CCIPTransactionStatusChecker {
+ mock := &CCIPTransactionStatusChecker{}
+ mock.Mock.Test(t)
+
+ t.Cleanup(func() { mock.AssertExpectations(t) })
+
+ return mock
+}
diff --git a/core/services/relay/evm/statuschecker/txm_status_checker.go b/core/services/relay/evm/statuschecker/txm_status_checker.go
new file mode 100644
index 0000000000..f22e6d78b9
--- /dev/null
+++ b/core/services/relay/evm/statuschecker/txm_status_checker.go
@@ -0,0 +1,54 @@
+package statuschecker
+
+import (
+ "context"
+ "fmt"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+)
+
+// CCIPTransactionStatusChecker is an interface that defines the method for checking the status of a transaction.
+// CheckMessageStatus checks the status of a transaction for a given message ID.
+// It returns a list of transaction statuses, the retry counter, and an error if any occurred during the process.
+//
+
+type CCIPTransactionStatusChecker interface {
+ CheckMessageStatus(ctx context.Context, msgID string) (transactionStatuses []types.TransactionStatus, retryCounter int, err error)
+}
+
+type TxmStatusChecker struct {
+ getTransactionStatus func(ctx context.Context, transactionID string) (types.TransactionStatus, error)
+}
+
+func NewTxmStatusChecker(getTransactionStatus func(ctx context.Context, transactionID string) (types.TransactionStatus, error)) *TxmStatusChecker {
+ return &TxmStatusChecker{getTransactionStatus: getTransactionStatus}
+}
+
+// CheckMessageStatus checks the status of a message by checking the status of all transactions associated with the message ID.
+// It returns a slice of all statuses and the number of transactions found (-1 if none).
+// The key will follow the format: -. TXM will be queried for each key until a NotFound error is returned.
+// The goal is to find all transactions associated with a message ID and snooze messages if they are fatal in the Execution Plugin.
+func (tsc *TxmStatusChecker) CheckMessageStatus(ctx context.Context, msgID string) ([]types.TransactionStatus, int, error) {
+ var counter int
+ const maxStatuses = 1000 // Cap the number of statuses to avoid infinite loop
+
+ allStatuses := make([]types.TransactionStatus, 0)
+
+ for {
+ transactionID := fmt.Sprintf("%s-%d", msgID, counter)
+ status, err := tsc.getTransactionStatus(ctx, transactionID)
+ if err != nil && status == types.Unknown {
+ // If the status is unknown and err not nil, it means the transaction was not found
+ break
+ }
+ allStatuses = append(allStatuses, status)
+ counter++
+
+ // Break the loop if the cap is reached
+ if counter >= maxStatuses {
+ return allStatuses, counter - 1, fmt.Errorf("maximum number of statuses reached, possible infinite loop")
+ }
+ }
+
+ return allStatuses, counter - 1, nil
+}
diff --git a/core/services/relay/evm/statuschecker/txm_status_checker_test.go b/core/services/relay/evm/statuschecker/txm_status_checker_test.go
new file mode 100644
index 0000000000..456d07e7a7
--- /dev/null
+++ b/core/services/relay/evm/statuschecker/txm_status_checker_test.go
@@ -0,0 +1,103 @@
+package statuschecker
+
+import (
+ "context"
+ "errors"
+ "fmt"
+ "testing"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/mock"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/types"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/txmgr/mocks"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+)
+
+func Test_CheckMessageStatus(t *testing.T) {
+ testutils.SkipShort(t, "")
+ ctx := context.Background()
+ mockTxManager := mocks.NewMockEvmTxManager(t)
+ checker := NewTxmStatusChecker(mockTxManager.GetTransactionStatus)
+
+ msgID := "test-message-id"
+
+ // Define test cases
+ testCases := []struct {
+ name string
+ setupMock func()
+ expectedStatus []types.TransactionStatus
+ expectedCounter int
+ expectedError error
+ }{
+ {
+ name: "No transactions found",
+ setupMock: func() {
+ mockTxManager.Mock = mock.Mock{}
+ mockTxManager.On("GetTransactionStatus", ctx, "test-message-id-0").Return(types.Unknown, errors.New("failed to find transaction with IdempotencyKey test-message-id-0"))
+ },
+ expectedStatus: []types.TransactionStatus{},
+ expectedCounter: -1,
+ expectedError: nil,
+ },
+ {
+ name: "Single transaction found",
+ setupMock: func() {
+ mockTxManager.Mock = mock.Mock{}
+ mockTxManager.On("GetTransactionStatus", ctx, "test-message-id-0").Return(types.Finalized, nil)
+ mockTxManager.On("GetTransactionStatus", ctx, "test-message-id-1").Return(types.Unknown, errors.New("failed to find transaction with IdempotencyKey test-message-id-1"))
+ },
+ expectedStatus: []types.TransactionStatus{types.Finalized},
+ expectedCounter: 0,
+ expectedError: nil,
+ },
+ {
+ name: "Multiple transactions found",
+ setupMock: func() {
+ mockTxManager.Mock = mock.Mock{}
+ mockTxManager.On("GetTransactionStatus", ctx, "test-message-id-0").Return(types.Finalized, nil)
+ mockTxManager.On("GetTransactionStatus", ctx, "test-message-id-1").Return(types.Failed, nil)
+ mockTxManager.On("GetTransactionStatus", ctx, "test-message-id-2").Return(types.Unknown, errors.New("failed to find transaction with IdempotencyKey test-message-id-2"))
+ },
+ expectedStatus: []types.TransactionStatus{types.Finalized, types.Failed},
+ expectedCounter: 1,
+ expectedError: nil,
+ },
+ {
+ name: "Unknown status without nil (in progress)",
+ setupMock: func() {
+ mockTxManager.Mock = mock.Mock{}
+ mockTxManager.On("GetTransactionStatus", ctx, "test-message-id-0").Return(types.Unknown, nil)
+ mockTxManager.On("GetTransactionStatus", ctx, "test-message-id-1").Return(types.Unknown, errors.New("failed to find transaction with IdempotencyKey test-message-id-1"))
+ },
+ expectedStatus: []types.TransactionStatus{types.Unknown},
+ expectedCounter: 0,
+ expectedError: nil,
+ },
+ }
+
+ for _, tc := range testCases {
+ t.Run(tc.name, func(t *testing.T) {
+ tc.setupMock()
+ statuses, counter, err := checker.CheckMessageStatus(ctx, msgID)
+ assert.Equal(t, tc.expectedStatus, statuses)
+ assert.Equal(t, tc.expectedCounter, counter)
+ assert.Equal(t, tc.expectedError, err)
+ mockTxManager.AssertExpectations(t)
+ })
+ }
+}
+
+func Test_FailForMoreThan1000Retries(t *testing.T) {
+ ctx := context.Background()
+ mockTxManager := mocks.NewMockEvmTxManager(t)
+ checker := NewTxmStatusChecker(mockTxManager.GetTransactionStatus)
+
+ for i := 0; i < 1000; i++ {
+ mockTxManager.On("GetTransactionStatus", ctx, fmt.Sprintf("test-message-id-%d", i)).Return(types.Finalized, nil)
+ }
+
+ msgID := "test-message-id"
+ _, _, err := checker.CheckMessageStatus(ctx, msgID)
+ assert.EqualError(t, err, "maximum number of statuses reached, possible infinite loop")
+}
From cdb2d54831ebe0a5e0344ffb0eaad59199c4e851 Mon Sep 17 00:00:00 2001
From: dimitris
Date: Tue, 30 Jul 2024 19:44:54 +0300
Subject: [PATCH 06/28] Cleanup the ccip e2e test (#1231)
While reading the test some things were not obvious.
This PR has some small improvements.
---
.../ccipcapability/oraclecreator/inprocess.go | 5 +-
.../plugins/ccip_integration_tests/helpers.go | 34 +++---
.../ccip_integration_tests/ocr3_node_test.go | 111 ++++++++++--------
.../ccip_integration_tests/ocr_node_helper.go | 11 +-
4 files changed, 84 insertions(+), 77 deletions(-)
diff --git a/core/services/ccipcapability/oraclecreator/inprocess.go b/core/services/ccipcapability/oraclecreator/inprocess.go
index 0eaef462b5..594ff73a76 100644
--- a/core/services/ccipcapability/oraclecreator/inprocess.go
+++ b/core/services/ccipcapability/oraclecreator/inprocess.go
@@ -19,10 +19,11 @@ import (
"github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3types"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
+ cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
+
commitocr3 "github.com/smartcontractkit/chainlink-ccip/commit"
execocr3 "github.com/smartcontractkit/chainlink-ccip/execute"
ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader"
- cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
"github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
@@ -249,7 +250,7 @@ func (i *inprocessOracleCreator) CreatePluginOracle(pluginType cctypes.PluginTyp
return nil, fmt.Errorf("no transmitter found for dest relay ID %s, can't create contract transmitter", destRelayID)
}
- //TODO: Extract the correct transmitter address from the destsFromAccount
+ // TODO: Extract the correct transmitter address from the destsFromAccount
var factory ocr3types.ReportingPluginFactory[[]byte]
var transmitter ocr3types.ContractTransmitter[[]byte]
if config.Config.PluginType == uint8(cctypes.PluginTypeCCIPCommit) {
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/helpers.go b/core/services/ocr3/plugins/ccip_integration_tests/helpers.go
index 3e86d87ea0..10431e794a 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/helpers.go
+++ b/core/services/ocr3/plugins/ccip_integration_tests/helpers.go
@@ -93,11 +93,13 @@ type chainBase struct {
// 2. Deploys the CCIP contracts to all chains.
// 3. Sets up the initial configurations for the contracts on all chains.
// 4. Wires the chains together.
+//
+// Conceptually one universe is ONE chain with all the contracts deployed on it and all the dependencies initialized.
func createUniverses(
t *testing.T,
- numUniverses int,
+ numChains int,
) (homeChainUni homeChain, universes map[uint64]onchainUniverse) {
- chains := createChains(t, numUniverses)
+ chains := createChains(t, numChains)
homeChainBase, ok := chains[homeChainID]
require.True(t, ok, "home chain backend not available")
@@ -119,9 +121,9 @@ func createUniverses(
tokenAdminRegistry := deployTokenAdminRegistry(t, owner, backend, chainID)
nonceManager := deployNonceManager(t, owner, backend, chainID)
- //======================================================================
+ // ======================================================================
// OnRamp
- //======================================================================
+ // ======================================================================
onRampAddr, _, _, err := evm_2_evm_multi_onramp.DeployEVM2EVMMultiOnRamp(
owner,
backend,
@@ -134,7 +136,7 @@ func createUniverses(
evm_2_evm_multi_onramp.EVM2EVMMultiOnRampDynamicConfig{
Router: rout.Address(),
PriceRegistry: priceRegistry.Address(),
- //`withdrawFeeTokens` onRamp function is not part of the message flow
+ // `withdrawFeeTokens` onRamp function is not part of the message flow
// so we can set this to any address
FeeAggregator: testutils.NewAddress(),
},
@@ -144,9 +146,9 @@ func createUniverses(
onramp, err := evm_2_evm_multi_onramp.NewEVM2EVMMultiOnRamp(onRampAddr, backend)
require.NoError(t, err)
- //======================================================================
+ // ======================================================================
// OffRamp
- //======================================================================
+ // ======================================================================
offrampAddr, _, _, err := evm_2_evm_multi_offramp.DeployEVM2EVMMultiOffRamp(
owner,
backend,
@@ -506,25 +508,25 @@ func connectUniverses(
// 2. Set the price registry with local token prices
// 3. Authorize the onRamp and offRamp on the nonce manager
func setupUniverseBasics(t *testing.T, uni onchainUniverse) {
- //=============================================================================
+ // =============================================================================
// Universe specific updates/configs
// These updates are specific to each universe and are set up here
// These updates don't depend on other chains
- //=============================================================================
+ // =============================================================================
owner := uni.owner
- //=============================================================================
+ // =============================================================================
// Mint 1000 LINK to owner
- //=============================================================================
+ // =============================================================================
_, err := uni.linkToken.GrantMintRole(owner, owner.From)
require.NoError(t, err)
_, err = uni.linkToken.Mint(owner, owner.From, e18Mult(1000))
require.NoError(t, err)
uni.backend.Commit()
- //=============================================================================
+ // =============================================================================
// Price updates for tokens
// These are the prices of the fee tokens of local chain in USD
- //=============================================================================
+ // =============================================================================
tokenPriceUpdates := []price_registry.InternalTokenPriceUpdate{
{
SourceToken: uni.linkToken.Address(),
@@ -549,10 +551,10 @@ func setupUniverseBasics(t *testing.T, uni onchainUniverse) {
require.NoError(t, err, "failed to authorize offramp on price registry")
uni.backend.Commit()
- //=============================================================================
+ // =============================================================================
// Authorize OnRamp & OffRamp on NonceManager
// Otherwise the onramp will not be able to call the nonceManager to get next Nonce
- //=============================================================================
+ // =============================================================================
authorizedCallersAuthorizedCallerArgs := nonce_manager.AuthorizedCallersAuthorizedCallerArgs{
AddedCallers: []common.Address{
uni.onramp.Address(),
@@ -767,7 +769,7 @@ func deployPriceRegistry(
[]price_registry.PriceRegistryTokenTransferFeeConfigArgs{},
[]price_registry.PriceRegistryPremiumMultiplierWeiPerEthArgs{
{
- PremiumMultiplierWeiPerEth: 9e17, //0.9 ETH
+ PremiumMultiplierWeiPerEth: 9e17, // 0.9 ETH
Token: linkAddr,
},
{
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go b/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go
index 484ca82c29..81fe06153f 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go
+++ b/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go
@@ -10,6 +10,7 @@ import (
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/common"
"github.com/hashicorp/consul/sdk/freeport"
+ "go.uber.org/zap/zapcore"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ping_pong_demo"
@@ -18,7 +19,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
- "github.com/smartcontractkit/libocr/commontypes"
confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
ocrtypes "github.com/smartcontractkit/libocr/offchainreporting2plus/types"
@@ -26,27 +26,38 @@ import (
)
func TestIntegration_OCR3Nodes(t *testing.T) {
- numChains := 3
+ const (
+ numChains = 3 // number of chains that this test will run on
+ numNodes = 4 // number of OCR3 nodes, test assumes that every node supports every chain
+
+ simulatedBackendBlockTime = 900 * time.Millisecond // Simulated backend blocks committing interval
+ oraclesBootWaitTime = 30 * time.Second // Time to wait for oracles to come up (HACK)
+ fChain = 1 // fChain value for all the chains
+ oracleLogLevel = zapcore.InfoLevel // Log level for the oracle / plugins.
+ )
+
+ t.Logf("creating %d universes", numChains)
homeChainUni, universes := createUniverses(t, numChains)
- numNodes := 4
- t.Log("creating ocr3 nodes")
+
var (
oracles = make(map[uint64][]confighelper2.OracleIdentityExtra)
apps []chainlink.Application
nodes []*ocr3Node
p2pIDs [][32]byte
- // The bootstrap node will be the first node (index 0)
+ // The bootstrap node will be: nodes[0]
bootstrapPort int
bootstrapP2PID p2pkey.PeerID
- bootstrappers []commontypes.BootstrapperLocator
)
ports := freeport.GetN(t, numNodes)
+ ctx := testutils.Context(t)
+ callCtx := &bind.CallOpts{Context: ctx}
+
for i := 0; i < numNodes; i++ {
- node := setupNodeOCR3(t, ports[i], bootstrappers, universes, homeChainUni)
+ t.Logf("Setting up ocr3 node:%d at port:%d", i, ports[i])
+ node := setupNodeOCR3(t, ports[i], universes, homeChainUni, oracleLogLevel)
- apps = append(apps, node.app)
for chainID, transmitter := range node.transmitters {
identity := confighelper2.OracleIdentityExtra{
OracleIdentity: confighelper2.OracleIdentity{
@@ -59,94 +70,87 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
}
oracles[chainID] = append(oracles[chainID], identity)
}
+
+ apps = append(apps, node.app)
nodes = append(nodes, node)
+
peerID, err := p2pkey.MakePeerID(node.peerID)
require.NoError(t, err)
p2pIDs = append(p2pIDs, peerID)
-
- // First Node is the bootstrap node
- if i == 0 {
- bootstrapPort = ports[i]
- bootstrapP2PID = peerID
- bootstrappers = []commontypes.BootstrapperLocator{
- {PeerID: node.peerID, Addrs: []string{
- fmt.Sprintf("127.0.0.1:%d", bootstrapPort),
- }},
- }
- }
}
+ bootstrapPort = ports[0]
+ bootstrapP2PID = p2pIDs[0]
+ bootstrapAddr := fmt.Sprintf("127.0.0.1:%d", bootstrapPort)
+ t.Logf("[bootstrap node] peerID:%s p2pID:%d address:%s", nodes[0].peerID, bootstrapP2PID, bootstrapAddr)
+
// Start committing periodically in the background for all the chains
- tick := time.NewTicker(900 * time.Millisecond)
+ tick := time.NewTicker(simulatedBackendBlockTime)
defer tick.Stop()
commitBlocksBackground(t, universes, tick)
- ctx := testutils.Context(t)
-
- ccipCapabilityID, err := homeChainUni.capabilityRegistry.GetHashedCapabilityId(&bind.CallOpts{
- Context: ctx,
- }, CapabilityLabelledName, CapabilityVersion)
+ ccipCapabilityID, err := homeChainUni.capabilityRegistry.GetHashedCapabilityId(
+ callCtx, CapabilityLabelledName, CapabilityVersion)
require.NoError(t, err, "failed to get hashed capability id for ccip")
require.NotEqual(t, [32]byte{}, ccipCapabilityID, "ccip capability id is empty")
// Need to Add nodes and assign capabilities to them before creating DONS
homeChainUni.AddNodes(t, p2pIDs, [][32]byte{ccipCapabilityID})
- // Add homechain configs
for _, uni := range universes {
- AddChainConfig(t, homeChainUni, getSelector(uni.chainID), p2pIDs, 1)
+ t.Logf("Adding chainconfig for chain %d", uni.chainID)
+ AddChainConfig(t, homeChainUni, getSelector(uni.chainID), p2pIDs, fChain)
}
- cfgs, err3 := homeChainUni.ccipConfig.GetAllChainConfigs(&bind.CallOpts{})
- require.NoError(t, err3)
- t.Logf("homechain_configs %+v", cfgs)
+ cfgs, err := homeChainUni.ccipConfig.GetAllChainConfigs(callCtx)
+ require.NoError(t, err)
+ t.Logf("Got all homechain configs %#v", cfgs)
require.Len(t, cfgs, numChains)
// Create a DON for each chain
for _, uni := range universes {
// Add nodes and give them the capability
- t.Log("AddingDON for universe: ", uni.chainID)
+ t.Log("Adding DON for universe: ", uni.chainID)
chainSelector := getSelector(uni.chainID)
homeChainUni.AddDON(
t,
ccipCapabilityID,
chainSelector,
uni,
- 1, // f
+ fChain,
bootstrapP2PID,
p2pIDs,
oracles[uni.chainID],
)
}
- t.Log("creating ocr3 jobs")
+ t.Log("Creating ocr3 jobs, starting oracles")
for i := 0; i < len(nodes); i++ {
err1 := nodes[i].app.Start(ctx)
require.NoError(t, err1)
tApp := apps[i]
- t.Cleanup(func() {
- require.NoError(t, tApp.Stop())
- })
+ t.Cleanup(func() { require.NoError(t, tApp.Stop()) })
jb := mustGetJobSpec(t, bootstrapP2PID, bootstrapPort, nodes[i].peerID, nodes[i].keybundle.ID())
require.NoErrorf(t, tApp.AddJobV2(ctx, &jb), "Wasn't able to create ccip job for node %d", i)
}
- // sourceChain map[uint64], destChain [32]byte
- var messageIDs = make(map[uint64]map[uint64][32]byte)
- // map[uint64] chainID, blocks
- var replayBlocks = make(map[uint64]uint64)
+ t.Logf("Initializing PingPong contracts")
pingPongs := initializePingPongContracts(t, universes)
+ // NOTE: messageIDs are populated in the sendPingPong function
+ var messageIDs = make(map[uint64]map[uint64][32]byte) // sourceChain->destChain->messageID
+ var replayBlocks = make(map[uint64]uint64) // chainID -> blocksToReplay
+
+ t.Logf("Sending ping pong from each chain to each other")
sendPingPong(t, universes, pingPongs, messageIDs, replayBlocks, 1)
- // HACK: wait for the oracles to come up.
- // Need some data driven way to do this.
- time.Sleep(30 * time.Second)
- // replay the log poller on all the chains so that the logs are in the db.
+ // Wait for the oracles to come up.
+ // TODO: We need some data driven way to do this e.g. wait until LP filters to be registered.
+ time.Sleep(oraclesBootWaitTime)
+
+ // Replay the log poller on all the chains so that the logs are in the db.
// otherwise the plugins won't pick them up.
- // TODO: this is happening too early, we need to wait for the chain readers to get their config
- // and register the LP filters before this has any effect.
for _, node := range nodes {
for chainID, replayBlock := range replayBlocks {
t.Logf("Replaying logs for chain %d from block %d", chainID, replayBlock)
@@ -154,6 +158,7 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
}
}
+ // Wait for the commit reports to be generated and reported on all chains.
numUnis := len(universes)
var wg sync.WaitGroup
for _, uni := range universes {
@@ -164,15 +169,17 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
}(uni)
}
- t.Log("waiting for commit reports")
+ tStart := time.Now()
+ t.Log("Waiting for commit reports")
wg.Wait()
+ t.Logf("Commit reports received after %s", time.Since(tStart))
var preRequestBlocks = make(map[uint64]uint64)
for _, uni := range universes {
preRequestBlocks[uni.chainID] = uni.backend.Blockchain().CurrentBlock().Number.Uint64()
}
- t.Log("PingPong AGAIN")
+ t.Log("Sending ping pong from each chain to each other again for a second time")
sendPingPong(t, universes, pingPongs, messageIDs, replayBlocks, 2)
for _, uni := range universes {
@@ -184,8 +191,10 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
}(uni, &startBlock)
}
- t.Log("waiting for second batch of commit reports")
+ tStart = time.Now()
+ t.Log("Waiting for second batch of commit reports")
wg.Wait()
+ t.Logf("Second batch of commit reports received after %s", time.Since(tStart))
}
func sendPingPong(t *testing.T, universes map[uint64]onchainUniverse, pingPongs map[uint64]map[uint64]*ping_pong_demo.PingPongDemo, messageIDs map[uint64]map[uint64][32]byte, replayBlocks map[uint64]uint64, expectedSeqNum uint64) {
@@ -250,7 +259,7 @@ func sendPingPong(t *testing.T, universes map[uint64]onchainUniverse, pingPongs
func waitForCommit(t *testing.T, uni onchainUniverse, numUnis int, startBlock *uint64) {
sink := make(chan *evm_2_evm_multi_offramp.EVM2EVMMultiOffRampCommitReportAccepted)
- subscipriton, err := uni.offramp.WatchCommitReportAccepted(&bind.WatchOpts{
+ subscription, err := uni.offramp.WatchCommitReportAccepted(&bind.WatchOpts{
Start: startBlock,
Context: testutils.Context(t),
}, sink)
@@ -260,7 +269,7 @@ func waitForCommit(t *testing.T, uni onchainUniverse, numUnis int, startBlock *u
select {
case <-time.After(5 * time.Second):
t.Logf("Waiting for commit report on chain id %d (selector %d)", uni.chainID, getSelector(uni.chainID))
- case subErr := <-subscipriton.Err():
+ case subErr := <-subscription.Err():
t.Fatalf("Subscription error: %+v", subErr)
case report := <-sink:
if len(report.Report.MerkleRoots) > 0 {
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/ocr_node_helper.go b/core/services/ocr3/plugins/ccip_integration_tests/ocr_node_helper.go
index ece3a22f02..5a3efefd4f 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/ocr_node_helper.go
+++ b/core/services/ocr3/plugins/ccip_integration_tests/ocr_node_helper.go
@@ -42,8 +42,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/utils"
"github.com/smartcontractkit/chainlink/v2/plugins"
- "github.com/smartcontractkit/libocr/commontypes"
-
"github.com/stretchr/testify/require"
"go.uber.org/zap/zapcore"
)
@@ -61,9 +59,9 @@ type ocr3Node struct {
func setupNodeOCR3(
t *testing.T,
port int,
- p2pV2Bootstrappers []commontypes.BootstrapperLocator,
universes map[uint64]onchainUniverse,
homeChainUniverse homeChain,
+ logLevel zapcore.Level,
) *ocr3Node {
// Do not want to load fixtures as they contain a dummy chainID.
cfg, db := heavyweight.FullTestDBNoFixturesV2(t, func(c *chainlink.Config, s *chainlink.Secrets) {
@@ -76,9 +74,6 @@ func setupNodeOCR3(
c.P2P.V2.DeltaDial = config.MustNewDuration(500 * time.Millisecond)
c.P2P.V2.DeltaReconcile = config.MustNewDuration(5 * time.Second)
c.P2P.V2.ListenAddresses = &[]string{fmt.Sprintf("127.0.0.1:%d", port)}
- if len(p2pV2Bootstrappers) > 0 {
- c.P2P.V2.DefaultBootstrappers = &p2pV2Bootstrappers
- }
// Enable Capabilities, This is a pre-requisite for registrySyncer to work.
c.Capabilities.ExternalRegistry.NetworkID = ptr(relay.NetworkEVM)
@@ -91,7 +86,7 @@ func setupNodeOCR3(
c.OCR2.Enabled = ptr(true)
c.OCR2.ContractPollInterval = config.MustNewDuration(5 * time.Second)
- c.Log.Level = ptr(configv2.LogLevel(zapcore.InfoLevel))
+ c.Log.Level = ptr(configv2.LogLevel(logLevel))
var chains v2toml.EVMConfigs
for chainID := range universes {
@@ -101,7 +96,7 @@ func setupNodeOCR3(
})
lggr := logger.TestLogger(t)
- lggr.SetLogLevel(zapcore.InfoLevel)
+ lggr.SetLogLevel(logLevel)
ctx := testutils.Context(t)
clients := make(map[uint64]client.Client)
From 1a0aa233b4278f15b5c85f5178e1d5fa314e8806 Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Tue, 30 Jul 2024 20:09:41 +0200
Subject: [PATCH 07/28] Reduce diff with fork (#1228)
While merging ccip into chainlink, some of the diff doesn't appear to be
used. This PR cleans up some of the diff
---
contracts/.gitignore | 1 -
contracts/.solhintignore | 3 -
contracts/GNUmakefile | 11 --
contracts/hardhat.config.ts | 4 +-
contracts/src/v0.8/vendor/Context.sol | 23 ---
.../src/v0.8/vendor/IERC2771Recipient.sol | 36 -----
contracts/src/v0.8/vendor/Pausable.sol | 90 ------------
.../vendor/nomad-xyz/ExcessivelySafeCall.sol | 138 ------------------
8 files changed, 1 insertion(+), 305 deletions(-)
delete mode 100644 contracts/src/v0.8/vendor/Context.sol
delete mode 100644 contracts/src/v0.8/vendor/IERC2771Recipient.sol
delete mode 100644 contracts/src/v0.8/vendor/Pausable.sol
delete mode 100644 contracts/src/v0.8/vendor/nomad-xyz/ExcessivelySafeCall.sol
diff --git a/contracts/.gitignore b/contracts/.gitignore
index 07f65a44eb..ddfd43837d 100644
--- a/contracts/.gitignore
+++ b/contracts/.gitignore
@@ -1,5 +1,4 @@
artifacts
-foundry-artifacts
cache
node_modules
solc
diff --git a/contracts/.solhintignore b/contracts/.solhintignore
index ee9b9cf026..bad1935442 100644
--- a/contracts/.solhintignore
+++ b/contracts/.solhintignore
@@ -1,6 +1,3 @@
-# 377 warnings
-#./src/v0.8/automation
-
# Ignore frozen Automation code
./src/v0.8/automation/v1_2
./src/v0.8/automation/interfaces/v1_2
diff --git a/contracts/GNUmakefile b/contracts/GNUmakefile
index 026a5f47a4..0ebad8446e 100644
--- a/contracts/GNUmakefile
+++ b/contracts/GNUmakefile
@@ -88,17 +88,6 @@ wrappers-all: pnpmdep mockery abigen ## Recompiles solidity contracts and their
# go_generate contains a call to compile all contracts before generating wrappers
go generate ../core/gethwrappers/go_generate.go
-# Custom wrapper generation for OCR2VRF as their contracts do not exist in this repo
-.PHONY: go-solidity-wrappers-ocr2vrf
-go-solidity-wrappers-ocr2vrf: pnpmdep abigen ## Recompiles OCR2VRF solidity contracts and their go wrappers.
- ./scripts/native_solc_compile_all_ocr2vrf
- # replace the go:generate_disabled directive with the regular go:generate directive
- sed -i '' 's/go:generate_disabled/go:generate/g' ../core/gethwrappers/ocr2vrf/go_generate.go
- go generate ../core/gethwrappers/ocr2vrf
- go generate ../core/internal/mocks
- # put the go:generate_disabled directive back
- sed -i '' 's/go:generate/go:generate_disabled/g' ../core/gethwrappers/ocr2vrf/go_generate.go
-
help:
@echo ""
@echo " .__ .__ .__ .__ __"
diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts
index 04462c4d93..71419719d4 100644
--- a/contracts/hardhat.config.ts
+++ b/contracts/hardhat.config.ts
@@ -38,10 +38,8 @@ let config = {
paths: {
artifacts: './artifacts',
cache: './cache',
- // Only use sources relevant to CCIP, revert this when merging CCIP into the main repo.
sources: './src/v0.8',
- // Only test CCIP, revert this when merging CCIP into the main repo.
- tests: './test/v0.8/ccip',
+ tests: './test/v0.8',
},
typechain: {
outDir: './typechain',
diff --git a/contracts/src/v0.8/vendor/Context.sol b/contracts/src/v0.8/vendor/Context.sol
deleted file mode 100644
index 7aa3e480bc..0000000000
--- a/contracts/src/v0.8/vendor/Context.sol
+++ /dev/null
@@ -1,23 +0,0 @@
-// SPDX-License-Identifier: MIT
-
-pragma solidity ^0.8.0;
-
-/**
- * @dev Provides information about the current execution context, including the
- * sender of the transaction and its data. While these are generally available
- * via msg.sender and msg.data, they should not be accessed in such a direct
- * manner, since when dealing with meta-transactions the account sending and
- * paying for execution may not be the actual sender (as far as an application
- * is concerned).
- *
- * This contract is only required for intermediate, library-like contracts.
- */
-abstract contract Context {
- function _msgSender() internal view virtual returns (address) {
- return msg.sender;
- }
-
- function _msgData() internal view virtual returns (bytes calldata) {
- return msg.data;
- }
-}
\ No newline at end of file
diff --git a/contracts/src/v0.8/vendor/IERC2771Recipient.sol b/contracts/src/v0.8/vendor/IERC2771Recipient.sol
deleted file mode 100644
index 5c8328d8a4..0000000000
--- a/contracts/src/v0.8/vendor/IERC2771Recipient.sol
+++ /dev/null
@@ -1,36 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity >=0.6.0;
-
-/**
- * @title The ERC-2771 Recipient Base Abstract Class - Declarations
- *
- * @notice A contract must implement this interface in order to support relayed transaction.
- *
- * @notice It is recommended that your contract inherits from the ERC2771Recipient contract.
- */
-abstract contract IERC2771Recipient {
-
- /**
- * :warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.
- * @param forwarder The address of the Forwarder contract that is being used.
- * @return isTrustedForwarder `true` if the Forwarder is trusted to forward relayed transactions by this Recipient.
- */
- function isTrustedForwarder(address forwarder) public virtual view returns(bool);
-
- /**
- * @notice Use this method the contract anywhere instead of msg.sender to support relayed transactions.
- * @return sender The real sender of this call.
- * For a call that came through the Forwarder the real sender is extracted from the last 20 bytes of the `msg.data`.
- * Otherwise simply returns `msg.sender`.
- */
- function _msgSender() internal virtual view returns (address);
-
- /**
- * @notice Use this method in the contract instead of `msg.data` when difference matters (hashing, signature, etc.)
- * @return data The real `msg.data` of this call.
- * For a call that came through the Forwarder, the real sender address was appended as the last 20 bytes
- * of the `msg.data` - so this method will strip those 20 bytes off.
- * Otherwise (if the call was made directly and not through the forwarder) simply returns `msg.data`.
- */
- function _msgData() internal virtual view returns (bytes calldata);
-}
\ No newline at end of file
diff --git a/contracts/src/v0.8/vendor/Pausable.sol b/contracts/src/v0.8/vendor/Pausable.sol
deleted file mode 100644
index df5ed2ab63..0000000000
--- a/contracts/src/v0.8/vendor/Pausable.sol
+++ /dev/null
@@ -1,90 +0,0 @@
-// SPDX-License-Identifier: MIT
-
-pragma solidity ^0.8.0;
-
-import "./Context.sol";
-
-/**
- * @dev Contract module which allows children to implement an emergency stop
- * mechanism that can be triggered by an authorized account.
- *
- * This module is used through inheritance. It will make available the
- * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
- * the functions of your contract. Note that they will not be pausable by
- * simply including this module, only once the modifiers are put in place.
- */
-abstract contract Pausable is Context {
- /**
- * @dev Emitted when the pause is triggered by `account`.
- */
- event Paused(address account);
-
- /**
- * @dev Emitted when the pause is lifted by `account`.
- */
- event Unpaused(address account);
-
- bool private _paused;
-
- /**
- * @dev Initializes the contract in unpaused state.
- */
- constructor() {
- _paused = false;
- }
-
- /**
- * @dev Returns true if the contract is paused, and false otherwise.
- */
- function paused() public view virtual returns (bool) {
- return _paused;
- }
-
- /**
- * @dev Modifier to make a function callable only when the contract is not paused.
- *
- * Requirements:
- *
- * - The contract must not be paused.
- */
- modifier whenNotPaused() {
- require(!paused(), "Pausable: paused");
- _;
- }
-
- /**
- * @dev Modifier to make a function callable only when the contract is paused.
- *
- * Requirements:
- *
- * - The contract must be paused.
- */
- modifier whenPaused() {
- require(paused(), "Pausable: not paused");
- _;
- }
-
- /**
- * @dev Triggers stopped state.
- *
- * Requirements:
- *
- * - The contract must not be paused.
- */
- function _pause() internal virtual whenNotPaused {
- _paused = true;
- emit Paused(_msgSender());
- }
-
- /**
- * @dev Returns to normal state.
- *
- * Requirements:
- *
- * - The contract must be paused.
- */
- function _unpause() internal virtual whenPaused {
- _paused = false;
- emit Unpaused(_msgSender());
- }
-}
\ No newline at end of file
diff --git a/contracts/src/v0.8/vendor/nomad-xyz/ExcessivelySafeCall.sol b/contracts/src/v0.8/vendor/nomad-xyz/ExcessivelySafeCall.sol
deleted file mode 100644
index e7a9887eba..0000000000
--- a/contracts/src/v0.8/vendor/nomad-xyz/ExcessivelySafeCall.sol
+++ /dev/null
@@ -1,138 +0,0 @@
-// SPDX-License-Identifier: MIT OR Apache-2.0
-pragma solidity >=0.8.0;
-
-library ExcessivelySafeCall {
- uint256 constant LOW_28_MASK =
- 0x00000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
-
- /// @notice Use when you _really_ really _really_ don't trust the called
- /// contract. This prevents the called contract from causing reversion of
- /// the caller in as many ways as we can.
- /// @dev The main difference between this and a solidity low-level call is
- /// that we limit the number of bytes that the callee can cause to be
- /// copied to caller memory. This prevents stupid things like malicious
- /// contracts returning 10,000,000 bytes causing a local OOG when copying
- /// to memory.
- /// @param _target The address to call
- /// @param _gas The amount of gas to forward to the remote contract
- /// @param _value The value in wei to send to the remote contract
- /// @param _maxCopy The maximum number of bytes of returndata to copy
- /// to memory.
- /// @param _calldata The data to send to the remote contract
- /// @return success and returndata, as `.call()`. Returndata is capped to
- /// `_maxCopy` bytes.
- function excessivelySafeCall(
- address _target,
- uint256 _gas,
- uint256 _value,
- uint16 _maxCopy,
- bytes memory _calldata
- ) internal returns (bool, bytes memory) {
- // set up for assembly call
- uint256 _toCopy;
- bool _success;
- bytes memory _returnData = new bytes(_maxCopy);
- // dispatch message to recipient
- // by assembly calling "handle" function
- // we call via assembly to avoid memcopying a very large returndata
- // returned by a malicious contract
- assembly {
- _success := call(
- _gas, // gas
- _target, // recipient
- _value, // ether value
- add(_calldata, 0x20), // inloc
- mload(_calldata), // inlen
- 0, // outloc
- 0 // outlen
- )
- // limit our copy to 256 bytes
- _toCopy := returndatasize()
- if gt(_toCopy, _maxCopy) {
- _toCopy := _maxCopy
- }
- // Store the length of the copied bytes
- mstore(_returnData, _toCopy)
- // copy the bytes from returndata[0:_toCopy]
- returndatacopy(add(_returnData, 0x20), 0, _toCopy)
- }
- return (_success, _returnData);
- }
-
- /// @notice Use when you _really_ really _really_ don't trust the called
- /// contract. This prevents the called contract from causing reversion of
- /// the caller in as many ways as we can.
- /// @dev The main difference between this and a solidity low-level call is
- /// that we limit the number of bytes that the callee can cause to be
- /// copied to caller memory. This prevents stupid things like malicious
- /// contracts returning 10,000,000 bytes causing a local OOG when copying
- /// to memory.
- /// @param _target The address to call
- /// @param _gas The amount of gas to forward to the remote contract
- /// @param _maxCopy The maximum number of bytes of returndata to copy
- /// to memory.
- /// @param _calldata The data to send to the remote contract
- /// @return success and returndata, as `.call()`. Returndata is capped to
- /// `_maxCopy` bytes.
- function excessivelySafeStaticCall(
- address _target,
- uint256 _gas,
- uint16 _maxCopy,
- bytes memory _calldata
- ) internal view returns (bool, bytes memory) {
- // set up for assembly call
- uint256 _toCopy;
- bool _success;
- bytes memory _returnData = new bytes(_maxCopy);
- // dispatch message to recipient
- // by assembly calling "handle" function
- // we call via assembly to avoid memcopying a very large returndata
- // returned by a malicious contract
- assembly {
- _success := staticcall(
- _gas, // gas
- _target, // recipient
- add(_calldata, 0x20), // inloc
- mload(_calldata), // inlen
- 0, // outloc
- 0 // outlen
- )
- // limit our copy to 256 bytes
- _toCopy := returndatasize()
- if gt(_toCopy, _maxCopy) {
- _toCopy := _maxCopy
- }
- // Store the length of the copied bytes
- mstore(_returnData, _toCopy)
- // copy the bytes from returndata[0:_toCopy]
- returndatacopy(add(_returnData, 0x20), 0, _toCopy)
- }
- return (_success, _returnData);
- }
-
- /**
- * @notice Swaps function selectors in encoded contract calls
- * @dev Allows reuse of encoded calldata for functions with identical
- * argument types but different names. It simply swaps out the first 4 bytes
- * for the new selector. This function modifies memory in place, and should
- * only be used with caution.
- * @param _newSelector The new 4-byte selector
- * @param _buf The encoded contract args
- */
- function swapSelector(bytes4 _newSelector, bytes memory _buf)
- internal
- pure
- {
- require(_buf.length >= 4);
- uint256 _mask = LOW_28_MASK;
- assembly {
- // load the first word of
- let _word := mload(add(_buf, 0x20))
- // mask out the top 4 bytes
- // /x
- _word := and(_word, _mask)
- _word := or(_newSelector, _word)
- mstore(add(_buf, 0x20), _word)
- }
- }
-}
\ No newline at end of file
From 533a9b89f352957d8b1368676284581d1521d41b Mon Sep 17 00:00:00 2001
From: Anindita Ghosh <88458927+AnieeG@users.noreply.github.com>
Date: Tue, 30 Jul 2024 13:27:33 -0700
Subject: [PATCH 08/28] Avoid holding redundant state in memory (#1197)
---
.../ccip-tests/actions/ccip_helpers.go | 41 +++++++++++++------
.../ccip-tests/contracts/contract_models.go | 11 +++--
.../ccip-tests/load/ccip_loadgen.go | 11 +++--
3 files changed, 43 insertions(+), 20 deletions(-)
diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go
index 67dd80d7a9..ff318a26ef 100644
--- a/integration-tests/ccip-tests/actions/ccip_helpers.go
+++ b/integration-tests/ccip-tests/actions/ccip_helpers.go
@@ -2246,7 +2246,7 @@ func (destCCIP *DestCCIPModule) AssertNoExecutionStateChangedEventReceived(
destCCIP.ExecStateChangedWatcher.Range(func(_, value any) bool {
e, exists := value.(*contracts.EVM2EVMOffRampExecutionStateChanged)
if exists {
- vLogs := e.Raw
+ vLogs := e.LogInfo
hdr, err := destCCIP.Common.ChainClient.HeaderByNumber(ctx, big.NewInt(int64(vLogs.BlockNumber)))
if err != nil {
return true
@@ -2292,7 +2292,7 @@ func (destCCIP *DestCCIPModule) AssertEventExecutionStateChanged(
if exists {
// if the value is processed, delete it from the map
destCCIP.ExecStateChangedWatcher.Delete(seqNum)
- vLogs := e.Raw
+ vLogs := e.LogInfo
receivedAt := time.Now().UTC()
hdr, err := destCCIP.Common.ChainClient.HeaderByNumber(context.Background(), big.NewInt(int64(vLogs.BlockNumber)))
if err == nil {
@@ -2367,7 +2367,7 @@ func (destCCIP *DestCCIPModule) AssertEventReportAccepted(
// if the value is processed, delete it from the map
destCCIP.ReportAcceptedWatcher.Delete(seqNum)
receivedAt := time.Now().UTC()
- hdr, err := destCCIP.Common.ChainClient.HeaderByNumber(context.Background(), big.NewInt(int64(reportAccepted.Raw.BlockNumber)))
+ hdr, err := destCCIP.Common.ChainClient.HeaderByNumber(context.Background(), big.NewInt(int64(reportAccepted.LogInfo.BlockNumber)))
if err == nil {
receivedAt = hdr.Timestamp
}
@@ -2386,7 +2386,7 @@ func (destCCIP *DestCCIPModule) AssertEventReportAccepted(
Msg("ReportAccepted event received before finalized timestamp")
totalTime = time.Second
}
- receipt, err := destCCIP.Common.ChainClient.GetTxReceipt(reportAccepted.Raw.TxHash)
+ receipt, err := destCCIP.Common.ChainClient.GetTxReceipt(reportAccepted.LogInfo.TxHash)
if err != nil {
lggr.Warn().Msg("Failed to get receipt for ReportAccepted event")
}
@@ -2397,7 +2397,7 @@ func (destCCIP *DestCCIPModule) AssertEventReportAccepted(
reqStat.UpdateState(lggr, seqNum, testreporters.Commit, totalTime, testreporters.Success,
&testreporters.TransactionStats{
GasUsed: gasUsed,
- TxHash: reportAccepted.Raw.TxHash.String(),
+ TxHash: reportAccepted.LogInfo.TxHash.Hex(),
CommitRoot: fmt.Sprintf("%x", reportAccepted.MerkleRoot),
})
return reportAccepted, receivedAt, nil
@@ -2462,7 +2462,7 @@ func (destCCIP *DestCCIPModule) AssertReportBlessed(
value, ok = destCCIP.ReportBlessedBySeqNum.Load(seqNum)
}
if ok && value != nil {
- vLogs, exists := value.(*types.Log)
+ vLogs, exists := value.(*contracts.LogInfo)
if exists {
// if the root is found, set the value for all the sequence numbers in the interval and delete the root from the map
if foundAsRoot {
@@ -3337,8 +3337,11 @@ func (lane *CCIPLane) StartEventWatchers() error {
SequenceNumber: e.Message.SequenceNumber,
DataLength: len(e.Message.Data),
NoOfTokens: len(e.Message.TokenAmounts),
- Raw: e.Raw,
- Fee: e.Message.FeeTokenAmount,
+ LogInfo: contracts.LogInfo{
+ BlockNumber: e.Raw.BlockNumber,
+ TxHash: e.Raw.TxHash,
+ },
+ Fee: e.Message.FeeTokenAmount,
}))
} else {
lane.Source.CCIPSendRequestedWatcher.Store(e.Raw.TxHash.Hex(), []*contracts.SendReqEventData{
@@ -3347,8 +3350,11 @@ func (lane *CCIPLane) StartEventWatchers() error {
SequenceNumber: e.Message.SequenceNumber,
DataLength: len(e.Message.Data),
NoOfTokens: len(e.Message.TokenAmounts),
- Raw: e.Raw,
- Fee: e.Message.FeeTokenAmount,
+ LogInfo: contracts.LogInfo{
+ BlockNumber: e.Raw.BlockNumber,
+ TxHash: e.Raw.TxHash,
+ },
+ Fee: e.Message.FeeTokenAmount,
},
})
}
@@ -3382,7 +3388,10 @@ func (lane *CCIPLane) StartEventWatchers() error {
Min: e.Report.Interval.Min,
Max: e.Report.Interval.Max,
MerkleRoot: e.Report.MerkleRoot,
- Raw: e.Raw,
+ LogInfo: contracts.LogInfo{
+ BlockNumber: e.Raw.BlockNumber,
+ TxHash: e.Raw.TxHash,
+ },
})
}
lane.Dest.ReportAcceptedWatcher = testutils.DeleteNilEntriesFromMap(lane.Dest.ReportAcceptedWatcher)
@@ -3411,7 +3420,10 @@ func (lane *CCIPLane) StartEventWatchers() error {
case e := <-reportBlessedEvent:
lane.Logger.Info().Msgf("TaggedRootBlessed event received for root %x", e.TaggedRoot.Root)
if e.TaggedRoot.CommitStore == lane.Dest.CommitStore.EthAddress {
- lane.Dest.ReportBlessedWatcher.Store(e.TaggedRoot.Root, &e.Raw)
+ lane.Dest.ReportBlessedWatcher.Store(e.TaggedRoot.Root, &contracts.LogInfo{
+ BlockNumber: e.Raw.BlockNumber,
+ TxHash: e.Raw.TxHash,
+ })
}
lane.Dest.ReportBlessedWatcher = testutils.DeleteNilEntriesFromMap(lane.Dest.ReportBlessedWatcher)
case <-lane.Context.Done():
@@ -3443,7 +3455,10 @@ func (lane *CCIPLane) StartEventWatchers() error {
MessageId: e.MessageId,
State: e.State,
ReturnData: e.ReturnData,
- Raw: e.Raw,
+ LogInfo: contracts.LogInfo{
+ BlockNumber: e.Raw.BlockNumber,
+ TxHash: e.Raw.TxHash,
+ },
})
lane.Dest.ExecStateChangedWatcher = testutils.DeleteNilEntriesFromMap(lane.Dest.ExecStateChangedWatcher)
case <-lane.Context.Done():
diff --git a/integration-tests/ccip-tests/contracts/contract_models.go b/integration-tests/ccip-tests/contracts/contract_models.go
index 290d53c90e..661761ed27 100644
--- a/integration-tests/ccip-tests/contracts/contract_models.go
+++ b/integration-tests/ccip-tests/contracts/contract_models.go
@@ -48,6 +48,11 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/abihelpers"
)
+type LogInfo struct {
+ BlockNumber uint64
+ TxHash common.Hash
+}
+
// Name denotes a contract name
type Name string
@@ -955,7 +960,7 @@ type CommitStoreReportAccepted struct {
Min uint64
Max uint64
MerkleRoot [32]byte
- Raw types.Log
+ LogInfo LogInfo
}
type CommitStoreWrapper struct {
@@ -1496,7 +1501,7 @@ type SendReqEventData struct {
SequenceNumber uint64
DataLength int
NoOfTokens int
- Raw types.Log
+ LogInfo LogInfo
Fee *big.Int
}
@@ -2151,7 +2156,7 @@ type EVM2EVMOffRampExecutionStateChanged struct {
MessageId [32]byte
State uint8
ReturnData []byte
- Raw types.Log
+ LogInfo LogInfo
}
type MockAggregator struct {
diff --git a/integration-tests/ccip-tests/load/ccip_loadgen.go b/integration-tests/ccip-tests/load/ccip_loadgen.go
index e02f118095..4ed54a45fd 100644
--- a/integration-tests/ccip-tests/load/ccip_loadgen.go
+++ b/integration-tests/ccip-tests/load/ccip_loadgen.go
@@ -267,8 +267,11 @@ func (c *CCIPE2ELoad) Call(_ *wasp.Generator) *wasp.Response {
return res
}
+ // the msg is no longer needed, so we can clear it to avoid holding extra data during load
+ // nolint:ineffassign,staticcheck
+ msg = router.ClientEVM2AnyMessage{}
+
txConfirmationTime := time.Now().UTC()
- lggr.Info().Str("tx", sendTx.Hash().Hex()).Msg("waiting for tx to be mined")
lggr = lggr.With().Str("Msg Tx", sendTx.Hash().String()).Logger()
stats.UpdateState(&lggr, 0, testreporters.TX, txConfirmationTime.Sub(startTime), testreporters.Success, nil)
@@ -296,13 +299,13 @@ func (c *CCIPE2ELoad) Validate(lggr zerolog.Logger, sendTx *types.Transaction, t
// if the finality tag is enabled and the last finalized block is greater than the block number of the message
// consider the message finalized
if c.Lane.Source.Common.ChainClient.GetNetworkConfig().FinalityDepth == 0 &&
- lstFinalizedBlock != 0 && lstFinalizedBlock > msgLogs[0].Raw.BlockNumber {
+ lstFinalizedBlock != 0 && lstFinalizedBlock > msgLogs[0].LogInfo.BlockNumber {
sourceLogFinalizedAt = c.LastFinalizedTimestamp.Load()
for i, stat := range stats {
stat.UpdateState(&lggr, stat.SeqNum, testreporters.SourceLogFinalized,
sourceLogFinalizedAt.Sub(sourceLogTime), testreporters.Success,
&testreporters.TransactionStats{
- TxHash: msgLogs[i].Raw.TxHash.Hex(),
+ TxHash: msgLogs[i].LogInfo.TxHash.Hex(),
FinalizedByBlock: strconv.FormatUint(lstFinalizedBlock, 10),
FinalizedAt: sourceLogFinalizedAt.String(),
Fee: msgLogs[i].Fee.String(),
@@ -314,7 +317,7 @@ func (c *CCIPE2ELoad) Validate(lggr zerolog.Logger, sendTx *types.Transaction, t
} else {
var finalizingBlock uint64
sourceLogFinalizedAt, finalizingBlock, err = c.Lane.Source.AssertSendRequestedLogFinalized(
- &lggr, msgLogs[0].Raw.TxHash, msgLogs, sourceLogTime, stats)
+ &lggr, msgLogs[0].LogInfo.TxHash, msgLogs, sourceLogTime, stats)
if err != nil {
return err
}
From 89971a9cbe9f20763bb4bc5da050cd8920ebb1e9 Mon Sep 17 00:00:00 2001
From: amaechiokolobi <168412367+amaechiokolobi@users.noreply.github.com>
Date: Wed, 31 Jul 2024 02:26:49 +0100
Subject: [PATCH 09/28] bump chain selectors (#1216)
## Motivation
New Chain Selectors version requiring an update in CCIP
## Solution
From b972fe9a357047ca06be2aec17380001d70fa3bf Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Wed, 31 Jul 2024 11:38:53 +0200
Subject: [PATCH 10/28] always catch all errors in offRamp (#1229)
## Motivation
In line with the multiOffRamp
---------
Co-authored-by: Adam Hamrick
---
contracts/gas-snapshots/ccip.gas-snapshot | 52 +++++++++----------
.../src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol | 15 ++----
.../ccip/test/offRamp/EVM2EVMOffRamp.t.sol | 39 +++++++-------
.../evm_2_evm_offramp/evm_2_evm_offramp.go | 2 +-
...rapper-dependency-versions-do-not-edit.txt | 2 +-
.../ccip-tests/actions/ccip_helpers.go | 27 ++--------
.../ccip-tests/smoke/ccip_test.go | 13 ++---
7 files changed, 59 insertions(+), 91 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 5fc99a9a40..40f4514f26 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -301,40 +301,40 @@ EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_R
EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 214151)
EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 306912)
EVM2EVMOffRamp__report:test_Report_Success() (gas: 127459)
-EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 255047)
-EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 263638)
-EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 335707)
+EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 254710)
+EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 263301)
+EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 334438)
EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 314443)
EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17009)
-EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153427)
-EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5464875)
-EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 144183)
+EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153241)
+EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5337708)
+EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143997)
EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21345)
-EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36442)
+EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36486)
EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51701)
-EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473575)
+EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473216)
EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 46423)
EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152453)
-EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101458)
-EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 165036)
-EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177824)
+EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101503)
+EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 164818)
+EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177584)
EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317)
-EVM2EVMOffRamp_execute:test_RouterYULCall_Revert() (gas: 402506)
EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159387)
-EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 174622)
+EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 174600)
EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248634)
-EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115017)
-EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409338)
+EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115040)
+EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409316)
EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54173)
EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132056)
-EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52200)
+EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52178)
EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 560178)
-EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 499424)
-EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35442)
+EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 499466)
+EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35486)
EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546987)
-EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64045)
+EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64023)
EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123223)
-EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 143388)
+EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 143411)
+EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 428233)
EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20582)
EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 281891)
EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20231)
@@ -351,15 +351,15 @@ EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131682)
EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408)
EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556)
EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091)
-EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 483328)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186413)
+EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 483110)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 185977)
EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25824)
EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43449)
EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25927)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188518)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187965)
-EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2027441)
-EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143803)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188300)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187747)
+EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2027223)
+EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143585)
EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871)
EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429)
EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38804)
diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
index 1aec436ef8..f371998004 100644
--- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
@@ -435,18 +435,9 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
) internal returns (Internal.MessageExecutionState, bytes memory) {
try this.executeSingleMessage(message, offchainTokenData) {}
catch (bytes memory err) {
- if (
- ReceiverError.selector == bytes4(err) || TokenHandlingError.selector == bytes4(err)
- || Internal.InvalidEVMAddress.selector == bytes4(err) || InvalidDataLength.selector == bytes4(err)
- || CallWithExactGas.NoContract.selector == bytes4(err) || NotACompatiblePool.selector == bytes4(err)
- ) {
- // If CCIP receiver execution is not successful, bubble up receiver revert data,
- // prepended by the 4 bytes of ReceiverError.selector, TokenHandlingError.selector or InvalidPoolAddress.selector.
- // Max length of revert data is Router.MAX_RET_BYTES, max length of err is 4 + Router.MAX_RET_BYTES
- return (Internal.MessageExecutionState.FAILURE, err);
- }
- // If revert is not caused by CCIP receiver, it is unexpected, bubble up the revert.
- revert ExecutionError(err);
+ // return the message execution state as FAILURE and the revert data
+ // Max length of revert data is Router.MAX_RET_BYTES, max length of err is 4 + Router.MAX_RET_BYTES
+ return (Internal.MessageExecutionState.FAILURE, err);
}
// If message execution succeeded, no CCIP receiver return data is expected, return with empty bytes.
return (Internal.MessageExecutionState.SUCCESS, "");
diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
index e94184e3c5..3813ef042d 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
@@ -611,6 +611,27 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup {
s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0));
}
+ function test_execute_RouterYULCall_Success() public {
+ Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage();
+
+ // gas limit too high, Router's external call should revert
+ messages[0].gasLimit = 1e36;
+ messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken));
+ messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash());
+
+ Internal.ExecutionReport memory executionReport = _generateReportFromMessages(messages);
+
+ vm.expectEmit();
+ emit EVM2EVMOffRamp.ExecutionStateChanged(
+ messages[0].sequenceNumber,
+ messages[0].messageId,
+ Internal.MessageExecutionState.FAILURE,
+ abi.encodeWithSelector(CallWithExactGas.NotEnoughGasForCall.selector)
+ );
+
+ s_offRamp.execute(executionReport, new uint256[](0));
+ }
+
// Reverts
function test_InvalidMessageId_Revert() public {
@@ -723,24 +744,6 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup {
s_offRamp.execute(executionReport, new uint256[](0));
}
- function test_RouterYULCall_Revert() public {
- Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage();
-
- // gas limit too high, Router's external call should revert
- messages[0].gasLimit = 1e36;
- messages[0].receiver = address(new ConformingReceiver(address(s_destRouter), s_destFeeToken));
- messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash());
-
- Internal.ExecutionReport memory executionReport = _generateReportFromMessages(messages);
-
- vm.expectRevert(
- abi.encodeWithSelector(
- EVM2EVMOffRamp.ExecutionError.selector, abi.encodeWithSelector(CallWithExactGas.NotEnoughGasForCall.selector)
- )
- );
- s_offRamp.execute(executionReport, new uint256[](0));
- }
-
function test_RetryFailedMessageWithoutManualExecution_Revert() public {
Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage();
diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
index e4f47eb0a5..31b51f977f 100644
--- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
+++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
@@ -107,7 +107,7 @@ type RateLimiterTokenBucket struct {
var EVM2EVMOffRampMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"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\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"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\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"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\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101a06040523480156200001257600080fd5b5060405162006213380380620062138339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051615b4a620006c9600039600081816102ec01528181611b1201526133890152600081816102bd01528181611aeb0152611d9d01526000818161028e01528181610ed201528181610f3701528181611ac40152818161234501526123af01526000611f3c01526000818161025f0152611a9a0152600081816101ff0152611a4801526000818161022f01528181611a7201528181611d5a01528181612dc101526134980152600081816101d001528181611a1a015261201c015260008181611cb40152611d000152615b4a6000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063f077b59211610066578063f077b59214610646578063f2fde38b1461065c578063f52121a51461066f57600080fd5b8063afcb95d714610600578063b1dc65a414610620578063c92b28321461063357600080fd5b8063856c8247116100bd578063856c8247146105b0578063873504d7146105dc5780638da5cb5b146105ef57600080fd5b806381ff70481461057257806385572ffb146105a257600080fd5b8063599f64311161013a578063740f415011610114578063740f4150146104615780637437ff9f1461047457806379ba50971461056a57600080fd5b8063599f643114610414578063666cab8d14610439578063704b6c021461044e57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b578063546719cd146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161032991906141e7565b60405180910390f35b61034561034036600461427d565b610682565b60405161032991906142dd565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b604051610329919061433b565b6103ae6103a93660046145aa565b6106fd565b005b6103b8610af1565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610441610ba6565b60405161032991906146bc565b6103ae61045c3660046146cf565b610c08565b6103ae61046f366004614b2f565b610cd1565b61055d6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506040805160e081018252600a5463ffffffff808216835264010000000082048116602084015261ffff68010000000000000000830416938301939093526001600160a01b036a010000000000000000000090910481166060830152600b549081166080830152740100000000000000000000000000000000000000008104831660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290565b6040516103299190614bea565b6103ae610dc3565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae610182366004614c58565b6105c36105be3660046146cf565b610ea6565b60405167ffffffffffffffff9091168152602001610329565b6103ae6105ea366004614d24565b610fa9565b6000546001600160a01b0316610421565b604080516001815260006020820181905291810191909152606001610329565b6103ae61062e366004614dcd565b611177565b6103ae610641366004614ed2565b611382565b61064e6113ed565b604051610329929190614f22565b6103ae61066a3660046146cf565b611513565b6103ae61067d366004614f47565b611524565b600061069060016004614fd0565b600261069d608085615012565b67ffffffffffffffff166106b19190615039565b601060006106c0608087615050565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106f7576106f761429a565b92915050565b84518460ff16601f82111561074a5760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190615077565b60405180910390fd5b806000036107875760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190615077565b61078f6117c4565b6107988561183a565b60095460005b8181101561080f5760086000600983815481106107bd576107bd615091565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161079e565b5050865160005b818110156109b257600089828151811061083257610832615091565b602002602001015190506000600281111561084f5761084f61429a565b6001600160a01b038216600090815260086020526040902054610100900460ff1660028111156108815761088161429a565b146108bb5760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190615077565b6001600160a01b0381166108fb576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561099e5761099e61429a565b021790555090505050806001019050610816565b5087516109c69060099060208b0190614155565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a161717905560078054610a4c914691309190600090610a1e9063ffffffff166150c0565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611b72565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610add9487949293918316921691909117908f908f908f908f908f908f906150e3565b60405180910390a150505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610ba190611bff565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610bfe57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610be0575b5050505050905090565b6000546001600160a01b03163314801590610c2e57506002546001600160a01b03163314155b15610c65576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b610cd9611cb1565b81515181518114610d16576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610db3576000838281518110610d3557610d35615091565b6020026020010151905080600014610daa578451805183908110610d5b57610d5b615091565b602002602001015160800151811015610daa576040517f085e39cf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610741565b50600101610d19565b50610dbe8383611d32565b505050565b6001546001600160a01b03163314610e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610741565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106f7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106f7576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa29190615179565b9392505050565b610fb16117c4565b60005b825181101561108457610fee838281518110610fd257610fd2615091565b602002602001015160200151600c6127b590919063ffffffff16565b1561107c577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d5878283828151811061102657611026615091565b60200260200101516000015184838151811061104457611044615091565b6020026020010151602001516040516110739291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101610fb4565b5060005b8151811015610dbe576110e18282815181106110a6576110a6615091565b6020026020010151602001518383815181106110c4576110c4615091565b602002602001015160000151600c6127ca9092919063ffffffff16565b1561116f577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a82828151811061111957611119615091565b60200260200101516000015183838151811061113757611137615091565b6020026020010151602001516040516111669291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611088565b61118187876127e8565b6005548835908082146111ca576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610741565b6111d2611cb1565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561125a5761125a61429a565b600281111561126b5761126b61429a565b90525090506002816020015160028111156112885761128861429a565b1480156112c257506009816000015160ff16815481106112aa576112aa615091565b6000918252602090912001546001600160a01b031633145b6112f8576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611306856020615039565b611311886020615039565b61131d8b610144615196565b6113279190615196565b6113319190615196565b9050368114611375576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610741565b5050505050505050505050565b6000546001600160a01b031633148015906113a857506002546001600160a01b03163314155b156113df576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113ea60038261280f565b50565b60608060006113fc600c6129f4565b90508067ffffffffffffffff8111156114175761141761434e565b604051908082528060200260200182016040528015611440578160200160208202803683370190505b5092508067ffffffffffffffff81111561145c5761145c61434e565b604051908082528060200260200182016040528015611485578160200160208202803683370190505b50915060005b8181101561150d576000806114a1600c846129ff565b91509150808684815181106114b8576114b8615091565b60200260200101906001600160a01b031690816001600160a01b031681525050818584815181106114eb576114eb615091565b6001600160a01b0390921660209283029190910190910152505060010161148b565b50509091565b61151b6117c4565b6113ea81612a1d565b33301461155d576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516000808252602082019092528161159a565b60408051808201909152600080825260208201528152602001906001900390816115735790505b5061014084015151909150156115fa576115f783610140015184602001516040516020016115d791906001600160a01b0391909116815260200190565b604051602081830303815290604052856040015186610160015186612af8565b90505b6101208301515115801561161057506080830151155b80611627575060408301516001600160a01b03163b155b8061166757506040830151611665906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612c29565b155b1561167157505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808861018001518152602001886000015167ffffffffffffffff16815260200188602001516040516020016116e991906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001886101200151815260200186815250611388886080015189604001516040518563ffffffff1660e01b815260040161173894939291906151ee565b6000604051808303816000875af1158015611757573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261177f91908101906152f8565b5091509150816117bd57806040517f0a8d6e8c000000000000000000000000000000000000000000000000000000008152600401610741919061433b565b5050505050565b6000546001600160a01b03163314611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610741565b565b6000818060200190518101906118509190615371565b60608101519091506001600160a01b0316611897576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a80546020808501516040808701516060808901516001600160a01b039081166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff61ffff9094166801000000000000000002939093167fffff00000000000000000000000000000000000000000000ffffffffffffffff63ffffffff968716640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009099169a87169a909a1797909717989098169590951717909455608080870151600b805460a0808b015160c0808d015188167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9290981674010000000000000000000000000000000000000000027fffffffffffffffff000000000000000000000000000000000000000000000000909416958c16959095179290921791909116949094179055855160e0810187527f00000000000000000000000000000000000000000000000000000000000000008816815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848701527f00000000000000000000000000000000000000000000000000000000000000008716948401949094527f00000000000000000000000000000000000000000000000000000000000000008616908301527f00000000000000000000000000000000000000000000000000000000000000008516908201527f000000000000000000000000000000000000000000000000000000000000000090931690830152517ff02fcc22535d64d92d17b995475893d63edd51da163fed74a6ee9b4bc4895cc491611b6691849061540c565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611b96999897969594939291906154e8565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c8d82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611c719190614fd0565b85608001516fffffffffffffffffffffffffffffffff16612c45565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b467f000000000000000000000000000000000000000000000000000000000000000014611838576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610741565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e109190615570565b15611e47576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611e84576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611ec2576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611edd57611edd61434e565b604051908082528060200260200182016040528015611f06578160200160208202803683370190505b50905060005b82811015611fde57600085600001518281518110611f2c57611f2c615091565b60200260200101519050611f60817f0000000000000000000000000000000000000000000000000000000000000000612c64565b838381518110611f7257611f72615091565b602002602001018181525050806101800151838381518110611f9657611f96615091565b602002602001015114611fd5576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611f0c565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592612052928792916004016155be565b602060405180830381865afa15801561206f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209391906155f4565b9050806000036120cf576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156127ac576000876000015182815181106120f6576120f6615091565b60200260200101519050600061210f8260600151610682565b905060028160038111156121255761212561429a565b0361216c57816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a250506127a4565b60008160038111156121805761218061429a565b148061219d5750600381600381111561219b5761219b61429a565b145b6121e55760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b83156122a257600a5460009063ffffffff166122018742614fd0565b11905080806122215750600382600381111561221f5761221f61429a565b145b612257576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061226957612269615091565b602002602001015160001461229c5788848151811061228a5761228a615091565b60200260200101518360800181815250505b506122ff565b60008160038111156122b6576122b661429a565b146122ff5760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b60c082015167ffffffffffffffff161561257e576020808301516001600160a01b03166000908152600f909152604081205467ffffffffffffffff16908190036124e9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156124e95760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156123f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241c9190615179565b60c084015190915067ffffffffffffffff1661243982600161560d565b67ffffffffffffffff16146124995782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a35050506127a4565b6020838101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b60008260038111156124fd576124fd61429a565b0361257c5760c083015167ffffffffffffffff1661251c82600161560d565b67ffffffffffffffff161461257c5782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a35050506127a4565b505b60008960200151848151811061259657612596615091565b602002602001015190506125c28360600151846000015185610140015151866101200151518551612dbf565b6125d183606001516001612f39565b6000806125de8584612fe3565b915091506125f0856060015183612f39565b861561265c57600382600381111561260a5761260a61429a565b0361265c5760008460038111156126235761262361429a565b1461265c57806040517fcf19edfd000000000000000000000000000000000000000000000000000000008152600401610741919061433b565b60028260038111156126705761267061429a565b146126c85760038260038111156126895761268961429a565b146126c8578460600151826040517f9e26160300000000000000000000000000000000000000000000000000000000815260040161074192919061562e565b60c085015167ffffffffffffffff16156127505760008460038111156126f0576126f061429a565b03612750576020808601516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff16916127288361564c565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef658484604051612796929190615669565b60405180910390a350505050505b6001016120d6565b50505050505050565b6000610fa2836001600160a01b0384166132d6565b60006127e0846001600160a01b038516846132e2565b949350505050565b61280b6127f782840184615689565b604080516000815260208101909152611d32565b5050565b815460009061283890700100000000000000000000000000000000900463ffffffff1642614fd0565b905080156128da5760018301548354612880916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612c45565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612900916fffffffffffffffffffffffffffffffff90811691166132f8565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906129e79084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106f78261330e565b6000808080612a0e8686613319565b909450925050505b9250929050565b336001600160a01b03821603612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610741565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612c0e57612b75888281518110612b1b57612b1b615091565b6020026020010151602001518888888581518110612b3b57612b3b615091565b6020026020010151806020019051810190612b5691906156be565b888681518110612b6857612b68615091565b6020026020010151613328565b838281518110612b8757612b87615091565b6020026020010181905250612bc3838281518110612ba757612ba7615091565b602002602001015160000151600c61374b90919063ffffffff16565b15612c0657612bf9838281518110612bdd57612bdd615091565b6020908102919091010151600b546001600160a01b0316613760565b612c039083615196565b91505b600101612afd565b508015612c1e57612c1e81613881565b505b95945050505050565b6000612c348361388e565b8015610fa25750610fa283836138f2565b6000612c2085612c558486615039565b612c5f9087615196565b6132f8565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612cfa9897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612d339190615773565b60405160208183030381529060405280519060200120876101600151604051602001612d5f91906157e0565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612e38576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610741565b600a5468010000000000000000900461ffff16831115612e90576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610741565b808314612ed5576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610741565b600a54640100000000900463ffffffff168211156117bd57600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff16600482015260248101839052604401610741565b60006002612f48608085615012565b67ffffffffffffffff16612f5c9190615039565b90506000601081612f6e608087615050565b67ffffffffffffffff168152602081019190915260400160002054905081612f9860016004614fd0565b901b191681836003811115612faf57612faf61429a565b901b178060106000612fc2608088615050565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061302790879087906004016157f3565b600060405180830381600087803b15801561304157600080fd5b505af1925050508015613052575060015b6132bb573d808015613080576040519150601f19603f3d011682016040523d82523d6000602084013e613085565b606091505b5061308f81615956565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0a8d6e8c00000000000000000000000000000000000000000000000000000000148061312757506130e281615956565b7fffffffff00000000000000000000000000000000000000000000000000000000167fe1cd550900000000000000000000000000000000000000000000000000000000145b8061317b575061313681615956565b7fffffffff00000000000000000000000000000000000000000000000000000000167f8d666f6000000000000000000000000000000000000000000000000000000000145b806131cf575061318a81615956565b7fffffffff00000000000000000000000000000000000000000000000000000000167f78ef802400000000000000000000000000000000000000000000000000000000145b8061322357506131de81615956565b7fffffffff00000000000000000000000000000000000000000000000000000000167f0c3b563c00000000000000000000000000000000000000000000000000000000145b80613277575061323281615956565b7fffffffff00000000000000000000000000000000000000000000000000000000167fae9b4ce900000000000000000000000000000000000000000000000000000000145b1561328757600392509050612a16565b806040517fcf19edfd000000000000000000000000000000000000000000000000000000008152600401610741919061433b565b50506040805160208101909152600081526002909250929050565b6000610fa283836139c1565b60006127e084846001600160a01b0385166139de565b60008183106133075781610fa2565b5090919050565b60006106f7826139fb565b6000808080612a0e8686613a06565b6040805180820190915260008082526020820152600061334b8460200151613a31565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa1580156133d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f491906159a6565b90506001600160a01b038116158061343c575061343a6001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612c29565b155b1561347e576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610741565b6000806135986040518061010001604052808b81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018a6001600160a01b031681526020018c8152602001866001600160a01b0316815260200189600001518152602001896040015181526020018881525060405160240161351291906159c3565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3907753700000000000000000000000000000000000000000000000000000000179052600b54859063ffffffff74010000000000000000000000000000000000000000909104166113886084613ad7565b5091509150816135d657806040517fe1cd5509000000000000000000000000000000000000000000000000000000008152600401610741919061433b565b805160201461361e5780516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610741565b60008180602001905181019061363491906155f4565b6040516001600160a01b038b166024820152604481018290529091506136e19060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052600b54879063ffffffff7801000000000000000000000000000000000000000000000000909104166113886084613ad7565b5090935091508261372057816040517fe1cd5509000000000000000000000000000000000000000000000000000000008152600401610741919061433b565b604080518082019091526001600160a01b039095168552602085015250919250505095945050505050565b6000610fa2836001600160a01b038416613bfd565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa1580156137c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137ea9190615a9a565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036138535783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610741565b60208401516127e0907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690613c09565b6113ea6003826000613c46565b60006138ba827f01ffc9a7000000000000000000000000000000000000000000000000000000006138f2565b80156106f757506138eb827fffffffff000000000000000000000000000000000000000000000000000000006138f2565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156139aa575060208210155b80156139b65750600081115b979650505050505050565b60008181526002830160205260408120819055610fa28383613f95565b600082815260028401602052604081208290556127e08484613fa1565b60006106f782613fad565b60008080613a148585613fb7565b600081815260029690960160205260409095205494959350505050565b60008151602014613a7057816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610741919061433b565b600082806020019051810190613a8691906155f4565b90506001600160a01b03811180613a9e575061040081105b156106f757826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610741919061433b565b6000606060008361ffff1667ffffffffffffffff811115613afa57613afa61434e565b6040519080825280601f01601f191660200182016040528015613b24576020820181803683370190505b509150863b613b57577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613b8a577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613bc3577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613be65750835b808352806000602085013e50955095509592505050565b6000610fa28383613fc3565b6000670de0b6b3a7640000613c3c837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616615039565b610fa29190615afa565b825474010000000000000000000000000000000000000000900460ff161580613c6d575081155b15613c7757505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613cbd90700100000000000000000000000000000000900463ffffffff1642614fd0565b90508015613d7d5781831115613cff576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613d399083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612c45565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613e1a576001600160a01b038416613dcf576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610741565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610741565b84831015613f135760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613e5e9082614fd0565b613e68878a614fd0565b613e729190615196565b613e7c9190615afa565b90506001600160a01b038616613ec8576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610741565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610741565b613f1d8584614fd0565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610fa28383613fe2565b6000610fa283836140dc565b60006106f7825490565b6000610fa2838361412b565b6000610fa2838360008181526001830160205260408120541515610fa2565b600081815260018301602052604081205480156140cb576000614006600183614fd0565b855490915060009061401a90600190614fd0565b905081811461407f57600086600001828154811061403a5761403a615091565b906000526020600020015490508087600001848154811061405d5761405d615091565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061409057614090615b0e565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f7565b60009150506106f7565b5092915050565b6000818152600183016020526040812054614123575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f7565b5060006106f7565b600082600001828154811061414257614142615091565b9060005260206000200154905092915050565b8280548282559060005260206000209081019282156141c2579160200282015b828111156141c257825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190614175565b506141ce9291506141d2565b5090565b5b808211156141ce57600081556001016141d3565b60e081016106f782846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff811681146113ea57600080fd5b803561427881614257565b919050565b60006020828403121561428f57600080fd5b8135610fa281614257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106142d9576142d961429a565b9052565b602081016106f782846142c9565b60005b838110156143065781810151838201526020016142ee565b50506000910152565b600081518084526143278160208601602086016142eb565b601f01601f19169290920160200192915050565b602081526000610fa2602083018461430f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156143a0576143a061434e565b60405290565b6040516101a0810167ffffffffffffffff811182821017156143a0576143a061434e565b6040516080810167ffffffffffffffff811182821017156143a0576143a061434e565b6040516060810167ffffffffffffffff811182821017156143a0576143a061434e565b60405160e0810167ffffffffffffffff811182821017156143a0576143a061434e565b604051601f8201601f1916810167ffffffffffffffff8111828210171561445c5761445c61434e565b604052919050565b600067ffffffffffffffff82111561447e5761447e61434e565b5060051b60200190565b6001600160a01b03811681146113ea57600080fd5b803561427881614488565b600082601f8301126144b957600080fd5b813560206144ce6144c983614464565b614433565b8083825260208201915060208460051b8701019350868411156144f057600080fd5b602086015b8481101561451557803561450881614488565b83529183019183016144f5565b509695505050505050565b803560ff8116811461427857600080fd5b600067ffffffffffffffff82111561454b5761454b61434e565b50601f01601f191660200190565b600082601f83011261456a57600080fd5b81356145786144c982614531565b81815284602083860101111561458d57600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c087890312156145c357600080fd5b863567ffffffffffffffff808211156145db57600080fd5b6145e78a838b016144a8565b975060208901359150808211156145fd57600080fd5b6146098a838b016144a8565b965061461760408a01614520565b9550606089013591508082111561462d57600080fd5b6146398a838b01614559565b945061464760808a0161426d565b935060a089013591508082111561465d57600080fd5b5061466a89828a01614559565b9150509295509295509295565b60008151808452602080850194506020840160005b838110156146b15781516001600160a01b03168752958201959082019060010161468c565b509495945050505050565b602081526000610fa26020830184614677565b6000602082840312156146e157600080fd5b8135610fa281614488565b80151581146113ea57600080fd5b8035614278816146ec565b600082601f83011261471657600080fd5b813560206147266144c983614464565b82815260069290921b8401810191818101908684111561474557600080fd5b8286015b8481101561451557604081890312156147625760008081fd5b61476a61437d565b813561477581614488565b81528185013585820152835291830191604001614749565b600082601f83011261479e57600080fd5b813560206147ae6144c983614464565b82815260059290921b840181019181810190868411156147cd57600080fd5b8286015b8481101561451557803567ffffffffffffffff8111156147f15760008081fd5b6147ff8986838b0101614559565b8452509183019183016147d1565b60006101a0828403121561482057600080fd5b6148286143a6565b90506148338261426d565b81526148416020830161449d565b60208201526148526040830161449d565b60408201526148636060830161426d565b60608201526080820135608082015261487e60a083016146fa565b60a082015261488f60c0830161426d565b60c08201526148a060e0830161449d565b60e082015261010082810135908201526101208083013567ffffffffffffffff808211156148cd57600080fd5b6148d986838701614559565b838501526101409250828501359150808211156148f557600080fd5b61490186838701614705565b8385015261016092508285013591508082111561491d57600080fd5b5061492a8582860161478d565b82840152505061018080830135818301525092915050565b600082601f83011261495357600080fd5b813560206149636144c983614464565b82815260059290921b8401810191818101908684111561498257600080fd5b8286015b8481101561451557803567ffffffffffffffff8111156149a65760008081fd5b6149b48986838b010161478d565b845250918301918301614986565b600082601f8301126149d357600080fd5b813560206149e36144c983614464565b8083825260208201915060208460051b870101935086841115614a0557600080fd5b602086015b848110156145155780358352918301918301614a0a565b600060808284031215614a3357600080fd5b614a3b6143ca565b9050813567ffffffffffffffff80821115614a5557600080fd5b818401915084601f830112614a6957600080fd5b81356020614a796144c983614464565b82815260059290921b84018101918181019088841115614a9857600080fd5b8286015b84811015614ad057803586811115614ab45760008081fd5b614ac28b86838b010161480d565b845250918301918301614a9c565b5086525085810135935082841115614ae757600080fd5b614af387858801614942565b90850152506040840135915080821115614b0c57600080fd5b50614b19848285016149c2565b6040830152506060820135606082015292915050565b60008060408385031215614b4257600080fd5b823567ffffffffffffffff80821115614b5a57600080fd5b614b6686838701614a21565b9350602091508185013581811115614b7d57600080fd5b85019050601f81018613614b9057600080fd5b8035614b9e6144c982614464565b81815260059190911b82018301908381019088831115614bbd57600080fd5b928401925b82841015614bdb57833582529284019290840190614bc2565b80955050505050509250929050565b60e081016106f7828463ffffffff80825116835280602083015116602084015261ffff604083015116604084015260608201516001600160a01b03808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b600060208284031215614c6a57600080fd5b813567ffffffffffffffff811115614c8157600080fd5b820160a08185031215610fa257600080fd5b600082601f830112614ca457600080fd5b81356020614cb46144c983614464565b82815260069290921b84018101918181019086841115614cd357600080fd5b8286015b848110156145155760408189031215614cf05760008081fd5b614cf861437d565b8135614d0381614488565b815281850135614d1281614488565b81860152835291830191604001614cd7565b60008060408385031215614d3757600080fd5b823567ffffffffffffffff80821115614d4f57600080fd5b614d5b86838701614c93565b93506020850135915080821115614d7157600080fd5b50614d7e85828601614c93565b9150509250929050565b60008083601f840112614d9a57600080fd5b50813567ffffffffffffffff811115614db257600080fd5b6020830191508360208260051b8501011115612a1657600080fd5b60008060008060008060008060e0898b031215614de957600080fd5b606089018a811115614dfa57600080fd5b8998503567ffffffffffffffff80821115614e1457600080fd5b818b0191508b601f830112614e2857600080fd5b813581811115614e3757600080fd5b8c6020828501011115614e4957600080fd5b6020830199508098505060808b0135915080821115614e6757600080fd5b614e738c838d01614d88565b909750955060a08b0135915080821115614e8c57600080fd5b50614e998b828c01614d88565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461427857600080fd5b600060608284031215614ee457600080fd5b614eec6143ed565b8235614ef7816146ec565b8152614f0560208401614eb2565b6020820152614f1660408401614eb2565b60408201529392505050565b604081526000614f356040830185614677565b8281036020840152612c208185614677565b60008060408385031215614f5a57600080fd5b823567ffffffffffffffff80821115614f7257600080fd5b614f7e8683870161480d565b93506020850135915080821115614f9457600080fd5b50614d7e8582860161478d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106f7576106f7614fa1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff8084168061502d5761502d614fe3565b92169190910692915050565b80820281158282048414176106f7576106f7614fa1565b600067ffffffffffffffff8084168061506b5761506b614fe3565b92169190910492915050565b602081016003831061508b5761508b61429a565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff8083168181036150d9576150d9614fa1565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b166040850152508060608401526151138184018a614677565b905082810360808401526151278189614677565b905060ff871660a084015282810360c0840152615144818761430f565b905067ffffffffffffffff851660e0840152828103610100840152615169818561430f565b9c9b505050505050505050505050565b60006020828403121561518b57600080fd5b8151610fa281614257565b808201808211156106f7576106f7614fa1565b60008151808452602080850194506020840160005b838110156146b157815180516001600160a01b0316885283015183880152604090960195908201906001016151be565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c084015261522961012084018261430f565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152615265838361430f565b92506080890151915080858403016101008601525061528482826151a9565b92505050615298602083018661ffff169052565b836040830152612c2060608301846001600160a01b03169052565b600082601f8301126152c457600080fd5b81516152d26144c982614531565b8181528460208386010111156152e757600080fd5b6127e08260208301602087016142eb565b60008060006060848603121561530d57600080fd5b8351615318816146ec565b602085015190935067ffffffffffffffff81111561533557600080fd5b615341868287016152b3565b925050604084015190509250925092565b805163ffffffff8116811461427857600080fd5b805161427881614488565b600060e0828403121561538357600080fd5b61538b614410565b61539483615352565b81526153a260208401615352565b6020820152604083015161ffff811681146153bc57600080fd5b60408201526153cd60608401615366565b60608201526153de60808401615366565b60808201526153ef60a08401615352565b60a082015261540060c08401615352565b60c08201529392505050565b6101c0810161547d82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e084015260208401518116610100840152604084015161ffff1661012084015260608401516001600160a01b0390811661014085015260808501511661016084015260a0840151811661018084015260c0840151166101a0830152610fa2565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526155228285018b614677565b91508382036080850152615536828a614677565b915060ff881660a085015283820360c0850152615553828861430f565b90861660e08501528381036101008501529050615169818561430f565b60006020828403121561558257600080fd5b8151610fa2816146ec565b60008151808452602080850194506020840160005b838110156146b1578151875295820195908201906001016155a2565b6060815260006155d1606083018661558d565b82810360208401526155e3818661558d565b915050826040830152949350505050565b60006020828403121561560657600080fd5b5051919050565b67ffffffffffffffff8181168382160190808211156140d5576140d5614fa1565b67ffffffffffffffff8316815260408101610fa260208301846142c9565b600067ffffffffffffffff8083168181036150d9576150d9614fa1565b61567381846142c9565b6040602082015260006127e0604083018461430f565b60006020828403121561569b57600080fd5b813567ffffffffffffffff8111156156b257600080fd5b6127e084828501614a21565b6000602082840312156156d057600080fd5b815167ffffffffffffffff808211156156e857600080fd5b90830190606082860312156156fc57600080fd5b6157046143ed565b82518281111561571357600080fd5b61571f878286016152b3565b82525060208301518281111561573457600080fd5b615740878286016152b3565b60208301525060408301518281111561575857600080fd5b615764878286016152b3565b60408301525095945050505050565b602081526000610fa260208301846151a9565b60008282518085526020808601955060208260051b8401016020860160005b848110156157d357601f198684030189526157c183835161430f565b988401989250908301906001016157a5565b5090979650505050505050565b602081526000610fa26020830184615786565b6040815261580e60408201845167ffffffffffffffff169052565b6000602084015161582a60608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c084015161010061588b8185018367ffffffffffffffff169052565b60e086015191506101206158a9818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a061016081818701526158d96101e087018561430f565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc061018081888703018189015261591886866151a9565b9550828a015194508188870301848901526159338686615786565b9550808a01516101c089015250505050508281036020840152612c208185615786565b6000815160208301517fffffffff000000000000000000000000000000000000000000000000000000008082169350600483101561599e5780818460040360031b1b83161693505b505050919050565b6000602082840312156159b857600080fd5b8151610fa281614488565b60208152600082516101008060208501526159e261012085018361430f565b915060208501516159ff604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615a3960a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615a56848361430f565b935060c08701519150808685030160e0870152615a73848361430f565b935060e0870151915080868503018387015250615a90838261430f565b9695505050505050565b600060408284031215615aac57600080fd5b615ab461437d565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114615ae057600080fd5b8152615aee60208401615352565b60208201529392505050565b600082615b0957615b09614fe3565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ Bin: "0x6101a06040523480156200001257600080fd5b5060405162005f9938038062005f998339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516158d0620006c9600039600081816102ec01528181611b12015261315f0152600081816102bd01528181611aeb0152611d9d01526000818161028e01528181610ed201528181610f3701528181611ac40152818161234501526123af01526000611f3c01526000818161025f0152611a9a0152600081816101ff0152611a4801526000818161022f01528181611a7201528181611d5a01528181612dc1015261326e0152600081816101d001528181611a1a015261201c015260008181611cb40152611d0001526158d06000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063f077b59211610066578063f077b59214610646578063f2fde38b1461065c578063f52121a51461066f57600080fd5b8063afcb95d714610600578063b1dc65a414610620578063c92b28321461063357600080fd5b8063856c8247116100bd578063856c8247146105b0578063873504d7146105dc5780638da5cb5b146105ef57600080fd5b806381ff70481461057257806385572ffb146105a257600080fd5b8063599f64311161013a578063740f415011610114578063740f4150146104615780637437ff9f1461047457806379ba50971461056a57600080fd5b8063599f643114610414578063666cab8d14610439578063704b6c021461044e57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b578063546719cd146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103299190613fbd565b60405180910390f35b610345610340366004614053565b610682565b60405161032991906140b3565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b6040516103299190614111565b6103ae6103a9366004614380565b6106fd565b005b6103b8610af1565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610441610ba6565b6040516103299190614492565b6103ae61045c3660046144a5565b610c08565b6103ae61046f366004614905565b610cd1565b61055d6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506040805160e081018252600a5463ffffffff808216835264010000000082048116602084015261ffff68010000000000000000830416938301939093526001600160a01b036a010000000000000000000090910481166060830152600b549081166080830152740100000000000000000000000000000000000000008104831660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290565b60405161032991906149c0565b6103ae610dc3565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae610182366004614a2e565b6105c36105be3660046144a5565b610ea6565b60405167ffffffffffffffff9091168152602001610329565b6103ae6105ea366004614afa565b610fa9565b6000546001600160a01b0316610421565b604080516001815260006020820181905291810191909152606001610329565b6103ae61062e366004614ba3565b611177565b6103ae610641366004614ca8565b611382565b61064e6113ed565b604051610329929190614cf8565b6103ae61066a3660046144a5565b611513565b6103ae61067d366004614d1d565b611524565b600061069060016004614da6565b600261069d608085614de8565b67ffffffffffffffff166106b19190614e0f565b601060006106c0608087614e26565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106f7576106f7614070565b92915050565b84518460ff16601f82111561074a5760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190614e4d565b60405180910390fd5b806000036107875760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190614e4d565b61078f6117c4565b6107988561183a565b60095460005b8181101561080f5760086000600983815481106107bd576107bd614e67565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161079e565b5050865160005b818110156109b257600089828151811061083257610832614e67565b602002602001015190506000600281111561084f5761084f614070565b6001600160a01b038216600090815260086020526040902054610100900460ff16600281111561088157610881614070565b146108bb5760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190614e4d565b6001600160a01b0381166108fb576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561099e5761099e614070565b021790555090505050806001019050610816565b5087516109c69060099060208b0190613f2b565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a161717905560078054610a4c914691309190600090610a1e9063ffffffff16614e96565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611b72565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610add9487949293918316921691909117908f908f908f908f908f908f90614eb9565b60405180910390a150505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610ba190611bff565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610bfe57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610be0575b5050505050905090565b6000546001600160a01b03163314801590610c2e57506002546001600160a01b03163314155b15610c65576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b610cd9611cb1565b81515181518114610d16576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610db3576000838281518110610d3557610d35614e67565b6020026020010151905080600014610daa578451805183908110610d5b57610d5b614e67565b602002602001015160800151811015610daa576040517f085e39cf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610741565b50600101610d19565b50610dbe8383611d32565b505050565b6001546001600160a01b03163314610e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610741565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106f7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106f7576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa29190614f4f565b9392505050565b610fb16117c4565b60005b825181101561108457610fee838281518110610fd257610fd2614e67565b602002602001015160200151600c6127b590919063ffffffff16565b1561107c577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d5878283828151811061102657611026614e67565b60200260200101516000015184838151811061104457611044614e67565b6020026020010151602001516040516110739291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101610fb4565b5060005b8151811015610dbe576110e18282815181106110a6576110a6614e67565b6020026020010151602001518383815181106110c4576110c4614e67565b602002602001015160000151600c6127ca9092919063ffffffff16565b1561116f577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a82828151811061111957611119614e67565b60200260200101516000015183838151811061113757611137614e67565b6020026020010151602001516040516111669291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611088565b61118187876127e8565b6005548835908082146111ca576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610741565b6111d2611cb1565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561125a5761125a614070565b600281111561126b5761126b614070565b905250905060028160200151600281111561128857611288614070565b1480156112c257506009816000015160ff16815481106112aa576112aa614e67565b6000918252602090912001546001600160a01b031633145b6112f8576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611306856020614e0f565b611311886020614e0f565b61131d8b610144614f6c565b6113279190614f6c565b6113319190614f6c565b9050368114611375576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610741565b5050505050505050505050565b6000546001600160a01b031633148015906113a857506002546001600160a01b03163314155b156113df576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113ea60038261280f565b50565b60608060006113fc600c6129f4565b90508067ffffffffffffffff81111561141757611417614124565b604051908082528060200260200182016040528015611440578160200160208202803683370190505b5092508067ffffffffffffffff81111561145c5761145c614124565b604051908082528060200260200182016040528015611485578160200160208202803683370190505b50915060005b8181101561150d576000806114a1600c846129ff565b91509150808684815181106114b8576114b8614e67565b60200260200101906001600160a01b031690816001600160a01b031681525050818584815181106114eb576114eb614e67565b6001600160a01b0390921660209283029190910190910152505060010161148b565b50509091565b61151b6117c4565b6113ea81612a1d565b33301461155d576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516000808252602082019092528161159a565b60408051808201909152600080825260208201528152602001906001900390816115735790505b5061014084015151909150156115fa576115f783610140015184602001516040516020016115d791906001600160a01b0391909116815260200190565b604051602081830303815290604052856040015186610160015186612af8565b90505b6101208301515115801561161057506080830151155b80611627575060408301516001600160a01b03163b155b8061166757506040830151611665906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612c29565b155b1561167157505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808861018001518152602001886000015167ffffffffffffffff16815260200188602001516040516020016116e991906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001886101200151815260200186815250611388886080015189604001516040518563ffffffff1660e01b81526004016117389493929190614fc4565b6000604051808303816000875af1158015611757573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261177f91908101906150ce565b5091509150816117bd57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107419190614111565b5050505050565b6000546001600160a01b03163314611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610741565b565b6000818060200190518101906118509190615147565b60608101519091506001600160a01b0316611897576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a80546020808501516040808701516060808901516001600160a01b039081166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff61ffff9094166801000000000000000002939093167fffff00000000000000000000000000000000000000000000ffffffffffffffff63ffffffff968716640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009099169a87169a909a1797909717989098169590951717909455608080870151600b805460a0808b015160c0808d015188167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9290981674010000000000000000000000000000000000000000027fffffffffffffffff000000000000000000000000000000000000000000000000909416958c16959095179290921791909116949094179055855160e0810187527f00000000000000000000000000000000000000000000000000000000000000008816815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848701527f00000000000000000000000000000000000000000000000000000000000000008716948401949094527f00000000000000000000000000000000000000000000000000000000000000008616908301527f00000000000000000000000000000000000000000000000000000000000000008516908201527f000000000000000000000000000000000000000000000000000000000000000090931690830152517ff02fcc22535d64d92d17b995475893d63edd51da163fed74a6ee9b4bc4895cc491611b669184906151e2565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611b96999897969594939291906152be565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c8d82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611c719190614da6565b85608001516fffffffffffffffffffffffffffffffff16612c45565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b467f000000000000000000000000000000000000000000000000000000000000000014611838576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610741565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e109190615346565b15611e47576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611e84576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611ec2576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611edd57611edd614124565b604051908082528060200260200182016040528015611f06578160200160208202803683370190505b50905060005b82811015611fde57600085600001518281518110611f2c57611f2c614e67565b60200260200101519050611f60817f0000000000000000000000000000000000000000000000000000000000000000612c64565b838381518110611f7257611f72614e67565b602002602001018181525050806101800151838381518110611f9657611f96614e67565b602002602001015114611fd5576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611f0c565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263320488759261205292879291600401615394565b602060405180830381865afa15801561206f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209391906153ca565b9050806000036120cf576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156127ac576000876000015182815181106120f6576120f6614e67565b60200260200101519050600061210f8260600151610682565b9050600281600381111561212557612125614070565b0361216c57816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a250506127a4565b600081600381111561218057612180614070565b148061219d5750600381600381111561219b5761219b614070565b145b6121e55760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b83156122a257600a5460009063ffffffff166122018742614da6565b11905080806122215750600382600381111561221f5761221f614070565b145b612257576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061226957612269614e67565b602002602001015160001461229c5788848151811061228a5761228a614e67565b60200260200101518360800181815250505b506122ff565b60008160038111156122b6576122b6614070565b146122ff5760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b60c082015167ffffffffffffffff161561257e576020808301516001600160a01b03166000908152600f909152604081205467ffffffffffffffff16908190036124e9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156124e95760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156123f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241c9190614f4f565b60c084015190915067ffffffffffffffff166124398260016153e3565b67ffffffffffffffff16146124995782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a35050506127a4565b6020838101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b60008260038111156124fd576124fd614070565b0361257c5760c083015167ffffffffffffffff1661251c8260016153e3565b67ffffffffffffffff161461257c5782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a35050506127a4565b505b60008960200151848151811061259657612596614e67565b602002602001015190506125c28360600151846000015185610140015151866101200151518551612dbf565b6125d183606001516001612f39565b6000806125de8584612fe3565b915091506125f0856060015183612f39565b861561265c57600382600381111561260a5761260a614070565b0361265c57600084600381111561262357612623614070565b1461265c57806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107419190614111565b600282600381111561267057612670614070565b146126c857600382600381111561268957612689614070565b146126c8578460600151826040517f9e261603000000000000000000000000000000000000000000000000000000008152600401610741929190615404565b60c085015167ffffffffffffffff16156127505760008460038111156126f0576126f0614070565b03612750576020808601516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff169161272883615422565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef65848460405161279692919061543f565b60405180910390a350505050505b6001016120d6565b50505050505050565b6000610fa2836001600160a01b0384166130ac565b60006127e0846001600160a01b038516846130b8565b949350505050565b61280b6127f78284018461545f565b604080516000815260208101909152611d32565b5050565b815460009061283890700100000000000000000000000000000000900463ffffffff1642614da6565b905080156128da5760018301548354612880916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612c45565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612900916fffffffffffffffffffffffffffffffff90811691166130ce565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906129e79084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106f7826130e4565b6000808080612a0e86866130ef565b909450925050505b9250929050565b336001600160a01b03821603612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610741565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612c0e57612b75888281518110612b1b57612b1b614e67565b6020026020010151602001518888888581518110612b3b57612b3b614e67565b6020026020010151806020019051810190612b569190615494565b888681518110612b6857612b68614e67565b60200260200101516130fe565b838281518110612b8757612b87614e67565b6020026020010181905250612bc3838281518110612ba757612ba7614e67565b602002602001015160000151600c61352190919063ffffffff16565b15612c0657612bf9838281518110612bdd57612bdd614e67565b6020908102919091010151600b546001600160a01b0316613536565b612c039083614f6c565b91505b600101612afd565b508015612c1e57612c1e81613657565b505b95945050505050565b6000612c3483613664565b8015610fa25750610fa283836136c8565b6000612c2085612c558486614e0f565b612c5f9087614f6c565b6130ce565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612cfa9897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612d339190615549565b60405160208183030381529060405280519060200120876101600151604051602001612d5f91906155b6565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612e38576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610741565b600a5468010000000000000000900461ffff16831115612e90576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610741565b808314612ed5576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610741565b600a54640100000000900463ffffffff168211156117bd57600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff16600482015260248101839052604401610741565b60006002612f48608085614de8565b67ffffffffffffffff16612f5c9190614e0f565b90506000601081612f6e608087614e26565b67ffffffffffffffff168152602081019190915260400160002054905081612f9860016004614da6565b901b191681836003811115612faf57612faf614070565b901b178060106000612fc2608088614e26565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061302790879087906004016155c9565b600060405180830381600087803b15801561304157600080fd5b505af1925050508015613052575060015b613091573d808015613080576040519150601f19603f3d011682016040523d82523d6000602084013e613085565b606091505b50600392509050612a16565b50506040805160208101909152600081526002909250929050565b6000610fa28383613797565b60006127e084846001600160a01b0385166137b4565b60008183106130dd5781610fa2565b5090919050565b60006106f7826137d1565b6000808080612a0e86866137dc565b604080518082019091526000808252602082015260006131218460200151613807565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa1580156131a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ca919061572c565b90506001600160a01b038116158061321257506132106001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612c29565b155b15613254576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610741565b60008061336e6040518061010001604052808b81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018a6001600160a01b031681526020018c8152602001866001600160a01b031681526020018960000151815260200189604001518152602001888152506040516024016132e89190615749565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3907753700000000000000000000000000000000000000000000000000000000179052600b54859063ffffffff740100000000000000000000000000000000000000009091041661138860846138ad565b5091509150816133ac57806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107419190614111565b80516020146133f45780516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610741565b60008180602001905181019061340a91906153ca565b6040516001600160a01b038b166024820152604481018290529091506134b79060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052600b54879063ffffffff78010000000000000000000000000000000000000000000000009091041661138860846138ad565b509093509150826134f657816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107419190614111565b604080518082019091526001600160a01b039095168552602085015250919250505095945050505050565b6000610fa2836001600160a01b0384166139d3565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa15801561359c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c09190615820565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036136295783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610741565b60208401516127e0907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906139df565b6113ea6003826000613a1c565b6000613690827f01ffc9a7000000000000000000000000000000000000000000000000000000006136c8565b80156106f757506136c1827fffffffff000000000000000000000000000000000000000000000000000000006136c8565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613780575060208210155b801561378c5750600081115b979650505050505050565b60008181526002830160205260408120819055610fa28383613d6b565b600082815260028401602052604081208290556127e08484613d77565b60006106f782613d83565b600080806137ea8585613d8d565b600081815260029690960160205260409095205494959350505050565b6000815160201461384657816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016107419190614111565b60008280602001905181019061385c91906153ca565b90506001600160a01b03811180613874575061040081105b156106f757826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016107419190614111565b6000606060008361ffff1667ffffffffffffffff8111156138d0576138d0614124565b6040519080825280601f01601f1916602001820160405280156138fa576020820181803683370190505b509150863b61392d577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613960577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613999577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156139bc5750835b808352806000602085013e50955095509592505050565b6000610fa28383613d99565b6000670de0b6b3a7640000613a12837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616614e0f565b610fa29190615880565b825474010000000000000000000000000000000000000000900460ff161580613a43575081155b15613a4d57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613a9390700100000000000000000000000000000000900463ffffffff1642614da6565b90508015613b535781831115613ad5576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613b0f9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612c45565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613bf0576001600160a01b038416613ba5576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610741565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610741565b84831015613ce95760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613c349082614da6565b613c3e878a614da6565b613c489190614f6c565b613c529190615880565b90506001600160a01b038616613c9e576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610741565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610741565b613cf38584614da6565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610fa28383613db8565b6000610fa28383613eb2565b60006106f7825490565b6000610fa28383613f01565b6000610fa2838360008181526001830160205260408120541515610fa2565b60008181526001830160205260408120548015613ea1576000613ddc600183614da6565b8554909150600090613df090600190614da6565b9050818114613e55576000866000018281548110613e1057613e10614e67565b9060005260206000200154905080876000018481548110613e3357613e33614e67565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613e6657613e66615894565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f7565b60009150506106f7565b5092915050565b6000818152600183016020526040812054613ef9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f7565b5060006106f7565b6000826000018281548110613f1857613f18614e67565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215613f98579160200282015b82811115613f9857825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613f4b565b50613fa4929150613fa8565b5090565b5b80821115613fa45760008155600101613fa9565b60e081016106f782846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff811681146113ea57600080fd5b803561404e8161402d565b919050565b60006020828403121561406557600080fd5b8135610fa28161402d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106140af576140af614070565b9052565b602081016106f7828461409f565b60005b838110156140dc5781810151838201526020016140c4565b50506000910152565b600081518084526140fd8160208601602086016140c1565b601f01601f19169290920160200192915050565b602081526000610fa260208301846140e5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561417657614176614124565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561417657614176614124565b6040516080810167ffffffffffffffff8111828210171561417657614176614124565b6040516060810167ffffffffffffffff8111828210171561417657614176614124565b60405160e0810167ffffffffffffffff8111828210171561417657614176614124565b604051601f8201601f1916810167ffffffffffffffff8111828210171561423257614232614124565b604052919050565b600067ffffffffffffffff82111561425457614254614124565b5060051b60200190565b6001600160a01b03811681146113ea57600080fd5b803561404e8161425e565b600082601f83011261428f57600080fd5b813560206142a461429f8361423a565b614209565b8083825260208201915060208460051b8701019350868411156142c657600080fd5b602086015b848110156142eb5780356142de8161425e565b83529183019183016142cb565b509695505050505050565b803560ff8116811461404e57600080fd5b600067ffffffffffffffff82111561432157614321614124565b50601f01601f191660200190565b600082601f83011261434057600080fd5b813561434e61429f82614307565b81815284602083860101111561436357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561439957600080fd5b863567ffffffffffffffff808211156143b157600080fd5b6143bd8a838b0161427e565b975060208901359150808211156143d357600080fd5b6143df8a838b0161427e565b96506143ed60408a016142f6565b9550606089013591508082111561440357600080fd5b61440f8a838b0161432f565b945061441d60808a01614043565b935060a089013591508082111561443357600080fd5b5061444089828a0161432f565b9150509295509295509295565b60008151808452602080850194506020840160005b838110156144875781516001600160a01b031687529582019590820190600101614462565b509495945050505050565b602081526000610fa2602083018461444d565b6000602082840312156144b757600080fd5b8135610fa28161425e565b80151581146113ea57600080fd5b803561404e816144c2565b600082601f8301126144ec57600080fd5b813560206144fc61429f8361423a565b82815260069290921b8401810191818101908684111561451b57600080fd5b8286015b848110156142eb57604081890312156145385760008081fd5b614540614153565b813561454b8161425e565b8152818501358582015283529183019160400161451f565b600082601f83011261457457600080fd5b8135602061458461429f8361423a565b82815260059290921b840181019181810190868411156145a357600080fd5b8286015b848110156142eb57803567ffffffffffffffff8111156145c75760008081fd5b6145d58986838b010161432f565b8452509183019183016145a7565b60006101a082840312156145f657600080fd5b6145fe61417c565b905061460982614043565b815261461760208301614273565b602082015261462860408301614273565b604082015261463960608301614043565b60608201526080820135608082015261465460a083016144d0565b60a082015261466560c08301614043565b60c082015261467660e08301614273565b60e082015261010082810135908201526101208083013567ffffffffffffffff808211156146a357600080fd5b6146af8683870161432f565b838501526101409250828501359150808211156146cb57600080fd5b6146d7868387016144db565b838501526101609250828501359150808211156146f357600080fd5b5061470085828601614563565b82840152505061018080830135818301525092915050565b600082601f83011261472957600080fd5b8135602061473961429f8361423a565b82815260059290921b8401810191818101908684111561475857600080fd5b8286015b848110156142eb57803567ffffffffffffffff81111561477c5760008081fd5b61478a8986838b0101614563565b84525091830191830161475c565b600082601f8301126147a957600080fd5b813560206147b961429f8361423a565b8083825260208201915060208460051b8701019350868411156147db57600080fd5b602086015b848110156142eb57803583529183019183016147e0565b60006080828403121561480957600080fd5b6148116141a0565b9050813567ffffffffffffffff8082111561482b57600080fd5b818401915084601f83011261483f57600080fd5b8135602061484f61429f8361423a565b82815260059290921b8401810191818101908884111561486e57600080fd5b8286015b848110156148a65780358681111561488a5760008081fd5b6148988b86838b01016145e3565b845250918301918301614872565b50865250858101359350828411156148bd57600080fd5b6148c987858801614718565b908501525060408401359150808211156148e257600080fd5b506148ef84828501614798565b6040830152506060820135606082015292915050565b6000806040838503121561491857600080fd5b823567ffffffffffffffff8082111561493057600080fd5b61493c868387016147f7565b935060209150818501358181111561495357600080fd5b85019050601f8101861361496657600080fd5b803561497461429f8261423a565b81815260059190911b8201830190838101908883111561499357600080fd5b928401925b828410156149b157833582529284019290840190614998565b80955050505050509250929050565b60e081016106f7828463ffffffff80825116835280602083015116602084015261ffff604083015116604084015260608201516001600160a01b03808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b600060208284031215614a4057600080fd5b813567ffffffffffffffff811115614a5757600080fd5b820160a08185031215610fa257600080fd5b600082601f830112614a7a57600080fd5b81356020614a8a61429f8361423a565b82815260069290921b84018101918181019086841115614aa957600080fd5b8286015b848110156142eb5760408189031215614ac65760008081fd5b614ace614153565b8135614ad98161425e565b815281850135614ae88161425e565b81860152835291830191604001614aad565b60008060408385031215614b0d57600080fd5b823567ffffffffffffffff80821115614b2557600080fd5b614b3186838701614a69565b93506020850135915080821115614b4757600080fd5b50614b5485828601614a69565b9150509250929050565b60008083601f840112614b7057600080fd5b50813567ffffffffffffffff811115614b8857600080fd5b6020830191508360208260051b8501011115612a1657600080fd5b60008060008060008060008060e0898b031215614bbf57600080fd5b606089018a811115614bd057600080fd5b8998503567ffffffffffffffff80821115614bea57600080fd5b818b0191508b601f830112614bfe57600080fd5b813581811115614c0d57600080fd5b8c6020828501011115614c1f57600080fd5b6020830199508098505060808b0135915080821115614c3d57600080fd5b614c498c838d01614b5e565b909750955060a08b0135915080821115614c6257600080fd5b50614c6f8b828c01614b5e565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461404e57600080fd5b600060608284031215614cba57600080fd5b614cc26141c3565b8235614ccd816144c2565b8152614cdb60208401614c88565b6020820152614cec60408401614c88565b60408201529392505050565b604081526000614d0b604083018561444d565b8281036020840152612c20818561444d565b60008060408385031215614d3057600080fd5b823567ffffffffffffffff80821115614d4857600080fd5b614d54868387016145e3565b93506020850135915080821115614d6a57600080fd5b50614b5485828601614563565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106f7576106f7614d77565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614e0357614e03614db9565b92169190910692915050565b80820281158282048414176106f7576106f7614d77565b600067ffffffffffffffff80841680614e4157614e41614db9565b92169190910492915050565b6020810160038310614e6157614e61614070565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818103614eaf57614eaf614d77565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614ee98184018a61444d565b90508281036080840152614efd818961444d565b905060ff871660a084015282810360c0840152614f1a81876140e5565b905067ffffffffffffffff851660e0840152828103610100840152614f3f81856140e5565b9c9b505050505050505050505050565b600060208284031215614f6157600080fd5b8151610fa28161402d565b808201808211156106f7576106f7614d77565b60008151808452602080850194506020840160005b8381101561448757815180516001600160a01b031688528301518388015260409096019590820190600101614f94565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614fff6101208401826140e5565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e086015261503b83836140e5565b92506080890151915080858403016101008601525061505a8282614f7f565b9250505061506e602083018661ffff169052565b836040830152612c2060608301846001600160a01b03169052565b600082601f83011261509a57600080fd5b81516150a861429f82614307565b8181528460208386010111156150bd57600080fd5b6127e08260208301602087016140c1565b6000806000606084860312156150e357600080fd5b83516150ee816144c2565b602085015190935067ffffffffffffffff81111561510b57600080fd5b61511786828701615089565b925050604084015190509250925092565b805163ffffffff8116811461404e57600080fd5b805161404e8161425e565b600060e0828403121561515957600080fd5b6151616141e6565b61516a83615128565b815261517860208401615128565b6020820152604083015161ffff8116811461519257600080fd5b60408201526151a36060840161513c565b60608201526151b46080840161513c565b60808201526151c560a08401615128565b60a08201526151d660c08401615128565b60c08201529392505050565b6101c0810161525382856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e084015260208401518116610100840152604084015161ffff1661012084015260608401516001600160a01b0390811661014085015260808501511661016084015260a0840151811661018084015260c0840151166101a0830152610fa2565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526152f88285018b61444d565b9150838203608085015261530c828a61444d565b915060ff881660a085015283820360c085015261532982886140e5565b90861660e08501528381036101008501529050614f3f81856140e5565b60006020828403121561535857600080fd5b8151610fa2816144c2565b60008151808452602080850194506020840160005b8381101561448757815187529582019590820190600101615378565b6060815260006153a76060830186615363565b82810360208401526153b98186615363565b915050826040830152949350505050565b6000602082840312156153dc57600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115613eab57613eab614d77565b67ffffffffffffffff8316815260408101610fa2602083018461409f565b600067ffffffffffffffff808316818103614eaf57614eaf614d77565b615449818461409f565b6040602082015260006127e060408301846140e5565b60006020828403121561547157600080fd5b813567ffffffffffffffff81111561548857600080fd5b6127e0848285016147f7565b6000602082840312156154a657600080fd5b815167ffffffffffffffff808211156154be57600080fd5b90830190606082860312156154d257600080fd5b6154da6141c3565b8251828111156154e957600080fd5b6154f587828601615089565b82525060208301518281111561550a57600080fd5b61551687828601615089565b60208301525060408301518281111561552e57600080fd5b61553a87828601615089565b60408301525095945050505050565b602081526000610fa26020830184614f7f565b60008282518085526020808601955060208260051b8401016020860160005b848110156155a957601f198684030189526155978383516140e5565b9884019892509083019060010161557b565b5090979650505050505050565b602081526000610fa2602083018461555c565b604081526155e460408201845167ffffffffffffffff169052565b6000602084015161560060608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006156618185018367ffffffffffffffff169052565b60e0860151915061012061567f818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a061016081818701526156af6101e08701856140e5565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526156ee8686614f7f565b9550828a01519450818887030184890152615709868661555c565b9550808a01516101c089015250505050508281036020840152612c20818561555c565b60006020828403121561573e57600080fd5b8151610fa28161425e565b60208152600082516101008060208501526157686101208501836140e5565b91506020850151615785604086018267ffffffffffffffff169052565b5060408501516001600160a01b0381166060860152506060850151608085015260808501516157bf60a08601826001600160a01b03169052565b5060a0850151601f19808685030160c08701526157dc84836140e5565b935060c08701519150808685030160e08701526157f984836140e5565b935060e087015191508086850301838701525061581683826140e5565b9695505050505050565b60006040828403121561583257600080fd5b61583a614153565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461586657600080fd5b815261587460208401615128565b60208201529392505050565b60008261588f5761588f614db9565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 51e2b45f01..7c584cc9dd 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -12,7 +12,7 @@ commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitSto
ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 25a7bf3aa46252844c7afabc15db1051e7b6a717e296fc4c6e2f2f93d16033c5
evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin 9478aedc9f0072fbdafb54a6f82248de1efbcd7bdff18a90d8556b9aaff67455
-evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin a8c23c9280a713544eae0a0b8841a9caf97e616338d31ebc62501d8b4ab0eed6
+evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin 6a3ae8f29cfc5aa52b5e4438b3196be8a542a952e828065b964fd8156dd3d96e
evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 116d5cb8447a1af61664a8d1db2d76086c042a3228337bc5cd49b9abd3e815f7
lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin 95a93517b01f51c35d82711a0015995f4804820ed67f6b46b785c4c94815df93
lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin 05e308151b5adc9ba8d33385b8f82d55aad638652fe50e3ea8b09b1d0bbfd367
diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go
index ff318a26ef..9d3fc42999 100644
--- a/integration-tests/ccip-tests/actions/ccip_helpers.go
+++ b/integration-tests/ccip-tests/actions/ccip_helpers.go
@@ -3034,13 +3034,12 @@ func (lane *CCIPLane) ExecuteManually(options ...ManualExecutionOption) error {
// validationOptions are used in the ValidateRequests function to specify which phase is expected to fail and how
type validationOptions struct {
phaseExpectedToFail testreporters.Phase // the phase expected to fail
- phaseShouldExist bool // for some phases, their lack of existence is a failure, for others their existence can also have a failure state
expectedErrorMessage string // if provided, we're looking for a specific error message
timeout time.Duration // timeout for the validation
}
// ValidationOptionFunc is a function that can be passed to ValidateRequests to specify which phase is expected to fail
-type ValidationOptionFunc func(logger *zerolog.Logger, opts *validationOptions)
+type ValidationOptionFunc func(opts *validationOptions)
// PhaseSpecificValidationOptionFunc can specify how exactly you want a phase to fail
type PhaseSpecificValidationOptionFunc func(*validationOptions)
@@ -3059,39 +3058,19 @@ func WithTimeout(timeout time.Duration) PhaseSpecificValidationOptionFunc {
}
}
-// ShouldExist specifies that a specific phase should exist, but be in a failed state. This is only applicable to the `ExecStateChanged` phase.
-func ShouldExist() PhaseSpecificValidationOptionFunc {
- return func(opts *validationOptions) {
- opts.phaseShouldExist = true
- }
-}
-
// ExpectPhaseToFail specifies that a specific phase is expected to fail.
// You can optionally provide an expected error message, if you don't have one in mind, just pass an empty string.
// shouldExist is used to specify whether the phase should exist or not, which is only applicable to the `ExecStateChanged` phase.
// If you expect the `ExecStateChanged` events to be there, but in a "failed" state, set this to true.
// It will otherwise be ignored.
func ExpectPhaseToFail(phase testreporters.Phase, phaseSpecificOptions ...PhaseSpecificValidationOptionFunc) ValidationOptionFunc {
- return func(logger *zerolog.Logger, opts *validationOptions) {
+ return func(opts *validationOptions) {
opts.phaseExpectedToFail = phase
for _, f := range phaseSpecificOptions {
if f != nil {
f(opts)
}
}
- if phase == testreporters.ExecStateChanged {
- if opts.expectedErrorMessage != "" {
- logger.Warn().Msg("You are overriding the expected error message for the ExecStateChanged phase. This can cause unexpected behavior and is generally not recommended.")
- } else if !opts.phaseShouldExist {
- opts.expectedErrorMessage = "ExecutionStateChanged event not found for seq num"
- } else {
- opts.expectedErrorMessage = "ExecutionStateChanged event state - expected"
- }
- }
- if phase != testreporters.ExecStateChanged && opts.phaseShouldExist {
- logger.Warn().Msg("phaseShouldExist is only applicable to the ExecStateChanged phase. Ignoring for other phases.")
- opts.phaseShouldExist = false
- }
}
}
@@ -3102,7 +3081,7 @@ func (lane *CCIPLane) ValidateRequests(validationOptionFuncs ...ValidationOption
var opts validationOptions
for _, f := range validationOptionFuncs {
if f != nil {
- f(lane.Logger, &opts)
+ f(&opts)
}
}
for txHash, ccipReqs := range lane.SentReqs {
diff --git a/integration-tests/ccip-tests/smoke/ccip_test.go b/integration-tests/ccip-tests/smoke/ccip_test.go
index a9de3abe85..9a34044a5d 100644
--- a/integration-tests/ccip-tests/smoke/ccip_test.go
+++ b/integration-tests/ccip-tests/smoke/ccip_test.go
@@ -840,7 +840,7 @@ func TestSmokeCCIPManuallyExecuteAfterExecutionFailingDueToInsufficientGas(t *te
// send with insufficient gas for ccip-receive to fail
err := tc.lane.SendRequests(1, big.NewInt(0))
require.NoError(t, err)
- tc.lane.ValidateRequests(actions.ExpectPhaseToFail(testreporters.ExecStateChanged, actions.ShouldExist()))
+ tc.lane.ValidateRequests(actions.ExpectPhaseToFail(testreporters.ExecStateChanged))
// wait for events
err = tc.lane.Dest.Common.ChainClient.WaitForEvents()
require.NoError(t, err)
@@ -882,7 +882,6 @@ func testOffRampRateLimits(t *testing.T, rateLimiterConfig contracts.RateLimiter
contracts.OffRampContract: contracts.V1_5_0_dev,
})
require.NoError(t, err, "Required contract versions not met")
- require.True(t, TestCfg.SelectedNetworks[0].Simulated, "This test relies on timing assumptions and should only be run on simulated networks")
require.False(t, pointer.GetBool(TestCfg.TestGroupInput.ExistingDeployment), "This test modifies contract state and cannot be run on existing deployments")
// Set the default permissionless exec threshold lower so that we can manually execute the transactions faster
@@ -975,13 +974,9 @@ func testOffRampRateLimits(t *testing.T, rateLimiterConfig contracts.RateLimiter
tc.lane.RecordStateBeforeTransfer()
err = tc.lane.SendRequests(1, big.NewInt(actions.DefaultDestinationGasLimit))
require.NoError(t, err, "Failed to send rate limited token transfer")
- // Expect the ExecutionStateChanged event to never show up
- // Since we're looking to confirm that an event has NOT occurred, this can lead to some imperfect assumptions and results
- // We set the timeout to stop waiting for the event after a minute
- // 99% of transactions occur in under a minute in ideal simulated conditions, so this is an okay assumption there
- // but on real chains this risks false negatives
- // If we don't set this timeout, this test can take a long time and hold up CI
- tc.lane.ValidateRequests(actions.ExpectPhaseToFail(testreporters.ExecStateChanged, actions.WithTimeout(time.Minute)))
+
+ // We should see the ExecStateChanged phase fail on the OffRamp
+ tc.lane.ValidateRequests(actions.ExpectPhaseToFail(testreporters.ExecStateChanged))
tc.lane.Logger.Info().
Str("Token", limitedSrcToken.ContractAddress.Hex()).
Msg("Limited token transfer failed on destination chain (a good thing in this context)")
From 44b23a5a32632c07a989d7cda7fc651dce09fbb1 Mon Sep 17 00:00:00 2001
From: Mateusz Sekara
Date: Wed, 31 Jul 2024 15:33:07 +0200
Subject: [PATCH 11/28] CCIP-2791 Long term solution for snoozing and caching
CommitRoots (#1182)
## Motivation
Detailed context is here
https://github.com/smartcontractkit/ccip/pull/726, but long story short
scanning the entire `permissionLessExecThreshold` /
`messageIntervalVisibility` from every Commit plugin instance (think of
it as a lane) puts a lot of pressure to the database. For most of the
cases, we don't need the entire window but only Roots that are not
executed yet.
Unfortunately, the solution suggested in the mentioned PR was faulty
because it relied on `block_timestamp` of unfinalized blocks. Re-orgs on
Polygon exposed that problem, details and revert here
https://github.com/smartcontractkit/ccip/pull/1155
## Solution
Divide the cache into two layers
* finalized commit roots are kept in memory because we assume these
never change
* unfinalized commit roots are fetched from LogPoller, and finalized
logs are promoted to the finalized part
There should be no additional memory footprint because we kept all
executed and finalized roots in cache memory anyway. The performance
impact of this approach should be similar to the #726 , because we keep
scanning only unfinalized chunks of the LogPoller so the number of logs
fetched from the database would be very limited.
However, there is one caveat here, LogPoller doesn't mark logs as
finalized/not finalized by default so we need to ask for the latest
finalized block in the Commit Reader directly and enrich logs with that
information (similar approach to what we do for Offramp reader).
Thankfully, asking the database for the latest log is extremely fast and
(if needed) could be optimized by caching latest finalized block in the
LogPoller/HeadTracker.
There will be load tests conducted here to confirm performance
assumptions.
Please see the code and tests for more details
chainlink-common PR
https://github.com/smartcontractkit/chainlink-common/pull/650
### High level picture
![image](https://github.com/smartcontractkit/ccip/assets/18304098/5c7e04e7-9703-4228-ac10-d264ab6e184a)
### Alternative solutions:
[I've tried implementing the solution in which the cache is simplified
and keeps only executed/snoozed
roots](https://github.com/smartcontractkit/ccip/pull/1170). Snoozed
Roots are passed to the database query and used for filtering out
executed and finalized roots. However, it works only for some number of
snoozed roots. After adding more than 250 snoozed roots to the LogPoller
query, the driver/database started to cut off some of the filters making
it unreliable (erroring or not filtering properly). Also, there is a
risk of hitting the Postgres query size limit (because every root has to
be passed in SQL) which might lead to some limbo state which the plugin
can't recover from.
## Tests
### Before - fetching all CommitReports always
### After - fetching only unfinalized CommitReports and caching
finalized ones
### Summary
Caching roots improved the performance, query is smaller in terms of the
objects scanned and returned. Number of roots returned is constant
almost during the entire test (around ~5 reports at once)
Sightly higher memory footprint (around 800MB higher) but lower CPU
utilization during tests (~15% drop)
---
.../ocr2/plugins/ccip/ccipexec/factory.go | 3 +-
.../ocr2/plugins/ccip/ccipexec/ocr2.go | 43 +-
.../ocr2/plugins/ccip/ccipexec/ocr2_test.go | 2 +-
.../ccip/internal/cache/commit_roots.go | 324 +++++++-----
.../ccip/internal/cache/commit_roots_test.go | 476 ++++++++++--------
.../internal/cache/commit_roots_unit_test.go | 212 ++++++++
.../internal/ccipdata/v1_0_0/commit_store.go | 30 +-
.../internal/ccipdata/v1_2_0/commit_store.go | 30 +-
8 files changed, 711 insertions(+), 409 deletions(-)
create mode 100644 core/services/ocr2/plugins/ccip/internal/cache/commit_roots_unit_test.go
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/factory.go b/core/services/ocr2/plugins/ccip/ccipexec/factory.go
index 7cc9111f37..97caf2e719 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/factory.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/factory.go
@@ -8,6 +8,7 @@ import (
"github.com/smartcontractkit/libocr/offchainreporting2plus/types"
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipcommon"
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip"
@@ -141,7 +142,7 @@ func (rf *ExecutionReportingPluginFactory) NewReportingPluginFn(config types.Rep
offRampReader: rf.config.offRampReader,
tokenPoolBatchedReader: rf.config.tokenPoolBatchedReader,
inflightReports: newInflightExecReportsContainer(offchainConfig.InflightCacheExpiry.Duration()),
- commitRootsCache: cache.NewCommitRootsCache(lggr, msgVisibilityInterval, offchainConfig.RootSnoozeTime.Duration()),
+ commitRootsCache: cache.NewCommitRootsCache(lggr, rf.config.commitStoreReader, msgVisibilityInterval, offchainConfig.RootSnoozeTime.Duration()),
metricsCollector: rf.config.metricsCollector,
chainHealthcheck: rf.config.chainHealthcheck,
batchingStrategy: batchingStrategy,
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go b/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
index 51c8c4e305..4a09cf37b4 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/ocr2.go
@@ -143,10 +143,11 @@ func (r *ExecutionReportingPlugin) Observation(ctx context.Context, timestamp ty
}
func (r *ExecutionReportingPlugin) getExecutableObservations(ctx context.Context, lggr logger.Logger, inflight []InflightInternalExecutionReport) ([]ccip.ObservedMessage, error) {
- unexpiredReports, err := r.getUnexpiredCommitReports(ctx, r.commitStoreReader, lggr)
+ unexpiredReports, err := r.commitRootsCache.RootsEligibleForExecution(ctx)
if err != nil {
return nil, err
}
+ r.metricsCollector.UnexpiredCommitRoots(len(unexpiredReports))
if len(unexpiredReports) == 0 {
return []ccip.ObservedMessage{}, nil
@@ -703,46 +704,6 @@ func getTokensPrices(ctx context.Context, priceRegistry ccipdata.PriceRegistryRe
return tokenPrices, nil
}
-func (r *ExecutionReportingPlugin) getUnexpiredCommitReports(
- ctx context.Context,
- commitStoreReader ccipdata.CommitStoreReader,
- lggr logger.Logger,
-) ([]cciptypes.CommitStoreReport, error) {
- createdAfterTimestamp := r.commitRootsCache.OldestRootTimestamp()
- lggr.Infow("Fetching unexpired commit roots from database", "createdAfterTimestamp", createdAfterTimestamp)
- acceptedReports, err := commitStoreReader.GetAcceptedCommitReportsGteTimestamp(
- ctx,
- createdAfterTimestamp,
- 0,
- )
- if err != nil {
- return nil, err
- }
-
- var reports []cciptypes.CommitStoreReport
- for _, acceptedReport := range acceptedReports {
- reports = append(reports, acceptedReport.CommitStoreReport)
- r.commitRootsCache.AppendUnexecutedRoot(acceptedReport.MerkleRoot, time.UnixMilli(acceptedReport.TxMeta.BlockTimestampUnixMilli))
- }
-
- notSnoozedReports := make([]cciptypes.CommitStoreReport, 0)
- for _, report := range reports {
- if r.commitRootsCache.IsSkipped(report.MerkleRoot) {
- lggr.Debugw("Skipping snoozed root",
- "minSeqNr", report.Interval.Min,
- "maxSeqNr", report.Interval.Max,
- "root", hex.EncodeToString(report.MerkleRoot[:]),
- )
- continue
- }
- notSnoozedReports = append(notSnoozedReports, report)
- }
-
- r.metricsCollector.UnexpiredCommitRoots(len(notSnoozedReports))
- lggr.Infow("Unexpired roots", "all", len(reports), "notSnoozed", len(notSnoozedReports))
- return notSnoozedReports, nil
-}
-
type execTokenData struct {
rateLimiterTokenBucket cciptypes.TokenBucketRateLimit
sourceTokenPrices map[cciptypes.Address]*big.Int
diff --git a/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go b/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
index 626448b0f2..84cb73c664 100644
--- a/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
+++ b/core/services/ocr2/plugins/ccip/ccipexec/ocr2_test.go
@@ -215,7 +215,7 @@ func TestExecutionReportingPlugin_Observation(t *testing.T) {
mockOnRampPriceRegistryProvider.On("NewPriceRegistryReader", ctx, sourcePriceRegistryAddress).Return(sourcePriceRegReader, nil).Maybe()
p.sourcePriceRegistryProvider = mockOnRampPriceRegistryProvider
- p.commitRootsCache = cache.NewCommitRootsCache(logger.TestLogger(t), time.Minute, time.Minute)
+ p.commitRootsCache = cache.NewCommitRootsCache(logger.TestLogger(t), commitStoreReader, time.Minute, time.Minute)
p.chainHealthcheck = cache.NewChainHealthcheck(p.lggr, mockOnRampReader, commitStoreReader)
bs := &BestEffortBatchingStrategy{}
diff --git a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots.go b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots.go
index ae5fe8fcde..5f8bd5edc5 100644
--- a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots.go
+++ b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots.go
@@ -1,13 +1,16 @@
package cache
import (
- "encoding/hex"
+ "context"
+ "slices"
"sync"
"time"
"github.com/patrickmn/go-cache"
orderedmap "github.com/wk8/go-ordered-map/v2"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+
"github.com/smartcontractkit/chainlink/v2/core/logger"
)
@@ -19,179 +22,222 @@ const (
)
type CommitsRootsCache interface {
- // IsSkipped returns true if the root is either executed or snoozed. Snoozing can be temporary based on the configuration
- IsSkipped(merkleRoot [32]byte) bool
+ RootsEligibleForExecution(ctx context.Context) ([]ccip.CommitStoreReport, error)
MarkAsExecuted(merkleRoot [32]byte)
Snooze(merkleRoot [32]byte)
-
- // OldestRootTimestamp returns the oldest root timestamp that is not executed yet (minus 1 second).
- // If there are no roots in the queue, it returns the messageVisibilityInterval
- OldestRootTimestamp() time.Time
- // AppendUnexecutedRoot appends the root to the unexecuted roots queue to keep track of the roots that are not executed yet
- // Roots has to be added in the order they are fetched from the database
- AppendUnexecutedRoot(merkleRoot [32]byte, blockTimestamp time.Time)
}
-type commitRootsCache struct {
- lggr logger.Logger
- // executedRoots is used to keep track of the roots that are executed. Roots that are considered as executed
- // when all messages are executed on the dest and matching execution state change logs are finalized
- executedRoots *cache.Cache
- // snoozedRoots is used to keep track of the roots that are temporary snoozed
- snoozedRoots *cache.Cache
- // unexecutedRootsQueue is used to keep track of the unexecuted roots in the order they are fetched from database (should be ordered by block_number, log_index)
- // First run of Exec will fill the queue with all the roots that are not executed yet within the [now-messageVisibilityInterval, now] window.
- // When a root is executed, it is removed from the queue. Next database query instead of using entire messageVisibilityInterval window
- // will use oldestRootTimestamp as the lower bound filter for block_timestamp.
- // This way we can reduce the number of database rows fetched with every OCR round.
- // We do it this way because roots for most of the cases are executed sequentially.
- // Instead of skipping snoozed roots after we fetch them from the database, we do that on the db level by narrowing the search window.
- //
- // Example
- // messageVisibilityInterval - 10 days, now - 2010-10-15
- // We fetch all the roots that within the [2010-10-05, 2010-10-15] window and load them to the queue
- // [0xA - 2010-10-10, 0xB - 2010-10-11, 0xC - 2010-10-12] -> 0xA is the oldest root
- // We executed 0xA and a couple of rounds later, we mark 0xA as executed and snoozed that forever which removes it from the queue.
- // [0xB - 2010-10-11, 0xC - 2010-10-12]
- // Now the search filter wil be 0xA timestamp -> [2010-10-11, 20-10-15]
- // If roots are executed out of order, it's not going to change anything. However, for most of the cases we have sequential root execution and that is
- // a huge improvement because we don't need to fetch all the roots from the database in every round.
- unexecutedRootsQueue *orderedmap.OrderedMap[string, time.Time]
- oldestRootTimestamp time.Time
- rootsQueueMu sync.RWMutex
-
- // Both rootSnoozedTime and messageVisibilityInterval can be kept in the commitRootsCache without need to be updated.
- // Those config properties are populates via onchain/offchain config. When changed, OCR plugin will be restarted and cache initialized with new config.
- rootSnoozedTime time.Duration
- messageVisibilityInterval time.Duration
+func NewCommitRootsCache(
+ lggr logger.Logger,
+ reader ccip.CommitStoreReader,
+ messageVisibilityInterval time.Duration,
+ rootSnoozeTime time.Duration,
+) CommitsRootsCache {
+ return newCommitRootsCache(
+ lggr,
+ reader,
+ messageVisibilityInterval,
+ rootSnoozeTime,
+ CleanupInterval,
+ EvictionGracePeriod,
+ )
}
func newCommitRootsCache(
lggr logger.Logger,
+ reader ccip.CommitStoreReader,
messageVisibilityInterval time.Duration,
rootSnoozeTime time.Duration,
- evictionGracePeriod time.Duration,
cleanupInterval time.Duration,
+ evictionGracePeriod time.Duration,
) *commitRootsCache {
- executedRoots := cache.New(messageVisibilityInterval+evictionGracePeriod, cleanupInterval)
snoozedRoots := cache.New(rootSnoozeTime, cleanupInterval)
+ executedRoots := cache.New(messageVisibilityInterval+evictionGracePeriod, cleanupInterval)
return &commitRootsCache{
- lggr: lggr,
- executedRoots: executedRoots,
- snoozedRoots: snoozedRoots,
- unexecutedRootsQueue: orderedmap.New[string, time.Time](),
- rootSnoozedTime: rootSnoozeTime,
- messageVisibilityInterval: messageVisibilityInterval,
+ lggr: lggr,
+ reader: reader,
+ rootSnoozeTime: rootSnoozeTime,
+ finalizedRoots: orderedmap.New[string, ccip.CommitStoreReportWithTxMeta](),
+ executedRoots: executedRoots,
+ snoozedRoots: snoozedRoots,
+ messageVisibilityInterval: messageVisibilityInterval,
+ latestFinalizedCommitRootTs: time.Now().Add(-messageVisibilityInterval),
+ cacheMu: sync.RWMutex{},
}
}
-func NewCommitRootsCache(
- lggr logger.Logger,
- messageVisibilityInterval time.Duration,
- rootSnoozeTime time.Duration,
-) *commitRootsCache {
- return newCommitRootsCache(
- lggr,
- messageVisibilityInterval,
- rootSnoozeTime,
- EvictionGracePeriod,
- CleanupInterval,
- )
+type commitRootsCache struct {
+ lggr logger.Logger
+ reader ccip.CommitStoreReader
+ messageVisibilityInterval time.Duration
+ rootSnoozeTime time.Duration
+
+ // Mutable state. finalizedRoots is thread-safe by default, but updating latestFinalizedCommitRootTs and finalizedRoots requires locking.
+ cacheMu sync.RWMutex
+ // finalizedRoots is a map of merkleRoot -> CommitStoreReportWithTxMeta. It stores all the CommitReports that are
+ // marked as finalized by LogPoller, but not executed yet. Keeping only finalized reports doesn't require any state sync between LP and the cache.
+ // In order to keep this map size under control, we evict stale items every time we fetch new logs from the database.
+ // Also, ccip.CommitStoreReportWithTxMeta is a very tiny entity with almost fixed size, so it's not a big deal to keep it in memory.
+ // In case of high memory footprint caused by storing roots, we can make these even more lightweight by removing token/gas price updates.
+ // Whenever the root is executed (all messages executed and ExecutionStateChange events are finalized), we remove the root from the map.
+ finalizedRoots *orderedmap.OrderedMap[string, ccip.CommitStoreReportWithTxMeta]
+ // snoozedRoots used only for temporary snoozing roots. It's a cache with TTL (usually around 5 minutes, but this configuration is set up on chain using rootSnoozeTime)
+ snoozedRoots *cache.Cache
+ // executedRoots is a cache with TTL (usually around 8 hours, but this configuration is set up on chain using messageVisibilityInterval).
+ // We keep executed roots there to make sure we don't accidentally try to reprocess already executed CommitReport
+ executedRoots *cache.Cache
+ // latestFinalizedCommitRootTs is the timestamp of the latest finalized commit root (youngest in terms of timestamp).
+ // It's used get only the logs that were considered as unfinalized in a previous run.
+ // This way we limit database scans to the minimum and keep polling "unfinalized" part of the ReportAccepted events queue.
+ latestFinalizedCommitRootTs time.Time
}
-func (s *commitRootsCache) IsSkipped(merkleRoot [32]byte) bool {
- _, snoozed := s.snoozedRoots.Get(merkleRootToString(merkleRoot))
- _, executed := s.executedRoots.Get(merkleRootToString(merkleRoot))
- return snoozed || executed
+func (r *commitRootsCache) RootsEligibleForExecution(ctx context.Context) ([]ccip.CommitStoreReport, error) {
+ // 1. Fetch all the logs from the database after the latest finalized commit root timestamp.
+ // If this is a first run, it will fetch all the logs based on the messageVisibilityInterval.
+ // Worst case scenario, it will fetch around 480 reports (OCR Commit 60 seconds (fast chains default) * messageVisibilityInterval set to 8 hours (mainnet default))
+ // Even with the larger messageVisibilityInterval window (e.g. 24 hours) it should be acceptable (around 1500 logs).
+ // Keep in mind that this potentially heavy operation happens only once during the plugin boot and it's no different from the previous implementation.
+ logs, err := r.fetchLogsFromCommitStore(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ // 2. Iterate over the logs and check if the root is finalized or not. Return finalized and unfinalized reports
+ // It promotes finalized roots to the finalizedRoots map and evicts stale roots.
+ finalizedReports, unfinalizedReports := r.updateFinalizedRoots(logs)
+
+ // 3. Join finalized commit reports with unfinalized reports and outfilter snoozed roots.
+ // Return only the reports that are not snoozed.
+ return r.pickReadyToExecute(finalizedReports, unfinalizedReports), nil
}
-func (s *commitRootsCache) MarkAsExecuted(merkleRoot [32]byte) {
+// MarkAsExecuted marks the root as executed. It means that all the messages from the root were executed and the ExecutionStateChange event was finalized.
+// Executed roots are removed from the cache.
+func (r *commitRootsCache) MarkAsExecuted(merkleRoot [32]byte) {
prettyMerkleRoot := merkleRootToString(merkleRoot)
- s.executedRoots.SetDefault(prettyMerkleRoot, struct{}{})
+ r.lggr.Infow("Marking root as executed and removing entirely from cache", "merkleRoot", prettyMerkleRoot)
- s.rootsQueueMu.Lock()
- defer s.rootsQueueMu.Unlock()
- // if there is only one root in the queue, we put its block_timestamp as oldestRootTimestamp
- if s.unexecutedRootsQueue.Len() == 1 {
- s.oldestRootTimestamp = s.unexecutedRootsQueue.Oldest().Value
- }
- s.unexecutedRootsQueue.Delete(prettyMerkleRoot)
- if head := s.unexecutedRootsQueue.Oldest(); head != nil {
- s.oldestRootTimestamp = head.Value
- }
- s.lggr.Debugw("Deleting executed root from the queue",
- "merkleRoot", prettyMerkleRoot,
- "oldestRootTimestamp", s.oldestRootTimestamp,
- )
+ r.cacheMu.Lock()
+ defer r.cacheMu.Unlock()
+ r.finalizedRoots.Delete(prettyMerkleRoot)
+ r.executedRoots.SetDefault(prettyMerkleRoot, struct{}{})
}
-func (s *commitRootsCache) Snooze(merkleRoot [32]byte) {
- s.snoozedRoots.SetDefault(merkleRootToString(merkleRoot), struct{}{})
+// Snooze temporarily snoozes the root. It means that the root is not eligible for execution for a certain period of time.
+// Snoozed roots are skipped when calling RootsEligibleForExecution
+func (r *commitRootsCache) Snooze(merkleRoot [32]byte) {
+ prettyMerkleRoot := merkleRootToString(merkleRoot)
+ r.lggr.Infow("Snoozing root temporarily", "merkleRoot", prettyMerkleRoot, "rootSnoozeTime", r.rootSnoozeTime)
+ r.snoozedRoots.SetDefault(prettyMerkleRoot, struct{}{})
}
-func (s *commitRootsCache) OldestRootTimestamp() time.Time {
- return time.Now().Add(-s.messageVisibilityInterval)
- // TODO we can't rely on block timestamps, because in case of re-org they can change and therefore affect
- // the logic in the case. In the meantime, always fallback to the default behaviour and use permissionlessThresholdWindow
- //timestamp, ok := s.pickOldestRootBlockTimestamp(messageVisibilityInterval)
- //
- //if ok {
- // return timestamp
- //}
- //
- //s.rootsQueueMu.Lock()
- //defer s.rootsQueueMu.Unlock()
- //
- //// If rootsSearchFilter is before messageVisibilityInterval, it means that we have roots that are stuck forever and will never be executed
- //// In that case, we wipe out the entire queue. Next round should start from the messageVisibilityInterval and rebuild cache from scratch.
- //s.unexecutedRootsQueue = orderedmap.New[string, time.Time]()
- //return messageVisibilityInterval
+func (r *commitRootsCache) isSnoozed(merkleRoot [32]byte) bool {
+ _, snoozed := r.snoozedRoots.Get(merkleRootToString(merkleRoot))
+ return snoozed
}
-//func (s *commitRootsCache) pickOldestRootBlockTimestamp(messageVisibilityInterval time.Time) (time.Time, bool) {
-// s.rootsQueueMu.RLock()
-// defer s.rootsQueueMu.RUnlock()
-//
-// // If there are no roots in the queue, we can return the messageVisibilityInterval
-// if s.oldestRootTimestamp.IsZero() {
-// return messageVisibilityInterval, true
-// }
-//
-// if s.oldestRootTimestamp.After(messageVisibilityInterval) {
-// // Query used for fetching roots from the database is exclusive (block_timestamp > :timestamp)
-// // so we need to subtract 1 second from the head timestamp to make sure that this root is included in the results
-// return s.oldestRootTimestamp.Add(-time.Second), true
-// }
-// return time.Time{}, false
-//}
-
-func (s *commitRootsCache) AppendUnexecutedRoot(merkleRoot [32]byte, blockTimestamp time.Time) {
- prettyMerkleRoot := merkleRootToString(merkleRoot)
+func (r *commitRootsCache) isExecuted(merkleRoot [32]byte) bool {
+ _, executed := r.executedRoots.Get(merkleRootToString(merkleRoot))
+ return executed
+}
- s.rootsQueueMu.Lock()
- defer s.rootsQueueMu.Unlock()
+func (r *commitRootsCache) fetchLogsFromCommitStore(ctx context.Context) ([]ccip.CommitStoreReportWithTxMeta, error) {
+ r.cacheMu.Lock()
+ messageVisibilityWindow := time.Now().Add(-r.messageVisibilityInterval)
+ if r.latestFinalizedCommitRootTs.Before(messageVisibilityWindow) {
+ r.latestFinalizedCommitRootTs = messageVisibilityWindow
+ }
+ commitRootsFilterTimestamp := r.latestFinalizedCommitRootTs
+ r.cacheMu.Unlock()
- // If the root is already in the queue, we must not add it to the queue
- if _, found := s.unexecutedRootsQueue.Get(prettyMerkleRoot); found {
- return
+ // IO operation, release lock before!
+ r.lggr.Infow("Fetching Commit Reports with timestamp greater than or equal to", "blockTimestamp", commitRootsFilterTimestamp)
+ return r.reader.GetAcceptedCommitReportsGteTimestamp(ctx, commitRootsFilterTimestamp, 0)
+}
+
+func (r *commitRootsCache) updateFinalizedRoots(logs []ccip.CommitStoreReportWithTxMeta) ([]ccip.CommitStoreReportWithTxMeta, []ccip.CommitStoreReportWithTxMeta) {
+ r.cacheMu.Lock()
+ defer r.cacheMu.Unlock()
+
+ // Assuming logs are properly ordered by block_timestamp, log_index
+ var unfinalizedReports []ccip.CommitStoreReportWithTxMeta
+ for _, log := range logs {
+ prettyMerkleRoot := merkleRootToString(log.MerkleRoot)
+ // Defensive check, if something is marked as executed, never allow it to come back to the cache
+ if r.isExecuted(log.MerkleRoot) {
+ r.lggr.Debugw("Ignoring root marked as executed", "merkleRoot", prettyMerkleRoot, "blockTimestamp", log.BlockTimestampUnixMilli)
+ continue
+ }
+
+ if log.IsFinalized() {
+ r.lggr.Debugw("Adding finalized root to cache", "merkleRoot", prettyMerkleRoot, "blockTimestamp", log.BlockTimestampUnixMilli)
+ r.finalizedRoots.Store(prettyMerkleRoot, log)
+ } else {
+ r.lggr.Debugw("Bypassing unfinalized root", "merkleRoot", prettyMerkleRoot, "blockTimestamp", log.BlockTimestampUnixMilli)
+ unfinalizedReports = append(unfinalizedReports, log)
+ }
+ }
+
+ if newest := r.finalizedRoots.Newest(); newest != nil {
+ r.latestFinalizedCommitRootTs = time.UnixMilli(newest.Value.BlockTimestampUnixMilli)
}
- // If the root is already executed, we must not add it to the queue
- if _, executed := s.executedRoots.Get(prettyMerkleRoot); executed {
- return
+
+ var finalizedRoots []ccip.CommitStoreReportWithTxMeta
+ var rootsToDelete []string
+
+ messageVisibilityWindow := time.Now().Add(-r.messageVisibilityInterval)
+ for pair := r.finalizedRoots.Oldest(); pair != nil; pair = pair.Next() {
+ // Mark items as stale if they are older than the messageVisibilityInterval
+ // SortedMap doesn't allow to iterate and delete, so we mark roots for deletion and remove them in a separate loop
+ if time.UnixMilli(pair.Value.BlockTimestampUnixMilli).Before(messageVisibilityWindow) {
+ rootsToDelete = append(rootsToDelete, pair.Key)
+ continue
+ }
+ finalizedRoots = append(finalizedRoots, pair.Value)
}
- // Initialize the search filter with the first root that is added to the queue
- if s.unexecutedRootsQueue.Len() == 0 {
- s.oldestRootTimestamp = blockTimestamp
+
+ // Remove stale items
+ for _, root := range rootsToDelete {
+ r.finalizedRoots.Delete(root)
}
- s.unexecutedRootsQueue.Set(prettyMerkleRoot, blockTimestamp)
- s.lggr.Debugw("Adding unexecuted root to the queue",
- "merkleRoot", prettyMerkleRoot,
- "blockTimestamp", blockTimestamp,
- "oldestRootTimestamp", s.oldestRootTimestamp,
- )
+
+ return finalizedRoots, unfinalizedReports
+}
+
+func (r *commitRootsCache) pickReadyToExecute(r1 []ccip.CommitStoreReportWithTxMeta, r2 []ccip.CommitStoreReportWithTxMeta) []ccip.CommitStoreReport {
+ allReports := append(r1, r2...)
+ eligibleReports := make([]ccip.CommitStoreReport, 0, len(allReports))
+ for _, report := range allReports {
+ if r.isSnoozed(report.MerkleRoot) {
+ r.lggr.Debugw("Skipping snoozed root",
+ "minSeqNr", report.Interval.Min,
+ "maxSeqNr", report.Interval.Max,
+ "merkleRoot", merkleRootToString(report.MerkleRoot))
+ continue
+ }
+ eligibleReports = append(eligibleReports, report.CommitStoreReport)
+ }
+ // safety check, probably not needed
+ slices.SortFunc(eligibleReports, func(i, j ccip.CommitStoreReport) int {
+ return int(i.Interval.Min - j.Interval.Min)
+ })
+ return eligibleReports
+}
+
+// internal use only for testing
+func (r *commitRootsCache) finalizedCachedLogs() []ccip.CommitStoreReport {
+ r.cacheMu.RLock()
+ defer r.cacheMu.RUnlock()
+
+ var finalizedRoots []ccip.CommitStoreReport
+ for pair := r.finalizedRoots.Oldest(); pair != nil; pair = pair.Next() {
+ finalizedRoots = append(finalizedRoots, pair.Value.CommitStoreReport)
+ }
+ return finalizedRoots
}
-func merkleRootToString(merkleRoot [32]byte) string {
- return hex.EncodeToString(merkleRoot[:])
+func merkleRootToString(merkleRoot ccip.Hash) string {
+ return merkleRoot.String()
}
diff --git a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go
index f79e365d0c..dc0a844349 100644
--- a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_test.go
@@ -1,247 +1,297 @@
-package cache
+package cache_test
import (
+ "math/big"
"testing"
"time"
- "github.com/stretchr/testify/assert"
+ "github.com/ethereum/go-ethereum/common"
+ "github.com/stretchr/testify/require"
+ cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
+ ubig "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils/big"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/commit_store_1_2_0"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
+ "github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
"github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/cache"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0"
)
-func TestSnoozedRoots(t *testing.T) {
- c := NewCommitRootsCache(logger.TestLogger(t), 1*time.Minute, 1*time.Minute)
+func Test_RootsEligibleForExecution(t *testing.T) {
+ ctx := testutils.Context(t)
+ chainID := testutils.NewRandomEVMChainID()
+ orm := logpoller.NewORM(chainID, pgtest.NewSqlxDB(t), logger.TestLogger(t))
+ lpOpts := logpoller.Opts{
+ PollPeriod: time.Hour,
+ FinalityDepth: 2,
+ BackfillBatchSize: 20,
+ RpcBatchSize: 10,
+ KeepFinalizedBlocksDepth: 1000,
+ }
+ lp := logpoller.NewLogPoller(orm, nil, logger.TestLogger(t), nil, lpOpts)
- k1 := [32]byte{1}
- k2 := [32]byte{2}
+ commitStoreAddr := utils.RandomAddress()
- // return false for non existing element
- snoozed := c.IsSkipped(k1)
- assert.False(t, snoozed)
+ block2 := time.Now().Add(-8 * time.Hour)
+ block3 := time.Now().Add(-5 * time.Hour)
+ block4 := time.Now().Add(-1 * time.Hour)
+ newBlock4 := time.Now().Add(-2 * time.Hour)
+ block5 := time.Now()
- // after an element is marked as executed it should be snoozed
- c.MarkAsExecuted(k1)
- snoozed = c.IsSkipped(k1)
- assert.True(t, snoozed)
+ root1 := utils.RandomBytes32()
+ root2 := utils.RandomBytes32()
+ root3 := utils.RandomBytes32()
+ root4 := utils.RandomBytes32()
+ root5 := utils.RandomBytes32()
- // after snoozing an element it should be snoozed
- c.Snooze(k2)
- snoozed = c.IsSkipped(k2)
- assert.True(t, snoozed)
+ inputLogs := []logpoller.Log{
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 1, root1, block2),
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 2, root2, block2),
+ }
+ require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.NewLogPollerBlock(utils.RandomBytes32(), 2, time.Now(), 1)))
+
+ commitStore, err := v1_2_0.NewCommitStore(logger.TestLogger(t), commitStoreAddr, nil, lp)
+ require.NoError(t, err)
+
+ rootsCache := cache.NewCommitRootsCache(logger.TestLogger(t), commitStore, 10*time.Hour, time.Second)
+
+ roots, err := rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root1, root2)
+
+ rootsCache.Snooze(root1)
+ rootsCache.Snooze(root2)
+
+ // Roots are snoozed
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots)
+
+ // Roots are unsnoozed
+ require.Eventually(t, func() bool {
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ return len(roots) == 2
+ }, 5*time.Second, 1*time.Second)
+
+ // Marking root as executed doesn't ignore other roots from the same block
+ rootsCache.MarkAsExecuted(root1)
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root2)
+
+ // Finality progress, mark all roots as finalized
+ require.NoError(t, orm.InsertBlock(ctx, utils.RandomBytes32(), 3, time.Now(), 3))
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root2)
+
+ inputLogs = []logpoller.Log{
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 3, 1, root3, block3),
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 4, 1, root4, block4),
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 5, 1, root5, block5),
+ }
+ require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.NewLogPollerBlock(utils.RandomBytes32(), 5, time.Now(), 3)))
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root2, root3, root4, root5)
+
+ // Mark root in the middle as executed but keep the oldest one still waiting
+ rootsCache.MarkAsExecuted(root3)
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root2, root4, root5)
+
+ // Simulate reorg by removing all unfinalized blocks
+ require.NoError(t, orm.DeleteLogsAndBlocksAfter(ctx, 4))
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root2)
+
+ // Root4 comes back but with the different block_timestamp (before the reorged block)
+ inputLogs = []logpoller.Log{
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 4, 1, root4, newBlock4),
+ }
+ require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.NewLogPollerBlock(utils.RandomBytes32(), 5, time.Now(), 3)))
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root2, root4)
+
+ // Mark everything as executed
+ rootsCache.MarkAsExecuted(root2)
+ rootsCache.MarkAsExecuted(root4)
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots)
}
-func TestEvictingElements(t *testing.T) {
- c := newCommitRootsCache(logger.TestLogger(t), 1*time.Hour, 1*time.Millisecond, 1*time.Millisecond, 1*time.Millisecond)
+func Test_RootsEligibleForExecutionWithReorgs(t *testing.T) {
+ ctx := testutils.Context(t)
+ chainID := testutils.NewRandomEVMChainID()
+ orm := logpoller.NewORM(chainID, pgtest.NewSqlxDB(t), logger.TestLogger(t))
+ lpOpts := logpoller.Opts{
+ PollPeriod: time.Hour,
+ FinalityDepth: 2,
+ BackfillBatchSize: 20,
+ RpcBatchSize: 10,
+ KeepFinalizedBlocksDepth: 1000,
+ }
+ lp := logpoller.NewLogPoller(orm, nil, logger.TestLogger(t), nil, lpOpts)
- k1 := [32]byte{1}
- c.Snooze(k1)
+ commitStoreAddr := utils.RandomAddress()
- time.Sleep(10 * time.Millisecond)
+ block1 := time.Now().Add(-8 * time.Hour)
+ block2 := time.Now().Add(-5 * time.Hour)
+ block3 := time.Now().Add(-2 * time.Hour)
+ block4 := time.Now().Add(-1 * time.Hour)
- assert.False(t, c.IsSkipped(k1))
-}
+ root1 := utils.RandomBytes32()
+ root2 := utils.RandomBytes32()
+ root3 := utils.RandomBytes32()
-func Test_UnexecutedRoots(t *testing.T) {
- type rootWithTs struct {
- root [32]byte
- ts time.Time
+ // Genesis block
+ require.NoError(t, orm.InsertBlock(ctx, utils.RandomBytes32(), 1, block1, 1))
+ inputLogs := []logpoller.Log{
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 1, root1, block2),
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 2, root2, block2),
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 3, 1, root3, block3),
}
+ require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.NewLogPollerBlock(utils.RandomBytes32(), 3, time.Now(), 1)))
- r1 := [32]byte{1}
- r2 := [32]byte{2}
- r3 := [32]byte{3}
-
- t1 := time.Now().Add(-4 * time.Hour)
- t2 := time.Now().Add(-3 * time.Hour)
- t3 := time.Now().Add(-2 * time.Hour)
-
- tests := []struct {
- name string
- roots []rootWithTs
- executedRoots [][32]byte
- permissionLessThreshold time.Duration
- expectedTimestamp time.Time
- }{
- {
- name: "empty",
- roots: []rootWithTs{},
- permissionLessThreshold: 1 * time.Hour,
- },
- //{
- // name: "returns first root when all are not executed",
- // roots: []rootWithTs{
- // {r1, t1},
- // {r2, t2},
- // {r3, t3},
- // },
- // permissionLessThreshold: 10 * time.Hour,
- // expectedTimestamp: t1,
- //},
- //{
- // name: "returns first root when tail of queue is executed",
- // roots: []rootWithTs{
- // {r1, t1},
- // {r2, t2},
- // {r3, t3},
- // },
- // executedRoots: [][32]byte{r2, r3},
- // permissionLessThreshold: 10 * time.Hour,
- // expectedTimestamp: t1,
- //},
- //{
- // name: "returns first not executed root",
- // roots: []rootWithTs{
- // {r1, t1},
- // {r2, t2},
- // {r3, t3},
- // },
- // executedRoots: [][32]byte{r1, r2},
- // permissionLessThreshold: 10 * time.Hour,
- // expectedTimestamp: t3,
- //},
- //{
- // name: "returns r2 timestamp when r1 and r3 are executed",
- // roots: []rootWithTs{
- // {r1, t1},
- // {r2, t2},
- // {r3, t3},
- // },
- // executedRoots: [][32]byte{r1, r3},
- // permissionLessThreshold: 10 * time.Hour,
- // expectedTimestamp: t2,
- //},
- //{
- // name: "returns oldest root even when all are executed",
- // roots: []rootWithTs{
- // {r1, t1},
- // {r2, t2},
- // {r3, t3},
- // },
- // executedRoots: [][32]byte{r1, r2, r3},
- // permissionLessThreshold: 10 * time.Hour,
- // expectedTimestamp: t3,
- //},
- {
- name: "returns permissionLessThreshold when all roots ale older that threshold",
- roots: []rootWithTs{
- {r1, t1},
- {r2, t2},
- {r3, t3},
- },
- permissionLessThreshold: 1 * time.Minute,
- },
- }
+ commitStore, err := v1_2_0.NewCommitStore(logger.TestLogger(t), commitStoreAddr, nil, lp)
+ require.NoError(t, err)
+
+ rootsCache := cache.NewCommitRootsCache(logger.TestLogger(t), commitStore, 10*time.Hour, time.Second)
+
+ // Get all including finalized and unfinalized
+ roots, err := rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root1, root2, root3)
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- c := newCommitRootsCache(logger.TestLogger(t), tt.permissionLessThreshold, 1*time.Hour, 1*time.Millisecond, 1*time.Millisecond)
-
- for _, r := range tt.roots {
- c.AppendUnexecutedRoot(r.root, r.ts)
- }
-
- for _, r := range tt.executedRoots {
- c.MarkAsExecuted(r)
- }
-
- commitTs := c.OldestRootTimestamp()
- if tt.expectedTimestamp.IsZero() {
- assert.True(t, commitTs.Before(time.Now().Add(-tt.permissionLessThreshold)))
- } else {
- assert.Equal(t, tt.expectedTimestamp.Add(-time.Second), commitTs)
- }
- })
+ // Reorg everything away
+ require.NoError(t, orm.DeleteLogsAndBlocksAfter(ctx, 2))
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots)
+
+ // Reinsert the logs, mark first one as finalized
+ inputLogs = []logpoller.Log{
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 3, 1, root1, block3),
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 4, 1, root2, block4),
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 4, 2, root3, block4),
}
+ require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.NewLogPollerBlock(utils.RandomBytes32(), 5, time.Now(), 3)))
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root1, root2, root3)
+
+ // Reorg away everything except the finalized one
+ require.NoError(t, orm.DeleteLogsAndBlocksAfter(ctx, 4))
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root1)
}
-func Test_UnexecutedRootsScenario(t *testing.T) {
- permissionLessThreshold := 10 * time.Hour
- c := newCommitRootsCache(logger.TestLogger(t), permissionLessThreshold, 1*time.Hour, 1*time.Millisecond, 1*time.Millisecond)
-
- k1 := [32]byte{1}
- k2 := [32]byte{2}
- k3 := [32]byte{3}
- //k4 := [32]byte{4}
-
- t1 := time.Now().Add(-4 * time.Hour)
- t2 := time.Now().Add(-3 * time.Hour)
- t3 := time.Now().Add(-2 * time.Hour)
- //t4 := time.Now().Add(-1 * time.Hour)
-
- // First check should return permissionLessThreshold window
- commitTs := c.OldestRootTimestamp()
- assert.True(t, commitTs.Before(time.Now().Add(-permissionLessThreshold)))
-
- c.AppendUnexecutedRoot(k1, t1)
- c.AppendUnexecutedRoot(k2, t2)
- c.AppendUnexecutedRoot(k3, t3)
-
- commitTs = c.OldestRootTimestamp()
- assert.True(t, commitTs.Before(time.Now().Add(-permissionLessThreshold)))
-
- //// After loading roots it should return the first one
- //commitTs = c.OldestRootTimestamp()
- //assert.Equal(t, t1.Add(-time.Second), commitTs)
- //
- //// Marking root in the middle as executed shouldn't change the commitTs
- //c.MarkAsExecuted(k2)
- //commitTs = c.OldestRootTimestamp()
- //assert.Equal(t, t1.Add(-time.Second), commitTs)
- //
- //// Marking k1 as executed when k2 is already executed should return timestamp of k3
- //c.MarkAsExecuted(k1)
- //commitTs = c.OldestRootTimestamp()
- //assert.Equal(t, t3.Add(-time.Second), commitTs)
- //
- //// Marking all as executed should return timestamp of the latest
- //c.MarkAsExecuted(k3)
- //commitTs = c.OldestRootTimestamp()
- //assert.Equal(t, t3.Add(-time.Second), commitTs)
- //
- //// Adding k4 should return timestamp of k4
- //c.AppendUnexecutedRoot(k4, t4)
- //commitTs = c.OldestRootTimestamp()
- //assert.Equal(t, t4.Add(-time.Second), commitTs)
- //
- //c.MarkAsExecuted(k4)
- //commitTs = c.OldestRootTimestamp()
- //assert.Equal(t, t4.Add(-time.Second), commitTs)
- //
- //// Appending already executed roots should be ignored
- //c.AppendUnexecutedRoot(k1, t1)
- //c.AppendUnexecutedRoot(k2, t2)
- //commitTs = c.OldestRootTimestamp()
- //assert.Equal(t, t4.Add(-time.Second), commitTs)
-}
+// Not very likely, but let's be more defensive here and verify if cache works properly and can deal with duplicates
+func Test_BlocksWithTheSameTimestamps(t *testing.T) {
+ ctx := testutils.Context(t)
+ chainID := testutils.NewRandomEVMChainID()
+ orm := logpoller.NewORM(chainID, pgtest.NewSqlxDB(t), logger.TestLogger(t))
+ lpOpts := logpoller.Opts{
+ PollPeriod: time.Hour,
+ FinalityDepth: 2,
+ BackfillBatchSize: 20,
+ RpcBatchSize: 10,
+ KeepFinalizedBlocksDepth: 1000,
+ }
+ lp := logpoller.NewLogPoller(orm, nil, logger.TestLogger(t), nil, lpOpts)
-func Test_UnexecutedRootsStaleQueue(t *testing.T) {
- t.Skip("This test needs caching to properly handle re-orgs")
+ commitStoreAddr := utils.RandomAddress()
- permissionLessThreshold := 5 * time.Hour
- c := newCommitRootsCache(logger.TestLogger(t), permissionLessThreshold, 1*time.Hour, 1*time.Millisecond, 1*time.Millisecond)
+ block := time.Now().Add(-1 * time.Hour).Truncate(time.Second)
+ root1 := utils.RandomBytes32()
+ root2 := utils.RandomBytes32()
- k1 := [32]byte{1}
- k2 := [32]byte{2}
- k3 := [32]byte{3}
+ inputLogs := []logpoller.Log{
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 2, 1, root1, block),
+ }
+ require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.NewLogPollerBlock(utils.RandomBytes32(), 2, time.Now(), 2)))
+
+ commitStore, err := v1_2_0.NewCommitStore(logger.TestLogger(t), commitStoreAddr, nil, lp)
+ require.NoError(t, err)
- t1 := time.Now().Add(-4 * time.Hour)
- t2 := time.Now().Add(-3 * time.Hour)
- t3 := time.Now().Add(-2 * time.Hour)
+ rootsCache := cache.NewCommitRootsCache(logger.TestLogger(t), commitStore, 10*time.Hour, time.Second)
+ roots, err := rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root1)
+
+ inputLogs = []logpoller.Log{
+ createReportAcceptedLog(t, chainID, commitStoreAddr, 3, 1, root2, block),
+ }
+ require.NoError(t, orm.InsertLogsWithBlock(ctx, inputLogs, logpoller.NewLogPollerBlock(utils.RandomBytes32(), 3, time.Now(), 3)))
- c.AppendUnexecutedRoot(k1, t1)
- c.AppendUnexecutedRoot(k2, t2)
- c.AppendUnexecutedRoot(k3, t3)
+ roots, err = rootsCache.RootsEligibleForExecution(ctx)
+ require.NoError(t, err)
+ assertRoots(t, roots, root1, root2)
+}
- // First check should return permissionLessThreshold window
- commitTs := c.OldestRootTimestamp()
- assert.Equal(t, t1.Add(-time.Second), commitTs)
+func assertRoots(t *testing.T, roots []cciptypes.CommitStoreReport, root ...[32]byte) {
+ require.Len(t, roots, len(root))
+ for i, r := range root {
+ require.Equal(t, r, roots[i].MerkleRoot)
+ }
+}
- // Reducing permissionLessExecutionThreshold works as speeding the clock
- c.messageVisibilityInterval = 1 * time.Hour
+func createReportAcceptedLog(t testing.TB, chainID *big.Int, address common.Address, blockNumber int64, logIndex int64, merkleRoot common.Hash, blockTimestamp time.Time) logpoller.Log {
+ tAbi, err := commit_store_1_2_0.CommitStoreMetaData.GetAbi()
+ require.NoError(t, err)
+ eseEvent, ok := tAbi.Events["ReportAccepted"]
+ require.True(t, ok)
+
+ gasPriceUpdates := make([]commit_store_1_2_0.InternalGasPriceUpdate, 100)
+ tokenPriceUpdates := make([]commit_store_1_2_0.InternalTokenPriceUpdate, 100)
+
+ for i := 0; i < 100; i++ {
+ gasPriceUpdates[i] = commit_store_1_2_0.InternalGasPriceUpdate{
+ DestChainSelector: uint64(i),
+ UsdPerUnitGas: big.NewInt(int64(i)),
+ }
+ tokenPriceUpdates[i] = commit_store_1_2_0.InternalTokenPriceUpdate{
+ SourceToken: utils.RandomAddress(),
+ UsdPerToken: big.NewInt(int64(i)),
+ }
+ }
- commitTs = c.OldestRootTimestamp()
- assert.True(t, commitTs.Before(time.Now().Add(-1*time.Hour)))
- assert.True(t, commitTs.After(t1))
- assert.True(t, commitTs.After(t2))
- assert.True(t, commitTs.After(t3))
+ message := commit_store_1_2_0.CommitStoreCommitReport{
+ PriceUpdates: commit_store_1_2_0.InternalPriceUpdates{
+ TokenPriceUpdates: tokenPriceUpdates,
+ GasPriceUpdates: gasPriceUpdates,
+ },
+ Interval: commit_store_1_2_0.CommitStoreInterval{Min: 1, Max: 10},
+ MerkleRoot: merkleRoot,
+ }
+
+ logData, err := eseEvent.Inputs.Pack(message)
+ require.NoError(t, err)
+
+ topic0 := commit_store_1_2_0.CommitStoreReportAccepted{}.Topic()
+
+ return logpoller.Log{
+ Topics: [][]byte{
+ topic0[:],
+ },
+ Data: logData,
+ LogIndex: logIndex,
+ BlockHash: utils.RandomBytes32(),
+ BlockNumber: blockNumber,
+ BlockTimestamp: blockTimestamp.Truncate(time.Millisecond),
+ EventSig: topic0,
+ Address: address,
+ TxHash: utils.RandomBytes32(),
+ EvmChainId: ubig.New(chainID),
+ }
}
diff --git a/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_unit_test.go b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_unit_test.go
new file mode 100644
index 0000000000..34a470ef90
--- /dev/null
+++ b/core/services/ocr2/plugins/ccip/internal/cache/commit_roots_unit_test.go
@@ -0,0 +1,212 @@
+package cache
+
+import (
+ "testing"
+ "time"
+
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/mock"
+ "github.com/stretchr/testify/require"
+
+ "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ "github.com/smartcontractkit/chainlink-common/pkg/utils/tests"
+
+ "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils"
+ "github.com/smartcontractkit/chainlink/v2/core/logger"
+ "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/mocks"
+)
+
+func Test_CacheIsInitializedWithFirstCall(t *testing.T) {
+ commitStoreReader := mocks.NewCommitStoreReader(t)
+ cache := newCommitRootsCache(logger.TestLogger(t), commitStoreReader, time.Hour, time.Hour, time.Hour, time.Hour)
+ commitStoreReader.On("GetAcceptedCommitReportsGteTimestamp", mock.Anything, mock.Anything, mock.Anything).Return([]ccip.CommitStoreReportWithTxMeta{}, nil)
+
+ roots, err := cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots)
+}
+
+func Test_CacheExpiration(t *testing.T) {
+ ts1 := time.Now().Add(-5 * time.Millisecond).Truncate(time.Millisecond)
+ ts2 := time.Now().Add(-3 * time.Millisecond).Truncate(time.Millisecond)
+ ts3 := time.Now().Add(-1 * time.Millisecond).Truncate(time.Millisecond)
+
+ root1 := utils.RandomBytes32()
+ root2 := utils.RandomBytes32()
+ root3 := utils.RandomBytes32()
+
+ commitStoreReader := mocks.NewCommitStoreReader(t)
+ cache := newCommitRootsCache(logger.TestLogger(t), commitStoreReader, time.Second, time.Hour, time.Hour, time.Hour)
+ mockCommitStoreReader(commitStoreReader, time.Time{}, []ccip.CommitStoreReportWithTxMeta{
+ createCommitStoreEntry(root1, ts1, true),
+ createCommitStoreEntry(root2, ts2, true),
+ createCommitStoreEntry(root3, ts3, false),
+ })
+ roots, err := cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots, root1, root2, root3)
+
+ require.Eventually(t, func() bool {
+ mockCommitStoreReader(commitStoreReader, time.Time{}, []ccip.CommitStoreReportWithTxMeta{
+ createCommitStoreEntry(root3, ts3, false),
+ })
+ roots, err = cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ return len(roots) == 1 && roots[0].MerkleRoot == root3
+ }, 5*time.Second, 1*time.Second)
+}
+
+func Test_CacheFullEviction(t *testing.T) {
+ commitStoreReader := mocks.NewCommitStoreReader(t)
+ cache := newCommitRootsCache(logger.TestLogger(t), commitStoreReader, 2*time.Second, 1*time.Second, time.Second, time.Second)
+
+ maxElements := 10000
+ commitRoots := make([]ccip.CommitStoreReportWithTxMeta, maxElements)
+ for i := 0; i < maxElements; i++ {
+ finalized := i >= maxElements/2
+ commitRoots[i] = createCommitStoreEntry(utils.RandomBytes32(), time.Now(), finalized)
+ }
+ mockCommitStoreReader(commitStoreReader, time.Time{}, commitRoots)
+
+ roots, err := cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ require.Len(t, roots, maxElements)
+
+ // Marks some of them as exeucted and some of them as snoozed
+ for i := 0; i < maxElements; i++ {
+ if i%3 == 0 {
+ cache.MarkAsExecuted(commitRoots[i].MerkleRoot)
+ }
+ if i%3 == 1 {
+ cache.Snooze(commitRoots[i].MerkleRoot)
+ }
+ }
+ // Eventually everything should be entirely removed from cache. We need that check to verify if cache doesn't grow indefinitely
+ require.Eventually(t, func() bool {
+ mockCommitStoreReader(commitStoreReader, time.Time{}, []ccip.CommitStoreReportWithTxMeta{})
+ roots1, err1 := cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err1)
+
+ return len(roots1) == 0 &&
+ cache.finalizedRoots.Len() == 0 &&
+ len(cache.snoozedRoots.Items()) == 0 &&
+ len(cache.executedRoots.Items()) == 0
+ }, 10*time.Second, time.Second)
+}
+
+func Test_CacheProgression_Internal(t *testing.T) {
+ ts1 := time.Now().Add(-5 * time.Hour).Truncate(time.Millisecond)
+ ts2 := time.Now().Add(-3 * time.Hour).Truncate(time.Millisecond)
+ ts3 := time.Now().Add(-1 * time.Hour).Truncate(time.Millisecond)
+
+ root1 := utils.RandomBytes32()
+ root2 := utils.RandomBytes32()
+ root3 := utils.RandomBytes32()
+
+ commitStoreReader := mocks.NewCommitStoreReader(t)
+
+ cache := newCommitRootsCache(logger.TestLogger(t), commitStoreReader, 10*time.Hour, time.Hour, time.Hour, time.Hour)
+
+ // Empty cache, no results from the reader
+ mockCommitStoreReader(commitStoreReader, time.Time{}, []ccip.CommitStoreReportWithTxMeta{})
+ roots, err := cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots)
+ assertRoots(t, cache.finalizedCachedLogs())
+
+ // Single unfinalized root returned
+ mockCommitStoreReader(commitStoreReader, time.Time{}, []ccip.CommitStoreReportWithTxMeta{createCommitStoreEntry(root1, ts1, false)})
+ roots, err = cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots, root1)
+ assertRoots(t, cache.finalizedCachedLogs())
+
+ // Finalized and unfinalized roots returned
+ mockCommitStoreReader(commitStoreReader, time.Time{}, []ccip.CommitStoreReportWithTxMeta{
+ createCommitStoreEntry(root1, ts1, true),
+ createCommitStoreEntry(root2, ts2, false),
+ })
+ roots, err = cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots, root1, root2)
+ assertRoots(t, cache.finalizedCachedLogs(), root1)
+
+ // Returning the same data should not impact cache state (no duplicates)
+ mockCommitStoreReader(commitStoreReader, ts1, []ccip.CommitStoreReportWithTxMeta{
+ createCommitStoreEntry(root1, ts1, true),
+ createCommitStoreEntry(root2, ts2, false),
+ })
+ roots, err = cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots, root1, root2)
+ assertRoots(t, cache.finalizedCachedLogs(), root1)
+
+ // Snoozing oldest root
+ cache.Snooze(root1)
+ mockCommitStoreReader(commitStoreReader, ts1, []ccip.CommitStoreReportWithTxMeta{
+ createCommitStoreEntry(root2, ts2, false),
+ createCommitStoreEntry(root3, ts3, false),
+ })
+ roots, err = cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots, root2, root3)
+ assertRoots(t, cache.finalizedCachedLogs(), root1)
+
+ // Snoozing everything
+ cache.Snooze(root2)
+ cache.Snooze(root3)
+ mockCommitStoreReader(commitStoreReader, ts1, []ccip.CommitStoreReportWithTxMeta{
+ createCommitStoreEntry(root2, ts2, true),
+ createCommitStoreEntry(root3, ts3, true),
+ })
+ roots, err = cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots)
+ assertRoots(t, cache.finalizedCachedLogs(), root1, root2, root3)
+
+ // Marking everything as executed removes it entirely, even if root is returned from the CommitStore
+ cache.MarkAsExecuted(root1)
+ cache.MarkAsExecuted(root2)
+ cache.MarkAsExecuted(root3)
+ mockCommitStoreReader(commitStoreReader, ts3, []ccip.CommitStoreReportWithTxMeta{
+ createCommitStoreEntry(root2, ts2, true),
+ createCommitStoreEntry(root3, ts3, true),
+ })
+ roots, err = cache.RootsEligibleForExecution(tests.Context(t))
+ require.NoError(t, err)
+ assertRoots(t, roots)
+ assertRoots(t, cache.finalizedCachedLogs())
+}
+
+func assertRoots(t *testing.T, reports []ccip.CommitStoreReport, expectedRoots ...[32]byte) {
+ require.Len(t, reports, len(expectedRoots))
+ for i, report := range reports {
+ assert.Equal(t, expectedRoots[i], report.MerkleRoot)
+ }
+}
+
+func mockCommitStoreReader(reader *mocks.CommitStoreReader, blockTimestamp time.Time, roots []ccip.CommitStoreReportWithTxMeta) {
+ if blockTimestamp.IsZero() {
+ reader.On("GetAcceptedCommitReportsGteTimestamp", mock.Anything, mock.Anything, mock.Anything).
+ Return(roots, nil).Once()
+ } else {
+ reader.On("GetAcceptedCommitReportsGteTimestamp", mock.Anything, blockTimestamp, mock.Anything).
+ Return(roots, nil).Once()
+ }
+}
+
+func createCommitStoreEntry(root [32]byte, ts time.Time, finalized bool) ccip.CommitStoreReportWithTxMeta {
+ status := ccip.FinalizedStatusNotFinalized
+ if finalized {
+ status = ccip.FinalizedStatusFinalized
+ }
+ return ccip.CommitStoreReportWithTxMeta{
+ CommitStoreReport: ccip.CommitStoreReport{
+ MerkleRoot: root,
+ },
+ TxMeta: ccip.TxMeta{
+ BlockTimestampUnixMilli: ts.UnixMilli(),
+ Finalized: status,
+ },
+ }
+}
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/commit_store.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/commit_store.go
index cfdf4d031b..3e58143a28 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/commit_store.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_0_0/commit_store.go
@@ -14,8 +14,9 @@ import (
"github.com/pkg/errors"
"github.com/smartcontractkit/chainlink-common/pkg/config"
-
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/query"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/gas"
@@ -330,12 +331,27 @@ func (c *CommitStore) GetCommitReportMatchingSeqNum(ctx context.Context, seqNr u
}
func (c *CommitStore) GetAcceptedCommitReportsGteTimestamp(ctx context.Context, ts time.Time, confs int) ([]cciptypes.CommitStoreReportWithTxMeta, error) {
- logs, err := c.lp.LogsCreatedAfter(
+ latestBlock, err := c.lp.LatestBlock(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ reportsQuery, err := query.Where(
+ c.address.String(),
+ logpoller.NewAddressFilter(c.address),
+ logpoller.NewEventSigFilter(c.reportAcceptedSig),
+ query.Timestamp(uint64(ts.Unix()), primitives.Gte),
+ logpoller.NewConfirmationsFilter(evmtypes.Confirmations(confs)),
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ logs, err := c.lp.FilteredLogs(
ctx,
- c.reportAcceptedSig,
- c.address,
- ts,
- evmtypes.Confirmations(confs),
+ reportsQuery,
+ query.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Asc)),
+ "GetAcceptedCommitReportsGteTimestamp",
)
if err != nil {
return nil, err
@@ -349,7 +365,7 @@ func (c *CommitStore) GetAcceptedCommitReportsGteTimestamp(ctx context.Context,
parsedReports := make([]cciptypes.CommitStoreReportWithTxMeta, 0, len(parsedLogs))
for _, log := range parsedLogs {
parsedReports = append(parsedReports, cciptypes.CommitStoreReportWithTxMeta{
- TxMeta: log.TxMeta,
+ TxMeta: log.TxMeta.WithFinalityStatus(uint64(latestBlock.FinalizedBlockNumber)),
CommitStoreReport: log.Data,
})
}
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go
index a21781e84c..7612e54419 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_2_0/commit_store.go
@@ -14,8 +14,9 @@ import (
"github.com/pkg/errors"
"github.com/smartcontractkit/chainlink-common/pkg/config"
-
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/query"
+ "github.com/smartcontractkit/chainlink-common/pkg/types/query/primitives"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/client"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/gas"
@@ -343,12 +344,27 @@ func (c *CommitStore) GetCommitReportMatchingSeqNum(ctx context.Context, seqNr u
}
func (c *CommitStore) GetAcceptedCommitReportsGteTimestamp(ctx context.Context, ts time.Time, confs int) ([]cciptypes.CommitStoreReportWithTxMeta, error) {
- logs, err := c.lp.LogsCreatedAfter(
+ latestBlock, err := c.lp.LatestBlock(ctx)
+ if err != nil {
+ return nil, err
+ }
+
+ reportsQuery, err := query.Where(
+ c.address.String(),
+ logpoller.NewAddressFilter(c.address),
+ logpoller.NewEventSigFilter(c.reportAcceptedSig),
+ query.Timestamp(uint64(ts.Unix()), primitives.Gte),
+ logpoller.NewConfirmationsFilter(evmtypes.Confirmations(confs)),
+ )
+ if err != nil {
+ return nil, err
+ }
+
+ logs, err := c.lp.FilteredLogs(
ctx,
- c.reportAcceptedSig,
- c.address,
- ts,
- evmtypes.Confirmations(confs),
+ reportsQuery,
+ query.NewLimitAndSort(query.Limit{}, query.NewSortBySequence(query.Asc)),
+ "GetAcceptedCommitReportsGteTimestamp",
)
if err != nil {
return nil, err
@@ -362,7 +378,7 @@ func (c *CommitStore) GetAcceptedCommitReportsGteTimestamp(ctx context.Context,
res := make([]cciptypes.CommitStoreReportWithTxMeta, 0, len(parsedLogs))
for _, log := range parsedLogs {
res = append(res, cciptypes.CommitStoreReportWithTxMeta{
- TxMeta: log.TxMeta,
+ TxMeta: log.TxMeta.WithFinalityStatus(uint64(latestBlock.FinalizedBlockNumber)),
CommitStoreReport: log.Data,
})
}
From c3ab9445127508de4e0362933f216e0702e7c3bc Mon Sep 17 00:00:00 2001
From: Adam Hamrick
Date: Wed, 31 Jul 2024 12:36:47 -0400
Subject: [PATCH 12/28] [TT-1426] Pings Proper Group for Compatibility Test
Failures (#1227)
## Motivation
## Solution
---
.github/actions/notify-slack-jobs-result/action.yml | 3 +++
.github/workflows/ccip-client-compatibility-tests.yml | 4 ++--
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/.github/actions/notify-slack-jobs-result/action.yml b/.github/actions/notify-slack-jobs-result/action.yml
index 1a95fe7585..d8fda4fb90 100644
--- a/.github/actions/notify-slack-jobs-result/action.yml
+++ b/.github/actions/notify-slack-jobs-result/action.yml
@@ -25,6 +25,9 @@ inputs:
slack_thread_ts:
description: "The Slack thread timestamp to post the message to, handy for keeping multiple related results in a single thread"
required: false
+ base64_parsed_results:
+ description: "Base64 encoded parsed results to use"
+ required: false
runs:
using: composite
diff --git a/.github/workflows/ccip-client-compatibility-tests.yml b/.github/workflows/ccip-client-compatibility-tests.yml
index c1090d4ddb..fb3584b165 100644
--- a/.github/workflows/ccip-client-compatibility-tests.yml
+++ b/.github/workflows/ccip-client-compatibility-tests.yml
@@ -613,7 +613,7 @@ jobs:
"type": "section",
"text": {
"type": "mrkdwn",
- "text": "${{ contains(join(needs.*.result, ','), 'failure') && 'Some tests failed, notifying <@U03GWA0NSF7>' || 'All Good!' }}"
+ "text": "${{ contains(join(needs.*.result, ','), 'failure') && 'Some tests failed! Notifying ' || 'All Good!' }}"
}
},
{
@@ -659,7 +659,7 @@ jobs:
PATH=$PATH:$(go env GOPATH)/bin
export PATH
- workflowresultparser -workflowRunID ${{ github.run_id }} -githubToken ${{ github.token }} -githubRepo "${{ github.repository }}" -jobNameRegex "^CCIP Compatibility with (.*?)$" -namedKey="CCIP" -outputFile=output.json
+ workflowresultparser -workflowRunID ${{ github.run_id }} -githubToken ${{ github.token }} -githubRepo "${{ github.repository }}" -jobNameRegex "^CCIP Compatibility with (.*)$" -namedKey="CCIP" -outputFile=output.json
echo "base64_parsed_results=$(base64 -w 0 output.json)" >> $GITHUB_OUTPUT
From ecdbf4cdab370742e411e38454af23256003ecf4 Mon Sep 17 00:00:00 2001
From: dimitris
Date: Thu, 1 Aug 2024 11:37:03 +0300
Subject: [PATCH 13/28] Add e2e test logs filtering doc and set default log
level to error (#1237)
1) Filtering logs on the e2e test is hard due to the massive amount of
them. Added some helpful commands to easily run the test and filter the
logs.
2) Set the default log level to error. The Info logs are useful only
when debugging and they make CI UI to heavy to load.
---
.../plugins/ccip_integration_tests/ocr3_node_test.go | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go b/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go
index 81fe06153f..7b8877d70f 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go
+++ b/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go
@@ -25,6 +25,15 @@ import (
"github.com/stretchr/testify/require"
)
+/*
+* If you want to debug, set log level to info and use the following commands for easier logs filtering.
+*
+* // Run the test and redirect logs to logs.txt
+* go test -v -run "^TestIntegration_OCR3Nodes" ./core/services/ocr3/plugins/ccip_integration_tests 2>&1 > logs.txt
+*
+* // Reads logs.txt as a stream and apply filters using grep
+* tail -fn0 logs.txt | grep "CCIPExecPlugin"
+ */
func TestIntegration_OCR3Nodes(t *testing.T) {
const (
numChains = 3 // number of chains that this test will run on
@@ -33,7 +42,7 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
simulatedBackendBlockTime = 900 * time.Millisecond // Simulated backend blocks committing interval
oraclesBootWaitTime = 30 * time.Second // Time to wait for oracles to come up (HACK)
fChain = 1 // fChain value for all the chains
- oracleLogLevel = zapcore.InfoLevel // Log level for the oracle / plugins.
+ oracleLogLevel = zapcore.ErrorLevel // Log level for the oracle / plugins.
)
t.Logf("creating %d universes", numChains)
From a2566c07ea9d09dbde768f010f1d596c838c7229 Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Thu, 1 Aug 2024 14:15:57 +0200
Subject: [PATCH 14/28] Misc onchain fixes (#1212)
Various minor onchain fixes
- improve accounting for token payload data
- rm old check in usdc pool
- fix comment on precompile range
- add transferLiquidity function to LockReleaseTokenPool
- move rate limit admin logic from lockRelease pool to TokenPool
New changes
- removed defaultTokenDestBytesOverhead and used
CCIP_LOCK_OR_BURN_V1_RET_BYTES as default value
- Add uint32 destGasAmount to the SourceTokenData struct to allow us to
send the amount we billed on source to dest
- This single value is used for the releaseOrMint and what is left after
that call is used for transfer
- Removed the defaults for releaseOrMint and transfer from the offRamp
---------
Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com>
---
contracts/gas-snapshots/ccip.gas-snapshot | 456 +++++++++---------
.../liquiditymanager.gas-snapshot | 8 +-
.../src/v0.8/ccip/libraries/Internal.sol | 66 ++-
contracts/src/v0.8/ccip/libraries/Pool.sol | 4 +-
.../src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol | 11 +-
.../src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol | 33 +-
.../v0.8/ccip/pools/LockReleaseTokenPool.sol | 50 +-
.../pools/LockReleaseTokenPoolAndProxy.sol | 46 +-
contracts/src/v0.8/ccip/pools/TokenPool.sol | 22 +-
.../v0.8/ccip/pools/USDC/USDCTokenPool.sol | 5 -
contracts/src/v0.8/ccip/test/BaseTest.t.sol | 4 +-
.../src/v0.8/ccip/test/NonceManager.t.sol | 1 -
.../ccip/test/legacy/TokenPoolAndProxy.t.sol | 128 +----
.../offRamp/EVM2EVMMultiOffRampSetup.t.sol | 6 +-
.../ccip/test/offRamp/EVM2EVMOffRamp.t.sol | 30 +-
.../test/offRamp/EVM2EVMOffRampSetup.t.sol | 12 +-
.../v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol | 148 +++---
.../ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol | 26 +-
.../test/pools/LockReleaseTokenPool.t.sol | 131 +----
.../src/v0.8/ccip/test/pools/TokenPool.t.sol | 21 +-
.../v0.8/ccip/test/pools/USDCTokenPool.t.sol | 31 +-
.../test/priceRegistry/PriceRegistry.t.sol | 99 ++--
.../v0.8/ccip/test/router/RouterSetup.t.sol | 3 +-
.../burn_from_mint_token_pool.go | 42 +-
.../burn_mint_token_pool.go | 42 +-
.../burn_mint_token_pool_and_proxy.go | 42 +-
.../burn_with_from_mint_token_pool.go | 42 +-
.../evm_2_evm_offramp/evm_2_evm_offramp.go | 8 +-
.../evm_2_evm_onramp/evm_2_evm_onramp.go | 7 +-
.../lock_release_token_pool.go | 158 +++++-
.../lock_release_token_pool_and_proxy.go | 18 +-
.../price_registry/price_registry.go | 2 +-
.../ccip/generated/token_pool/token_pool.go | 40 +-
.../usdc_token_pool/usdc_token_pool.go | 42 +-
...rapper-dependency-versions-do-not-edit.txt | 22 +-
.../ocr2/plugins/ccip/integration_test.go | 2 -
.../internal/ccipdata/onramp_reader_test.go | 3 +-
.../ccip/internal/ccipdata/v1_5_0/offramp.go | 10 +-
.../internal/ccipdata/v1_5_0/onramp_test.go | 3 +-
.../ccip/testhelpers/ccip_contracts.go | 22 +-
.../ocr2/plugins/ccip/testhelpers/config.go | 6 +-
.../plugins/ccip_integration_tests/helpers.go | 2 +-
.../ccip-tests/actions/ccip_helpers.go | 3 +-
.../ccip-tests/contracts/contract_deployer.go | 14 +-
.../ccip-tests/contracts/contract_models.go | 2 +-
45 files changed, 1015 insertions(+), 858 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 40f4514f26..1fdf7e27d9 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -19,22 +19,22 @@ AggregateTokenLimiter_setAdmin:test_Owner_Success() (gas: 18989)
AggregateTokenLimiter_setRateLimiterConfig:test_OnlyOnlyCallableByAdminOrOwner_Revert() (gas: 17479)
AggregateTokenLimiter_setRateLimiterConfig:test_Owner_Success() (gas: 30062)
AggregateTokenLimiter_setRateLimiterConfig:test_TokenLimitAdmin_Success() (gas: 32071)
-BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675)
-BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158)
-BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243525)
-BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 23907)
-BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27565)
-BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158)
-BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241416)
-BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17633)
-BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28537)
-BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 55991)
+BurnFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28761)
+BurnFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55115)
+BurnFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243491)
+BurnFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 23951)
+BurnMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 27522)
+BurnMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55115)
+BurnMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 241381)
+BurnMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 17677)
+BurnMintTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 28623)
+BurnMintTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56078)
BurnMintTokenPool_releaseOrMint:test_PoolMint_Success() (gas: 110657)
-BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28675)
-BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55158)
-BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243552)
-BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24260)
-CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2131281)
+BurnWithFromMintTokenPool_lockOrBurn:test_ChainNotAllowed_Revert() (gas: 28761)
+BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 55115)
+BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243517)
+BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24304)
+CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2132877)
CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495)
CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755)
CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647)
@@ -120,10 +120,10 @@ CommitStore_verify:test_Paused_Revert() (gas: 18496)
CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785)
DefensiveExampleTest:test_HappyPath_Success() (gas: 200018)
DefensiveExampleTest:test_Recovery() (gas: 424253)
-E2E:test_E2E_3MessagesSuccess_gas() (gas: 1103438)
+E2E:test_E2E_3MessagesSuccess_gas() (gas: 1110438)
EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38157)
-EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108343)
-EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_revert_Revert() (gas: 116811)
+EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108321)
+EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_revert_Revert() (gas: 116789)
EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddMultipleChains_Success() (gas: 460560)
EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_AddNewChain_Success() (gas: 95542)
EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ApplyZeroUpdates_Success() (gas: 12463)
@@ -136,7 +136,7 @@ EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 2
EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 158863)
EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189303)
EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 147582)
-EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 521508)
+EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 521464)
EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10459)
EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 15662)
EVM2EVMMultiOffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 67195)
@@ -158,7 +158,7 @@ EVM2EVMMultiOffRamp_commit:test_Unhealthy_Revert() (gas: 77605)
EVM2EVMMultiOffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 207057)
EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6389130)
EVM2EVMMultiOffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 47785)
-EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5981174)
+EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5980336)
EVM2EVMMultiOffRamp_constructor:test_SourceChainSelector_Revert() (gas: 157326)
EVM2EVMMultiOffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103815)
EVM2EVMMultiOffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101686)
@@ -177,18 +177,18 @@ EVM2EVMMultiOffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 149137)
EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6807322)
EVM2EVMMultiOffRamp_execute:test_ZeroReports_Revert() (gas: 17154)
EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18413)
-EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 249368)
+EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 249346)
EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20672)
EVM2EVMMultiOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 201673)
EVM2EVMMultiOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48860)
EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48381)
EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidationNoRouterCall_Revert() (gas: 232798)
EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithFailingValidation_Revert() (gas: 89392)
-EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 278146)
+EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 278124)
EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 93615)
EVM2EVMMultiOffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 35083)
EVM2EVMMultiOffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 23907)
-EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 451358)
+EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 451314)
EVM2EVMMultiOffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 54475)
EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 35917)
EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingOnRampRoot_Revert() (gas: 154369)
@@ -202,15 +202,15 @@ EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Succ
EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193657)
EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 259648)
EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 129585)
-EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 391710)
+EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 391688)
EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 65899)
EVM2EVMMultiOffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 80955)
-EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 535429)
-EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 480345)
+EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 535385)
+EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 480301)
EVM2EVMMultiOffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 35763)
-EVM2EVMMultiOffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 520344)
-EVM2EVMMultiOffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 517712)
-EVM2EVMMultiOffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 487848)
+EVM2EVMMultiOffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 520300)
+EVM2EVMMultiOffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 517668)
+EVM2EVMMultiOffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 487804)
EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 127921)
EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 157144)
EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3655340)
@@ -223,7 +223,7 @@ EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas:
EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26004)
EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152867)
EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 507480)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2307925)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2307903)
EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209633)
EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210210)
EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 668610)
@@ -232,20 +232,20 @@ EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas:
EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 24131)
EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 59105)
EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 40405)
-EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 76130)
-EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 178951)
+EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_PoolDoesNotSupportDest_Reverts() (gas: 76108)
+EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 178929)
EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 278805)
EVM2EVMMultiOffRamp_resetUnblessedRoots:test_OnlyOwner_Revert() (gas: 11379)
EVM2EVMMultiOffRamp_resetUnblessedRoots:test_ResetUnblessedRoots_Success() (gas: 215406)
EVM2EVMMultiOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 14374)
EVM2EVMMultiOffRamp_setDynamicConfig:test_PriceRegistryZeroAddress_Revert() (gas: 11898)
EVM2EVMMultiOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 14054)
-EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 55771)
-EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 33781)
+EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfigWithValidator_Success() (gas: 54933)
+EVM2EVMMultiOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 32943)
EVM2EVMMultiOffRamp_trialExecute:test_RateLimitError_Success() (gas: 238004)
EVM2EVMMultiOffRamp_trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 246667)
-EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 299499)
-EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 280579)
+EVM2EVMMultiOffRamp_trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 299477)
+EVM2EVMMultiOffRamp_trialExecute:test_trialExecute_Success() (gas: 280557)
EVM2EVMMultiOffRamp_verify:test_Blessed_Success() (gas: 176604)
EVM2EVMMultiOffRamp_verify:test_NotBlessedWrongChainSelector_Success() (gas: 178672)
EVM2EVMMultiOffRamp_verify:test_NotBlessed_Success() (gas: 141533)
@@ -272,12 +272,12 @@ EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Succ
EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 224545)
EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreLinkFees() (gas: 140840)
EVM2EVMMultiOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 162262)
-EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3803257)
+EVM2EVMMultiOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3843523)
EVM2EVMMultiOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 127615)
EVM2EVMMultiOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 93044)
EVM2EVMMultiOnRamp_forwardFromRouter:test_forwardFromRouter_WithValidation_Success() (gas: 282576)
EVM2EVMMultiOnRamp_getFee:test_EmptyMessage_Success() (gas: 104423)
-EVM2EVMMultiOnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 74041)
+EVM2EVMMultiOnRamp_getFee:test_EnforceOutOfOrder_Revert() (gas: 74053)
EVM2EVMMultiOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 119755)
EVM2EVMMultiOnRamp_getFee:test_Unhealthy_Revert() (gas: 43657)
EVM2EVMMultiOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10438)
@@ -288,60 +288,60 @@ EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 1
EVM2EVMMultiOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 16287)
EVM2EVMMultiOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 58439)
EVM2EVMMultiOnRamp_withdrawFeeTokens:test_WithdrawFeeTokens_Success() (gas: 97185)
-EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38028)
-EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 108191)
-EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_revert_Revert() (gas: 116732)
-EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 391880)
-EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 145379)
-EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 788000)
-EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 176208)
-EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29700)
-EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 63325)
-EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44501)
-EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 214151)
-EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 306912)
+EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_NotACompatiblePool_Revert() (gas: 38281)
+EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_Success() (gas: 106252)
+EVM2EVMOffRamp__releaseOrMintToken:test__releaseOrMintToken_TokenHandlingError_revert_Revert() (gas: 114736)
+EVM2EVMOffRamp__releaseOrMintTokens:test_OverValueWithARLOff_Success() (gas: 392159)
+EVM2EVMOffRamp__releaseOrMintTokens:test_PriceNotFoundForToken_Reverts() (gas: 145614)
+EVM2EVMOffRamp__releaseOrMintTokens:test_RateLimitErrors_Reverts() (gas: 789382)
+EVM2EVMOffRamp__releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 176510)
+EVM2EVMOffRamp__releaseOrMintTokens:test__releaseOrMintTokens_NotACompatiblePool_Reverts() (gas: 29914)
+EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 61712)
+EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44959)
+EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 214456)
+EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 307176)
EVM2EVMOffRamp__report:test_Report_Success() (gas: 127459)
-EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 254710)
-EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 263301)
-EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 334438)
-EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 314443)
+EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 255279)
+EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 263870)
+EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 336203)
+EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 314960)
EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17009)
-EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153241)
-EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5337708)
-EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143997)
-EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21345)
+EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153158)
+EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5275448)
+EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143892)
+EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21323)
EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36486)
EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51701)
-EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473216)
+EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473025)
EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 46423)
EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152453)
-EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 101503)
+EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 102724)
EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 164818)
EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177584)
EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317)
-EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159387)
+EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159365)
EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 174600)
EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248634)
EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115040)
-EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 409316)
-EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54173)
+EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 410767)
+EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54196)
EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132056)
EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52178)
-EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 560178)
-EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 499466)
+EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 561690)
+EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 500288)
EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35486)
-EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 546987)
+EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 549267)
EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64023)
-EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123223)
+EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123201)
EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 143411)
EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 428233)
EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20582)
-EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 281891)
-EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20231)
-EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 219228)
+EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 282255)
+EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20209)
+EVM2EVMOffRamp_executeSingleMessage:test_TokenHandlingError_Revert() (gas: 219644)
EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 48632)
-EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48120)
-EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 316477)
+EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48098)
+EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 317243)
EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 72423)
EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 231326)
EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 279867)
@@ -358,52 +358,53 @@ EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43
EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25927)
EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188300)
EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187747)
-EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2027223)
-EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143585)
-EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8871)
-EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40429)
-EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38804)
-EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 146790)
+EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2050054)
+EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143563)
+EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8838)
+EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40131)
+EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38214)
+EVM2EVMOffRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 142006)
EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_AddsAndRemoves_Success() (gas: 162464)
EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_NonOwner_Revert() (gas: 16667)
EVM2EVMOffRamp_updateRateLimitTokens:test_updateRateLimitTokens_Success() (gas: 197660)
-EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5619710)
+EVM2EVMOnRamp_constructor:test_Constructor_Success() (gas: 5579769)
EVM2EVMOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 35778)
-EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 99470)
-EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114210)
-EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 114252)
-EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130118)
-EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 138650)
-EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 129804)
-EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 38254)
-EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 38370)
-EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25511)
-EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25297)
+EVM2EVMOnRamp_forwardFromRouter:test_EnforceOutOfOrder_Revert() (gas: 98428)
+EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 114198)
+EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 114240)
+EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessCustomExtraArgs() (gas: 130207)
+EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouterSuccessLegacyExtraArgs() (gas: 138653)
+EVM2EVMOnRamp_forwardFromRouter:test_ForwardFromRouter_Success() (gas: 129829)
+EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddressEncodePacked_Revert() (gas: 38257)
+EVM2EVMOnRamp_forwardFromRouter:test_InvalidAddress_Revert() (gas: 38440)
+EVM2EVMOnRamp_forwardFromRouter:test_InvalidChainSelector_Revert() (gas: 25489)
+EVM2EVMOnRamp_forwardFromRouter:test_InvalidExtraArgsTag_Revert() (gas: 25275)
EVM2EVMOnRamp_forwardFromRouter:test_MaxCapacityExceeded_Revert() (gas: 86041)
EVM2EVMOnRamp_forwardFromRouter:test_MaxFeeBalanceReached_Revert() (gas: 36457)
-EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29037)
-EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107526)
-EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22635)
-EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 223665)
-EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 53935)
+EVM2EVMOnRamp_forwardFromRouter:test_MessageGasLimitTooHigh_Revert() (gas: 29015)
+EVM2EVMOnRamp_forwardFromRouter:test_MessageTooLarge_Revert() (gas: 107571)
+EVM2EVMOnRamp_forwardFromRouter:test_OriginalSender_Revert() (gas: 22679)
+EVM2EVMOnRamp_forwardFromRouter:test_OverValueWithARLOff_Success() (gas: 224625)
+EVM2EVMOnRamp_forwardFromRouter:test_Paused_Revert() (gas: 53072)
EVM2EVMOnRamp_forwardFromRouter:test_Permissions_Revert() (gas: 25481)
-EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59303)
-EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 179141)
-EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 177355)
-EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 137297)
-EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3731767)
+EVM2EVMOnRamp_forwardFromRouter:test_PriceNotFoundForToken_Revert() (gas: 59347)
+EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementNonceOnlyOnOrdered_Success() (gas: 179148)
+EVM2EVMOnRamp_forwardFromRouter:test_ShouldIncrementSeqNumAndNonce_Success() (gas: 177430)
+EVM2EVMOnRamp_forwardFromRouter:test_ShouldStoreNonLinkFees() (gas: 137322)
+EVM2EVMOnRamp_forwardFromRouter:test_SourceTokenDataTooLarge_Revert() (gas: 3774775)
EVM2EVMOnRamp_forwardFromRouter:test_TooManyTokens_Revert() (gas: 30187)
EVM2EVMOnRamp_forwardFromRouter:test_Unhealthy_Revert() (gas: 43300)
-EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 109258)
-EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 312351)
-EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 112319)
-EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72181)
-EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 147614)
-EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 190454)
-EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 121245)
-EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 95324)
-EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 20760)
-EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 21128)
+EVM2EVMOnRamp_forwardFromRouter:test_UnsupportedToken_Revert() (gas: 109283)
+EVM2EVMOnRamp_forwardFromRouter:test_ZeroAddressReceiver_Revert() (gas: 312579)
+EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_ShouldStoreLinkFees_Success() (gas: 112322)
+EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_UnsupportedToken_Revert() (gas: 72206)
+EVM2EVMOnRamp_forwardFromRouter:test_forwardFromRouter_correctSourceTokenData_Success() (gas: 710661)
+EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 147664)
+EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 190529)
+EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 121320)
+EVM2EVMOnRamp_forwardFromRouter_upgrade:test_V2_Success() (gas: 95349)
+EVM2EVMOnRamp_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 20544)
+EVM2EVMOnRamp_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20912)
EVM2EVMOnRamp_getFee:test_EmptyMessage_Success() (gas: 78242)
EVM2EVMOnRamp_getFee:test_HighGasMessage_Success() (gas: 234090)
EVM2EVMOnRamp_getFee:test_MessageGasLimitTooHigh_Revert() (gas: 16715)
@@ -412,52 +413,51 @@ EVM2EVMOnRamp_getFee:test_MessageWithDataAndTokenTransfer_Success() (gas: 159220
EVM2EVMOnRamp_getFee:test_NotAFeeToken_Revert() (gas: 24089)
EVM2EVMOnRamp_getFee:test_SingleTokenMessage_Success() (gas: 117858)
EVM2EVMOnRamp_getFee:test_TooManyTokens_Revert() (gas: 19902)
-EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 65663)
+EVM2EVMOnRamp_getFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 64654)
EVM2EVMOnRamp_getSupportedTokens:test_GetSupportedTokens_Revert() (gas: 10460)
EVM2EVMOnRamp_getTokenPool:test_GetTokenPool_Success() (gas: 35195)
-EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 45037)
-EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 33041)
+EVM2EVMOnRamp_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 45082)
+EVM2EVMOnRamp_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 33019)
EVM2EVMOnRamp_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 28296)
-EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 130189)
-EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15260)
+EVM2EVMOnRamp_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 126225)
+EVM2EVMOnRamp_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 15238)
EVM2EVMOnRamp_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 28104)
EVM2EVMOnRamp_getTokenTransferCost:test_UnsupportedToken_Revert() (gas: 21248)
-EVM2EVMOnRamp_getTokenTransferCost:test_WETHTokenBpsFee_Success() (gas: 38922)
-EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28149)
-EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38615)
-EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29527)
+EVM2EVMOnRamp_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 28127)
+EVM2EVMOnRamp_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 38599)
+EVM2EVMOnRamp_getTokenTransferCost:test__getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29404)
EVM2EVMOnRamp_linkAvailableForPayment:test_InsufficientLinkBalance_Success() (gas: 32615)
EVM2EVMOnRamp_linkAvailableForPayment:test_LinkAvailableForPayment_Success() (gas: 134833)
-EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143054)
+EVM2EVMOnRamp_payNops:test_AdminPayNops_Success() (gas: 143159)
EVM2EVMOnRamp_payNops:test_InsufficientBalance_Revert() (gas: 26543)
EVM2EVMOnRamp_payNops:test_NoFeesToPay_Revert() (gas: 127367)
EVM2EVMOnRamp_payNops:test_NoNopsToPay_Revert() (gas: 133251)
-EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146341)
-EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 140916)
-EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 297485)
+EVM2EVMOnRamp_payNops:test_NopPayNops_Success() (gas: 146446)
+EVM2EVMOnRamp_payNops:test_OwnerPayNops_Success() (gas: 141021)
+EVM2EVMOnRamp_payNops:test_PayNopsSuccessAfterSetNops() (gas: 297510)
EVM2EVMOnRamp_payNops:test_WrongPermissions_Revert() (gas: 15294)
-EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 43376)
-EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 21646)
-EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 55086)
+EVM2EVMOnRamp_setDynamicConfig:test_SetConfigInvalidConfig_Revert() (gas: 42365)
+EVM2EVMOnRamp_setDynamicConfig:test_SetConfigOnlyOwner_Revert() (gas: 21246)
+EVM2EVMOnRamp_setDynamicConfig:test_SetDynamicConfig_Success() (gas: 53764)
EVM2EVMOnRamp_setFeeTokenConfig:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 13464)
EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfigByAdmin_Success() (gas: 16449)
EVM2EVMOnRamp_setFeeTokenConfig:test_SetFeeTokenConfig_Success() (gas: 13994)
EVM2EVMOnRamp_setNops:test_AdminCanSetNops_Success() (gas: 61759)
-EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 469097)
+EVM2EVMOnRamp_setNops:test_IncludesPayment_Success() (gas: 469227)
EVM2EVMOnRamp_setNops:test_LinkTokenCannotBeNop_Revert() (gas: 57255)
EVM2EVMOnRamp_setNops:test_NonOwnerOrAdmin_Revert() (gas: 14665)
-EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 84455)
+EVM2EVMOnRamp_setNops:test_NotEnoughFundsForPayout_Revert() (gas: 84480)
EVM2EVMOnRamp_setNops:test_SetNopsRemovesOldNopsCompletely_Success() (gas: 60637)
-EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 173677)
+EVM2EVMOnRamp_setNops:test_SetNops_Success() (gas: 173782)
EVM2EVMOnRamp_setNops:test_TooManyNops_Revert() (gas: 190338)
EVM2EVMOnRamp_setNops:test_ZeroAddressCannotBeNop_Revert() (gas: 53596)
-EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14493)
+EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_InvalidDestBytesOverhead_Revert() (gas: 14499)
EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_OnlyCallableByOwnerOrAdmin_Revert() (gas: 14277)
-EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 84017)
+EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_Success() (gas: 84029)
EVM2EVMOnRamp_setTokenTransferFeeConfig:test__setTokenTransferFeeConfig_byAdmin_Success() (gas: 17369)
-EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 82980)
+EVM2EVMOnRamp_withdrawNonLinkFees:test_LinkBalanceNotSettled_Revert() (gas: 83005)
EVM2EVMOnRamp_withdrawNonLinkFees:test_NonOwnerOrAdmin_Revert() (gas: 15275)
-EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272015)
+EVM2EVMOnRamp_withdrawNonLinkFees:test_SettlingBalance_Success() (gas: 272035)
EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawNonLinkFees_Success() (gas: 53446)
EVM2EVMOnRamp_withdrawNonLinkFees:test_WithdrawToZeroAddress_Revert() (gas: 12830)
EtherSenderReceiverTest_ccipReceive:test_ccipReceive_fallbackToWethTransfer() (gas: 96729)
@@ -481,38 +481,32 @@ EtherSenderReceiverTest_validatedMessage:test_validatedMessage_emptyDataOverwrit
EtherSenderReceiverTest_validatedMessage:test_validatedMessage_invalidTokenAmounts() (gas: 17895)
EtherSenderReceiverTest_validatedMessage:test_validatedMessage_tokenOverwrittenToWeth() (gas: 25287)
EtherSenderReceiverTest_validatedMessage:test_validatedMessage_validMessage_extraArgs() (gas: 26292)
-LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11058)
-LockReleaseTokenPoolAndProxy_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35097)
-LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10970)
-LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18036)
-LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3313980)
-LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3310379)
+LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Revert() (gas: 10992)
+LockReleaseTokenPoolAndProxy_setRebalancer:test_SetRebalancer_Success() (gas: 18058)
+LockReleaseTokenPoolPoolAndProxy_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3355878)
+LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3352276)
LockReleaseTokenPoolPoolAndProxy_provideLiquidity:test_Unauthorized_Revert() (gas: 11380)
-LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17135)
-LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 69142)
-LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 17319)
LockReleaseTokenPoolPoolAndProxy_supportsInterface:test_SupportsInterface_Success() (gas: 9977)
LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60043)
LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11355)
-LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3067883)
+LockReleaseTokenPool_canAcceptLiquidity:test_CanAcceptLiquidity_Success() (gas: 3121619)
LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 29942)
LockReleaseTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Success() (gas: 79844)
LockReleaseTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas: 59464)
-LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3064325)
+LockReleaseTokenPool_provideLiquidity:test_LiquidityNotAccepted_Revert() (gas: 3118061)
LockReleaseTokenPool_provideLiquidity:test_Unauthorized_Revert() (gas: 11380)
-LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72662)
-LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56131)
-LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 238673)
-LockReleaseTokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17102)
-LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 69075)
-LockReleaseTokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 17297)
-LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11057)
-LockReleaseTokenPool_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35140)
+LockReleaseTokenPool_releaseOrMint:test_ChainNotAllowed_Revert() (gas: 72644)
+LockReleaseTokenPool_releaseOrMint:test_PoolMintNotHealthy_Revert() (gas: 56196)
+LockReleaseTokenPool_releaseOrMint:test_ReleaseOrMint_Success() (gas: 238656)
LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Revert() (gas: 10992)
-LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 17926)
+LockReleaseTokenPool_setRebalancer:test_SetRebalancer_Success() (gas: 18058)
LockReleaseTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 9977)
+LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_Success() (gas: 83171)
+LockReleaseTokenPool_transferLiquidity:test_transferLiquidity_transferTooMuch_Revert() (gas: 55878)
LockReleaseTokenPool_withdrawalLiquidity:test_InsufficientLiquidity_Revert() (gas: 60043)
LockReleaseTokenPool_withdrawalLiquidity:test_Unauthorized_Revert() (gas: 11355)
+LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Revert() (gas: 11029)
+LockRelease_setRateLimitAdmin:test_SetRateLimitAdmin_Success() (gas: 35030)
MerkleMultiProofTest:test_CVE_2023_34459() (gas: 5451)
MerkleMultiProofTest:test_EmptyLeaf_Revert() (gas: 3552)
MerkleMultiProofTest:test_MerkleRoot256() (gas: 394876)
@@ -598,8 +592,8 @@ MultiOCR3Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 24191)
MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61409)
MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39890)
MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 32973)
-MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 412349)
-MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1426976)
+MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 412263)
+MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1426954)
NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37907)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23694)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38763)
@@ -611,9 +605,9 @@ NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success(
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 247990)
NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 236024)
NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 144774)
-NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 186669)
-NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 237737)
-NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 124995)
+NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 186694)
+NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 237762)
+NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 125070)
NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 125923)
NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 122899)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 42959)
@@ -646,34 +640,34 @@ OCR2Base_transmit:test_Transmit2SignersSuccess_gas() (gas: 51686)
OCR2Base_transmit:test_UnAuthorizedTransmitter_Revert() (gas: 23484)
OCR2Base_transmit:test_UnauthorizedSigner_Revert() (gas: 39665)
OCR2Base_transmit:test_WrongNumberOfSignatures_Revert() (gas: 20557)
-OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 380360)
-PingPong_ccipReceive:test_CcipReceive_Success() (gas: 148380)
+OnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 390410)
+PingPong_ccipReceive:test_CcipReceive_Success() (gas: 148405)
PingPong_plumbing:test_Pausing_Success() (gas: 17803)
-PingPong_startPingPong:test_StartPingPong_Success() (gas: 178340)
-PriceRegistry_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16719)
-PriceRegistry_applyDestChainConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 16784)
-PriceRegistry_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16611)
-PriceRegistry_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16675)
-PriceRegistry_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 40953)
+PingPong_startPingPong:test_StartPingPong_Success() (gas: 178365)
+PriceRegistry_applyDestChainConfigUpdates:test_InvalidChainFamilySelector_Revert() (gas: 16725)
+PriceRegistry_applyDestChainConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 16816)
+PriceRegistry_applyDestChainConfigUpdates:test_InvalidDestChainConfigDestChainSelectorEqZero_Revert() (gas: 16617)
+PriceRegistry_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitEqZero_Revert() (gas: 16681)
+PriceRegistry_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesDefaultTxGasLimitGtMaxPerMessageGasLimit_Revert() (gas: 40971)
PriceRegistry_applyDestChainConfigUpdates:test_applyDestChainConfigUpdatesZeroIntput_Success() (gas: 12341)
-PriceRegistry_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 139564)
+PriceRegistry_applyDestChainConfigUpdates:test_applyDestChainConfigUpdates_Success() (gas: 139588)
PriceRegistry_applyFeeTokensUpdates:test_ApplyFeeTokensUpdates_Success() (gas: 80002)
PriceRegistry_applyFeeTokensUpdates:test_OnlyCallableByOwner_Revert() (gas: 12603)
PriceRegistry_applyPremiumMultiplierWeiPerEthUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 11465)
PriceRegistry_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesMultipleTokens_Success() (gas: 54149)
PriceRegistry_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesSingleToken_Success() (gas: 44835)
PriceRegistry_applyPremiumMultiplierWeiPerEthUpdates:test_applyPremiumMultiplierWeiPerEthUpdatesZeroInput() (gas: 12301)
-PriceRegistry_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 86826)
+PriceRegistry_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeConfig_Success() (gas: 86838)
PriceRegistry_applyTokenTransferFeeConfigUpdates:test_ApplyTokenTransferFeeZeroInput() (gas: 13089)
-PriceRegistry_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17045)
+PriceRegistry_applyTokenTransferFeeConfigUpdates:test_InvalidDestBytesOverhead_Revert() (gas: 17071)
PriceRegistry_applyTokenTransferFeeConfigUpdates:test_OnlyCallableByOwnerOrAdmin_Revert() (gas: 12240)
-PriceRegistry_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 105966)
-PriceRegistry_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 110316)
-PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 110369)
-PriceRegistry_constructor:test_Setup_Success() (gas: 4650895)
+PriceRegistry_constructor:test_InvalidLinkTokenEqZeroAddress_Revert() (gas: 100407)
+PriceRegistry_constructor:test_InvalidMaxFeeJuelsPerMsg_Revert() (gas: 104757)
+PriceRegistry_constructor:test_InvalidStalenessThreshold_Revert() (gas: 104810)
+PriceRegistry_constructor:test_Setup_Success() (gas: 4615196)
PriceRegistry_convertTokenAmount:test_ConvertTokenAmount_Success() (gas: 72751)
PriceRegistry_convertTokenAmount:test_LinkTokenNotSupported_Revert() (gas: 30981)
-PriceRegistry_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 95575)
+PriceRegistry_getDataAvailabilityCost:test_EmptyMessageCalculatesDataAvailabilityCost_Success() (gas: 95587)
PriceRegistry_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCostUnsupportedDestChainSelector_Success() (gas: 14636)
PriceRegistry_getDataAvailabilityCost:test_SimpleMessageCalculatesDataAvailabilityCost_Success() (gas: 20614)
PriceRegistry_getTokenAndGasPrices:test_GetFeeTokenAndGasPrices_Success() (gas: 70449)
@@ -682,19 +676,18 @@ PriceRegistry_getTokenAndGasPrices:test_UnsupportedChain_Revert() (gas: 16140)
PriceRegistry_getTokenAndGasPrices:test_ZeroGasPrice_Success() (gas: 45734)
PriceRegistry_getTokenPrice:test_GetTokenPriceFromFeed_Success() (gas: 62311)
PriceRegistry_getTokenPrices:test_GetTokenPrices_Success() (gas: 84774)
-PriceRegistry_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 41283)
-PriceRegistry_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34733)
-PriceRegistry_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27807)
-PriceRegistry_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 108018)
-PriceRegistry_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20359)
-PriceRegistry_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27615)
-PriceRegistry_getTokenTransferCost:test_WETHTokenBpsFee_Success() (gas: 40668)
-PriceRegistry_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27638)
-PriceRegistry_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40015)
-PriceRegistry_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29343)
+PriceRegistry_getTokenTransferCost:test_CustomTokenBpsFee_Success() (gas: 41255)
+PriceRegistry_getTokenTransferCost:test_FeeTokenBpsFee_Success() (gas: 34705)
+PriceRegistry_getTokenTransferCost:test_LargeTokenTransferChargesMaxFeeAndGas_Success() (gas: 27779)
+PriceRegistry_getTokenTransferCost:test_MixedTokenTransferFee_Success() (gas: 101708)
+PriceRegistry_getTokenTransferCost:test_NoTokenTransferChargesZeroFee_Success() (gas: 20398)
+PriceRegistry_getTokenTransferCost:test_SmallTokenTransferChargesMinFeeAndGas_Success() (gas: 27654)
+PriceRegistry_getTokenTransferCost:test_ZeroAmountTokenTransferChargesMinFeeAndGas_Success() (gas: 27610)
+PriceRegistry_getTokenTransferCost:test_ZeroFeeConfigChargesMinFee_Success() (gas: 40058)
+PriceRegistry_getTokenTransferCost:test_getTokenTransferCost_selfServeUsesDefaults_Success() (gas: 29337)
PriceRegistry_getValidatedFee:test_DestinationChainNotEnabled_Revert() (gas: 18203)
PriceRegistry_getValidatedFee:test_EmptyMessage_Success() (gas: 81464)
-PriceRegistry_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 55184)
+PriceRegistry_getValidatedFee:test_EnforceOutOfOrder_Revert() (gas: 55196)
PriceRegistry_getValidatedFee:test_HighGasMessage_Success() (gas: 237926)
PriceRegistry_getValidatedFee:test_InvalidEVMAddress_Revert() (gas: 19971)
PriceRegistry_getValidatedFee:test_MessageGasLimitTooHigh_Revert() (gas: 31775)
@@ -703,7 +696,7 @@ PriceRegistry_getValidatedFee:test_MessageWithDataAndTokenTransfer_Success() (ga
PriceRegistry_getValidatedFee:test_NotAFeeToken_Revert() (gas: 29435)
PriceRegistry_getValidatedFee:test_SingleTokenMessage_Success() (gas: 112283)
PriceRegistry_getValidatedFee:test_TooManyTokens_Revert() (gas: 20107)
-PriceRegistry_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62956)
+PriceRegistry_getValidatedFee:test_ZeroDataAvailabilityMultiplier_Success() (gas: 62962)
PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Above18Decimals_Success() (gas: 2094532)
PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedErc20Below18Decimals_Success() (gas: 2094490)
PriceRegistry_getValidatedTokenPrice:test_GetValidatedTokenPriceFromFeedFeedAt0Decimals_Success() (gas: 2074609)
@@ -749,7 +742,7 @@ PriceRegistry_validateDestFamilyAddress:test_InvalidEVMAddress_Revert() (gas: 10
PriceRegistry_validateDestFamilyAddress:test_ValidEVMAddress_Success() (gas: 6660)
PriceRegistry_validateDestFamilyAddress:test_ValidNonEVMAddress_Success() (gas: 6440)
PriceRegistry_validatePoolReturnData:test_InvalidEVMAddressDestToken_Revert() (gas: 35457)
-PriceRegistry_validatePoolReturnData:test_SourceTokenDataTooLarge_Revert() (gas: 90631)
+PriceRegistry_validatePoolReturnData:test_SourceTokenDataTooLarge_Revert() (gas: 90709)
PriceRegistry_validatePoolReturnData:test_TokenAmountArraysMismatching_Revert() (gas: 32749)
PriceRegistry_validatePoolReturnData:test_WithSingleToken_Success() (gas: 31293)
RMN_constructor:test_Constructor_Success() (gas: 48838)
@@ -831,21 +824,21 @@ Router_applyRampUpdates:test_OffRampMismatch_Revert() (gas: 89288)
Router_applyRampUpdates:test_OffRampUpdatesWithRouting() (gas: 10642128)
Router_applyRampUpdates:test_OnRampDisable() (gas: 55913)
Router_applyRampUpdates:test_OnlyOwner_Revert() (gas: 12311)
-Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 113861)
-Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 200634)
-Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 128508)
-Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 215283)
+Router_ccipSend:test_CCIPSendLinkFeeNoTokenSuccess_gas() (gas: 113886)
+Router_ccipSend:test_CCIPSendLinkFeeOneTokenSuccess_gas() (gas: 201407)
+Router_ccipSend:test_CCIPSendNativeFeeNoTokenSuccess_gas() (gas: 128533)
+Router_ccipSend:test_CCIPSendNativeFeeOneTokenSuccess_gas() (gas: 216056)
Router_ccipSend:test_FeeTokenAmountTooLow_Revert() (gas: 66275)
Router_ccipSend:test_InvalidMsgValue() (gas: 31963)
-Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 68711)
-Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 173605)
+Router_ccipSend:test_NativeFeeTokenInsufficientValue() (gas: 68746)
+Router_ccipSend:test_NativeFeeTokenOverpay_Success() (gas: 173630)
Router_ccipSend:test_NativeFeeTokenZeroValue() (gas: 56037)
-Router_ccipSend:test_NativeFeeToken_Success() (gas: 172199)
-Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 242707)
+Router_ccipSend:test_NativeFeeToken_Success() (gas: 172224)
+Router_ccipSend:test_NonLinkFeeToken_Success() (gas: 242732)
Router_ccipSend:test_UnsupportedDestinationChain_Revert() (gas: 24749)
Router_ccipSend:test_WhenNotHealthy_Revert() (gas: 44724)
-Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 174415)
-Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 245121)
+Router_ccipSend:test_WrappedNativeFeeToken_Success() (gas: 174440)
+Router_ccipSend:test_ZeroFeeAndGasPrice_Success() (gas: 245146)
Router_constructor:test_Constructor_Success() (gas: 13074)
Router_getArmProxy:test_getArmProxy() (gas: 10561)
Router_getFee:test_GetFeeSupportedChain_Success() (gas: 46464)
@@ -857,13 +850,13 @@ Router_recoverTokens:test_RecoverTokensNonOwner_Revert() (gas: 11159)
Router_recoverTokens:test_RecoverTokensValueReceiver_Revert() (gas: 422138)
Router_recoverTokens:test_RecoverTokens_Success() (gas: 50437)
Router_routeMessage:test_AutoExec_Success() (gas: 42684)
-Router_routeMessage:test_ExecutionEvent_Success() (gas: 158002)
+Router_routeMessage:test_ExecutionEvent_Success() (gas: 157980)
Router_routeMessage:test_ManualExec_Success() (gas: 35381)
Router_routeMessage:test_OnlyOffRamp_Revert() (gas: 25116)
Router_routeMessage:test_WhenNotHealthy_Revert() (gas: 44724)
Router_setWrappedNative:test_OnlyOwner_Revert() (gas: 10985)
SelfFundedPingPong_ccipReceive:test_FundingIfNotANop_Revert() (gas: 53540)
-SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 416930)
+SelfFundedPingPong_ccipReceive:test_Funding_Success() (gas: 417080)
SelfFundedPingPong_setCountIncrBeforeFunding:test_setCountIncrBeforeFunding() (gas: 20157)
TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_OnlyPendingAdministrator_Revert() (gas: 51085)
TokenAdminRegistry_acceptAdminRole:test_acceptAdminRole_Success() (gas: 43947)
@@ -887,57 +880,56 @@ TokenAdminRegistry_setPool:test_setPool_Success() (gas: 35943)
TokenAdminRegistry_setPool:test_setPool_ZeroAddressRemovesPool_Success() (gas: 30617)
TokenAdminRegistry_transferAdminRole:test_transferAdminRole_OnlyAdministrator_Revert() (gas: 18043)
TokenAdminRegistry_transferAdminRole:test_transferAdminRole_Success() (gas: 49390)
-TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 6036775)
-TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 6282531)
-TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6883397)
-TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 7067512)
-TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 2169749)
+TokenPoolAndProxy:test_lockOrBurn_burnMint_Success() (gas: 6076728)
+TokenPoolAndProxy:test_lockOrBurn_lockRelease_Success() (gas: 6324538)
+TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_2() (gas: 6924810)
+TokenPoolAndProxyMigration:test_tokenPoolMigration_Success_1_4() (gas: 7108901)
+TokenPoolWithAllowList_applyAllowListUpdates:test_AllowListNotEnabled_Revert() (gas: 2209837)
TokenPoolWithAllowList_applyAllowListUpdates:test_OnlyOwner_Revert() (gas: 12089)
-TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23280)
-TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177516)
-TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23648)
+TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowListSkipsZero_Success() (gas: 23324)
+TokenPoolWithAllowList_applyAllowListUpdates:test_SetAllowList_Success() (gas: 177568)
+TokenPoolWithAllowList_getAllowList:test_GetAllowList_Success() (gas: 23670)
TokenPoolWithAllowList_getAllowListEnabled:test_GetAllowListEnabled_Success() (gas: 8363)
-TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24765)
+TokenPoolWithAllowList_setRouter:test_SetRouter_Success() (gas: 24831)
TokenPool_applyChainUpdates:test_applyChainUpdates_DisabledNonZeroRateLimit_Revert() (gas: 271305)
TokenPool_applyChainUpdates:test_applyChainUpdates_InvalidRateLimitRate_Revert() (gas: 541162)
TokenPool_applyChainUpdates:test_applyChainUpdates_NonExistentChain_Revert() (gas: 18344)
TokenPool_applyChainUpdates:test_applyChainUpdates_OnlyCallableByOwner_Revert() (gas: 11385)
-TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 476472)
+TokenPool_applyChainUpdates:test_applyChainUpdates_Success() (gas: 476468)
TokenPool_applyChainUpdates:test_applyChainUpdates_ZeroAddressNotAllowed_Revert() (gas: 157074)
-TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70676)
-TokenPool_constructor:test_immutableFields_Success() (gas: 20522)
+TokenPool_constructor:test_ZeroAddressNotAllowed_Revert() (gas: 70721)
+TokenPool_constructor:test_immutableFields_Success() (gas: 20544)
TokenPool_getRemotePool:test_getRemotePool_Success() (gas: 273962)
-TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 276952)
-TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 289509)
-TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 349763)
+TokenPool_onlyOffRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 276909)
+TokenPool_onlyOffRamp:test_ChainNotAllowed_Revert() (gas: 289406)
+TokenPool_onlyOffRamp:test_onlyOffRamp_Success() (gas: 349720)
TokenPool_onlyOnRamp:test_CallerIsNotARampOnRouter_Revert() (gas: 276643)
-TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 253466)
+TokenPool_onlyOnRamp:test_ChainNotAllowed_Revert() (gas: 253432)
TokenPool_onlyOnRamp:test_onlyOnRamp_Success() (gas: 304761)
-TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 14906)
-TokenPool_setChainRateLimiterConfig:test_OnlyOwner_Revert() (gas: 12565)
-TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15598)
-TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13173)
-TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 281890)
+TokenPool_setChainRateLimiterConfig:test_NonExistentChain_Revert() (gas: 17061)
+TokenPool_setChainRateLimiterConfig:test_OnlyOwnerOrRateLimitAdmin_Revert() (gas: 15062)
+TokenPool_setRemotePool:test_setRemotePool_NonExistentChain_Reverts() (gas: 15620)
+TokenPool_setRemotePool:test_setRemotePool_OnlyOwner_Reverts() (gas: 13195)
+TokenPool_setRemotePool:test_setRemotePool_Success() (gas: 281912)
TokenProxy_ccipSend:test_CcipSendGasShouldBeZero_Revert() (gas: 17109)
-TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 136351)
+TokenProxy_ccipSend:test_CcipSendInsufficientAllowance_Revert() (gas: 136228)
TokenProxy_ccipSend:test_CcipSendInvalidToken_Revert() (gas: 15919)
-TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 244483)
+TokenProxy_ccipSend:test_CcipSendNative_Success() (gas: 245256)
TokenProxy_ccipSend:test_CcipSendNoDataAllowed_Revert() (gas: 16303)
-TokenProxy_ccipSend:test_CcipSend_Success() (gas: 261100)
+TokenProxy_ccipSend:test_CcipSend_Success() (gas: 261620)
TokenProxy_constructor:test_Constructor() (gas: 13812)
TokenProxy_getFee:test_GetFeeGasShouldBeZero_Revert() (gas: 16827)
TokenProxy_getFee:test_GetFeeInvalidToken_Revert() (gas: 12658)
TokenProxy_getFee:test_GetFeeNoDataAllowed_Revert() (gas: 15849)
-TokenProxy_getFee:test_GetFee_Success() (gas: 86948)
-USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 24960)
-USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35312)
-USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30063)
-USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 132864)
-USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 477209)
-USDCTokenPool_lockOrBurn:test_lockOrBurn_InvalidReceiver_Revert() (gas: 52606)
-USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 289268)
-USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50682)
-USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 119185)
+TokenProxy_getFee:test_GetFee_Success() (gas: 86702)
+USDCTokenPool__validateMessage:test_ValidateInvalidMessage_Revert() (gas: 25290)
+USDCTokenPool_lockOrBurn:test_CallerIsNotARampOnRouter_Revert() (gas: 35322)
+USDCTokenPool_lockOrBurn:test_LockOrBurnWithAllowList_Revert() (gas: 30073)
+USDCTokenPool_lockOrBurn:test_LockOrBurn_Success() (gas: 132756)
+USDCTokenPool_lockOrBurn:test_UnknownDomain_Revert() (gas: 477205)
+USDCTokenPool_releaseOrMint:test_ReleaseOrMintRealTx_Success() (gas: 289263)
+USDCTokenPool_releaseOrMint:test_TokenMaxCapacityExceeded_Revert() (gas: 50676)
+USDCTokenPool_releaseOrMint:test_UnlockingUSDCFailed_Revert() (gas: 118987)
USDCTokenPool_setDomains:test_InvalidDomain_Revert() (gas: 66150)
USDCTokenPool_setDomains:test_OnlyOwner_Revert() (gas: 11339)
USDCTokenPool_supportsInterface:test_SupportsInterface_Success() (gas: 9876)
\ No newline at end of file
diff --git a/contracts/gas-snapshots/liquiditymanager.gas-snapshot b/contracts/gas-snapshots/liquiditymanager.gas-snapshot
index 53483ed6c7..efb5b68fe3 100644
--- a/contracts/gas-snapshots/liquiditymanager.gas-snapshot
+++ b/contracts/gas-snapshots/liquiditymanager.gas-snapshot
@@ -3,9 +3,9 @@ LiquidityManager_addLiquidity:test_addLiquiditySuccess() (gas: 279154)
LiquidityManager_rebalanceLiquidity:test_InsufficientLiquidityReverts() (gas: 206745)
LiquidityManager_rebalanceLiquidity:test_InvalidRemoteChainReverts() (gas: 192319)
LiquidityManager_rebalanceLiquidity:test_rebalanceBetweenPoolsSuccess() (gas: 9141768)
-LiquidityManager_rebalanceLiquidity:test_rebalanceBetweenPoolsSuccess_AlreadyFinalized() (gas: 8898695)
-LiquidityManager_rebalanceLiquidity:test_rebalanceBetweenPools_MultiStageFinalization() (gas: 8893901)
-LiquidityManager_rebalanceLiquidity:test_rebalanceBetweenPools_NativeRewrap() (gas: 8821699)
+LiquidityManager_rebalanceLiquidity:test_rebalanceBetweenPoolsSuccess_AlreadyFinalized() (gas: 8957594)
+LiquidityManager_rebalanceLiquidity:test_rebalanceBetweenPools_MultiStageFinalization() (gas: 8952800)
+LiquidityManager_rebalanceLiquidity:test_rebalanceBetweenPools_NativeRewrap() (gas: 8880598)
LiquidityManager_rebalanceLiquidity:test_rebalanceLiquiditySuccess() (gas: 382897)
LiquidityManager_receive:test_receive_success() (gas: 21182)
LiquidityManager_removeLiquidity:test_InsufficientLiquidityReverts() (gas: 184869)
@@ -19,7 +19,7 @@ LiquidityManager_setFinanceRole:test_OnlyOwnerReverts() (gas: 10987)
LiquidityManager_setFinanceRole:test_setFinanceRoleSuccess() (gas: 21836)
LiquidityManager_setLocalLiquidityContainer:test_OnlyOwnerReverts() (gas: 11052)
LiquidityManager_setLocalLiquidityContainer:test_ReverstWhen_CalledWithTheZeroAddress() (gas: 10643)
-LiquidityManager_setLocalLiquidityContainer:test_setLocalLiquidityContainerSuccess() (gas: 3436651)
+LiquidityManager_setLocalLiquidityContainer:test_setLocalLiquidityContainerSuccess() (gas: 3495598)
LiquidityManager_setMinimumLiquidity:test_OnlyOwnerReverts() (gas: 10925)
LiquidityManager_setMinimumLiquidity:test_setMinimumLiquiditySuccess() (gas: 36389)
LiquidityManager_withdrawERC20:test_withdrawERC20Reverts() (gas: 180359)
diff --git a/contracts/src/v0.8/ccip/libraries/Internal.sol b/contracts/src/v0.8/ccip/libraries/Internal.sol
index db2bc05ee5..4aa2f975e4 100644
--- a/contracts/src/v0.8/ccip/libraries/Internal.sol
+++ b/contracts/src/v0.8/ccip/libraries/Internal.sol
@@ -65,6 +65,7 @@ library Internal {
// CCIP_LOCK_OR_BURN_V1_RET_BYTES bytes. If more data is required, the TokenTransferFeeConfig.destBytesOverhead
// has to be set for the specific token.
bytes extraData;
+ uint32 destGasAmount; // The amount of gas available for the releaseOrMint and transfer calls on the offRamp
}
/// @notice Report that is submitted by the execution DON at the execution phase. (including chain selector data)
@@ -91,19 +92,19 @@ library Internal {
/// @notice The cross chain message that gets committed to EVM chains.
/// @dev RMN depends on this struct, if changing, please notify the RMN maintainers.
struct EVM2EVMMessage {
- uint64 sourceChainSelector; // ───────────╮ the chain selector of the source chain, note: not chainId
- address sender; // ───────────────────────╯ sender address on the source chain
- address receiver; // ─────────────────────╮ receiver address on the destination chain
- uint64 sequenceNumber; // ────────────────╯ sequence number, not unique across lanes
- uint256 gasLimit; // user supplied maximum gas amount available for dest chain execution
- bool strict; // ──────────────────────────╮ DEPRECATED
- uint64 nonce; // │ nonce for this lane for this sender, not unique across senders/lanes
- address feeToken; // ─────────────────────╯ fee token
- uint256 feeTokenAmount; // fee token amount
- bytes data; // arbitrary data payload supplied by the message sender
- Client.EVMTokenAmount[] tokenAmounts; // array of tokens and amounts to transfer
- bytes[] sourceTokenData; // array of token data, one per token
- bytes32 messageId; // a hash of the message data
+ uint64 sourceChainSelector; // ────────╮ the chain selector of the source chain, note: not chainId
+ address sender; // ────────────────────╯ sender address on the source chain
+ address receiver; // ──────────────────╮ receiver address on the destination chain
+ uint64 sequenceNumber; // ─────────────╯ sequence number, not unique across lanes
+ uint256 gasLimit; // user supplied maximum gas amount available for dest chain execution
+ bool strict; // ───────────────────────╮ DEPRECATED
+ uint64 nonce; // │ nonce for this lane for this sender, not unique across senders/lanes
+ address feeToken; // ──────────────────╯ fee token
+ uint256 feeTokenAmount; // fee token amount
+ bytes data; // arbitrary data payload supplied by the message sender
+ Client.EVMTokenAmount[] tokenAmounts; // array of tokens and amounts to transfer
+ bytes[] sourceTokenData; // array of token data, one per token
+ bytes32 messageId; // a hash of the message data
}
/// @dev EVM2EVMMessage struct has 13 fields, including 3 variable arrays.
@@ -113,9 +114,20 @@ library Internal {
/// For structs that contain arrays, 1 more slot is added to the front, reaching a total of 17.
uint256 public constant MESSAGE_FIXED_BYTES = 32 * 17;
- /// @dev Each token transfer adds 1 EVMTokenAmount and 1 bytes.
- /// When abiEncoded, each EVMTokenAmount takes 2 slots, each bytes takes 2 slots, excl bytes contents
- uint256 public constant MESSAGE_FIXED_BYTES_PER_TOKEN = 32 * 4;
+ /// @dev Each token transfer adds 1 EVMTokenAmount and 3 bytes at 3 slots each and one slot for the destGasAmount.
+ /// When abi encoded, each EVMTokenAmount takes 2 slots, each bytes takes 1 slot for length, one slot of data and one
+ /// slot for the offset. This results in effectively 3*3 slots per SourceTokenData.
+ /// 0x20
+ /// destGasAmount
+ /// sourcePoolAddress_offset
+ /// destTokenAddress_offset
+ /// extraData_offset
+ /// sourcePoolAddress_length
+ /// sourcePoolAddress_content // assume 1 slot
+ /// destTokenAddress_length
+ /// destTokenAddress_content // assume 1 slot
+ /// extraData_length // contents billed separately
+ uint256 public constant MESSAGE_FIXED_BYTES_PER_TOKEN = 32 * ((1 + 3 * 3) + 2);
/// @dev Any2EVMRampMessage struct has 10 fields, including 3 variable unnested arrays (data, receiver and tokenAmounts).
/// Each variable array takes 1 more slot to store its length.
@@ -127,9 +139,9 @@ library Internal {
/// @dev Each token transfer adds 1 RampTokenAmount
/// RampTokenAmount has 4 fields, including 3 bytes.
- /// Each bytes takes 1 more slot to store its length.
- /// When abi encoded, each token transfer takes up 7 slots, excl bytes contents.
- uint256 public constant ANY_2_EVM_MESSAGE_FIXED_BYTES_PER_TOKEN = 32 * 7;
+ /// Each bytes takes 1 more slot to store its length, and one slot to store the offset.
+ /// When abi encoded, each token transfer takes up 10 slots, excl bytes contents.
+ uint256 public constant ANY_2_EVM_MESSAGE_FIXED_BYTES_PER_TOKEN = 32 * 10;
bytes32 internal constant EVM_2_EVM_MESSAGE_HASH = keccak256("EVM2EVMMessageHashV2");
@@ -226,8 +238,12 @@ library Internal {
);
}
- /// @dev We disallow the first 1024 addresses to never allow calling precompiles. It is extremely unlikely that
- /// anyone would ever be able to generate an address in this range.
+ /// @dev We disallow the first 1024 addresses to avoid calling into a range known for hosting precompiles. Calling
+ /// into precompiles probably won't cause any issues, but to be safe we can disallow this range. It is extremely
+ /// unlikely that anyone would ever be able to generate an address in this range. There is no official range of
+ /// precompiles, but EIP-7587 proposes to reserve the range 0x100 to 0x1ff. Our range is more conservative, even
+ /// though it might not be exhaustive for all chains, which is OK. We also disallow the zero address, which is a
+ /// common practice.
uint256 public constant PRECOMPILE_SPACE = 1024;
/// @notice This methods provides validation for parsing abi encoded addresses by ensuring the
@@ -282,10 +298,10 @@ library Internal {
/// The messageId is not expected to match hash(message), since it may originate from another ramp family
struct RampMessageHeader {
bytes32 messageId; // Unique identifier for the message, generated with the source chain's encoding scheme (i.e. not necessarily abi.encoded)
- uint64 sourceChainSelector; // ───────╮ the chain selector of the source chain, note: not chainId
- uint64 destChainSelector; // | the chain selector of the destination chain, note: not chainId
- uint64 sequenceNumber; // │ sequence number, not unique across lanes
- uint64 nonce; // ─────────────────────╯ nonce for this lane for this sender, not unique across senders/lanes
+ uint64 sourceChainSelector; // ──╮ the chain selector of the source chain, note: not chainId
+ uint64 destChainSelector; // | the chain selector of the destination chain, note: not chainId
+ uint64 sequenceNumber; // │ sequence number, not unique across lanes
+ uint64 nonce; // ────────────────╯ nonce for this lane for this sender, not unique across senders/lanes
}
/// @notice Family-agnostic message routed to an OffRamp
diff --git a/contracts/src/v0.8/ccip/libraries/Pool.sol b/contracts/src/v0.8/ccip/libraries/Pool.sol
index 3f1895dcf5..263ee380e8 100644
--- a/contracts/src/v0.8/ccip/libraries/Pool.sol
+++ b/contracts/src/v0.8/ccip/libraries/Pool.sol
@@ -14,7 +14,7 @@ library Pool {
// The default max number of bytes in the return data for a pool v1 lockOrBurn call.
// This data can be used to send information to the destination chain token pool. Can be overwritten
// in the TokenTransferFeeConfig.destBytesOverhead if more data is required.
- uint256 public constant CCIP_LOCK_OR_BURN_V1_RET_BYTES = 32;
+ uint32 public constant CCIP_LOCK_OR_BURN_V1_RET_BYTES = 32;
struct LockOrBurnInV1 {
bytes receiver; // The recipient of the tokens on the destination chain, abi encoded
@@ -25,7 +25,7 @@ library Pool {
}
struct LockOrBurnOutV1 {
- // The address of the destination token pool, abi encoded in the case of EVM chains
+ // The address of the destination token, abi encoded in the case of EVM chains
// This value is UNTRUSTED as any pool owner can return whatever value they want.
bytes destTokenAddress;
// Optional pool data to be transferred to the destination chain. Be default this is capped at
diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
index f371998004..3904ab81cf 100644
--- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
@@ -90,9 +90,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
uint32 maxDataBytes; // │ Maximum payload data size in bytes
uint16 maxNumberOfTokensPerMsg; // │ Maximum number of ERC20 token transfers that can be included per message
address router; // ─────────────────────────────────╯ Router address
- address priceRegistry; // ──────────╮ Price registry address
- uint32 maxPoolReleaseOrMintGas; // │ Maximum amount of gas passed on to token pool `releaseOrMint` call
- uint32 maxTokenTransferGas; // ─────╯ Maximum amount of gas passed on to token `transfer` call
+ address priceRegistry; // Price registry address
}
/// @notice RateLimitToken struct containing both the source and destination token addresses
@@ -616,7 +614,8 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
// contains a contract. If it doesn't it reverts with a known error, which we catch gracefully.
// We call the pool with exact gas to increase resistance against malicious tokens or token pools.
// We protects against return data bombs by capping the return data size at MAX_RET_BYTES.
- (bool success, bytes memory returnData,) = CallWithExactGas._callWithExactGasSafeReturnData(
+ (bool success, bytes memory returnData, uint256 gasUsedReleaseOrMint) = CallWithExactGas
+ ._callWithExactGasSafeReturnData(
abi.encodeCall(
IPoolV1.releaseOrMint,
Pool.ReleaseOrMintInV1({
@@ -631,7 +630,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
})
),
localPoolAddress,
- s_dynamicConfig.maxPoolReleaseOrMintGas,
+ sourceTokenData.destGasAmount,
Internal.GAS_FOR_CALL_EXACT_CHECK,
Internal.MAX_RET_BYTES
);
@@ -650,7 +649,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
(success, returnData,) = CallWithExactGas._callWithExactGasSafeReturnData(
abi.encodeCall(IERC20.transfer, (receiver, localAmount)),
localToken,
- s_dynamicConfig.maxTokenTransferGas,
+ sourceTokenData.destGasAmount - gasUsedReleaseOrMint,
Internal.GAS_FOR_CALL_EXACT_CHECK,
Internal.MAX_RET_BYTES
);
diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol
index 0e978596e4..45dfdacd30 100644
--- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol
+++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMOnRamp.sol
@@ -96,8 +96,6 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter,
// The following three properties are defaults, they can be overridden by setting the TokenTransferFeeConfig for a token
uint16 defaultTokenFeeUSDCents; // ──────────╮ Default token fee charged per token transfer
uint32 defaultTokenDestGasOverhead; // │ Default gas charged to execute the token transfer on the destination chain
- // │ Default data availability bytes that are returned from the source pool and sent
- uint32 defaultTokenDestBytesOverhead; // | to the destination pool. Must be >= Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES
bool enforceOutOfOrder; // ──────────────────╯ Whether to enforce the allowOutOfOrderExecution extraArg value to be true.
}
@@ -304,11 +302,15 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter,
}
if (s_nopFeesJuels > i_maxNopFeesJuels) revert MaxFeeBalanceReached();
- if (i_prevOnRamp != address(0)) {
- if (s_senderNonce[originalSender] == 0) {
- // If this is first time send for a sender in new OnRamp, check if they have a nonce
- // from the previous OnRamp and start from there instead of zero.
- s_senderNonce[originalSender] = IEVM2AnyOnRamp(i_prevOnRamp).getSenderNonce(originalSender);
+ // Get the current nonce if the message is an ordered message. If it's not ordered, we don't have to make the
+ // external call.
+ if (!extraArgs.allowOutOfOrderExecution) {
+ if (i_prevOnRamp != address(0)) {
+ if (s_senderNonce[originalSender] == 0) {
+ // If this is first time send for a sender in new OnRamp, check if they have a nonce
+ // from the previous OnRamp and start from there instead of zero.
+ s_senderNonce[originalSender] = IEVM2AnyOnRamp(i_prevOnRamp).getSenderNonce(originalSender);
+ }
}
}
@@ -359,10 +361,14 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter,
// extraData. This prevents gas bomb attacks on the NOPs. As destBytesOverhead accounts for both
// extraData and offchainData, this caps the worst case abuse to the number of bytes reserved for offchainData.
if (poolReturnData.destPoolData.length > Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) {
+ // If TokenTransferFeeConfig.enabled is false, there is no config. That means destBytesOverhead is zero and
+ // this check is always true. That ensures that a pool without config cannot send more than
+ // Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES bytes of data.
if (poolReturnData.destPoolData.length > s_tokenTransferFeeConfig[tokenAndAmount.token].destBytesOverhead) {
revert SourceTokenDataTooLarge(tokenAndAmount.token);
}
}
+
// We validate the token address to ensure it is a valid EVM address
Internal._validateEVMAddress(poolReturnData.destTokenAddress);
@@ -370,7 +376,12 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter,
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(sourcePool),
destTokenAddress: poolReturnData.destTokenAddress,
- extraData: poolReturnData.destPoolData
+ extraData: poolReturnData.destPoolData,
+ // The user will be billed either the default or the override, so we send the exact amount that we billed for
+ // to the destination chain to be used for the token releaseOrMint and transfer.
+ destGasAmount: s_tokenTransferFeeConfig[tokenAndAmount.token].isEnabled
+ ? s_tokenTransferFeeConfig[tokenAndAmount.token].destGasOverhead
+ : s_dynamicConfig.defaultTokenDestGasOverhead
})
);
}
@@ -464,10 +475,6 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter,
function _setDynamicConfig(DynamicConfig memory dynamicConfig) internal {
// We permit router to be set to zero as a way to pause the contract.
if (dynamicConfig.priceRegistry == address(0)) revert InvalidConfig();
- if (dynamicConfig.defaultTokenDestBytesOverhead < Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) {
- revert InvalidDestBytesOverhead(address(0), dynamicConfig.defaultTokenDestBytesOverhead);
- }
-
s_dynamicConfig = dynamicConfig;
emit ConfigSet(
@@ -635,7 +642,7 @@ contract EVM2EVMOnRamp is IEVM2AnyOnRamp, ILinkAvailable, AggregateRateLimiter,
if (!transferFeeConfig.isEnabled) {
tokenTransferFeeUSDWei += uint256(s_dynamicConfig.defaultTokenFeeUSDCents) * 1e16;
tokenTransferGas += s_dynamicConfig.defaultTokenDestGasOverhead;
- tokenTransferBytesOverhead += s_dynamicConfig.defaultTokenDestBytesOverhead;
+ tokenTransferBytesOverhead += Pool.CCIP_POOL_V1_RET_BYTES;
continue;
}
diff --git a/contracts/src/v0.8/ccip/pools/LockReleaseTokenPool.sol b/contracts/src/v0.8/ccip/pools/LockReleaseTokenPool.sol
index 5716777fb5..db168f994d 100644
--- a/contracts/src/v0.8/ccip/pools/LockReleaseTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/LockReleaseTokenPool.sol
@@ -5,7 +5,6 @@ import {ILiquidityContainer} from "../../liquiditymanager/interfaces/ILiquidityC
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {Pool} from "../libraries/Pool.sol";
-import {RateLimiter} from "../libraries/RateLimiter.sol";
import {TokenPool} from "./TokenPool.sol";
import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
@@ -20,20 +19,18 @@ contract LockReleaseTokenPool is TokenPool, ILiquidityContainer, ITypeAndVersion
error InsufficientLiquidity();
error LiquidityNotAccepted();
- error Unauthorized(address caller);
+
+ event LiquidityTransferred(address indexed from, uint256 amount);
string public constant override typeAndVersion = "LockReleaseTokenPool 1.5.0-dev";
/// @dev Whether or not the pool accepts liquidity.
/// External liquidity is not required when there is one canonical token deployed to a chain,
/// and CCIP is facilitating mint/burn on all the other chains, in which case the invariant
- /// balanceOf(pool) on home chain == sum(totalSupply(mint/burn "wrapped" token) on all remote chains) should always hold
+ /// balanceOf(pool) on home chain >= sum(totalSupply(mint/burn "wrapped" token) on all remote chains) should always hold
bool internal immutable i_acceptLiquidity;
/// @notice The address of the rebalancer.
address internal s_rebalancer;
- /// @notice The address of the rate limiter admin.
- /// @dev Can be address(0) if none is configured.
- address internal s_rateLimitAdmin;
constructor(
IERC20 token,
@@ -95,18 +92,6 @@ contract LockReleaseTokenPool is TokenPool, ILiquidityContainer, ITypeAndVersion
s_rebalancer = rebalancer;
}
- /// @notice Sets the rate limiter admin address.
- /// @dev Only callable by the owner.
- /// @param rateLimitAdmin The new rate limiter admin address.
- function setRateLimitAdmin(address rateLimitAdmin) external onlyOwner {
- s_rateLimitAdmin = rateLimitAdmin;
- }
-
- /// @notice Gets the rate limiter admin address.
- function getRateLimitAdmin() external view returns (address) {
- return s_rateLimitAdmin;
- }
-
/// @notice Checks if the pool can accept liquidity.
/// @return true if the pool can accept liquidity, false otherwise.
function canAcceptLiquidity() external view returns (bool) {
@@ -133,19 +118,20 @@ contract LockReleaseTokenPool is TokenPool, ILiquidityContainer, ITypeAndVersion
emit LiquidityRemoved(msg.sender, amount);
}
- /// @notice Sets the rate limiter admin address.
- /// @dev Only callable by the owner or the rate limiter admin. NOTE: overwrites the normal
- /// onlyAdmin check in the base implementation to also allow the rate limiter admin.
- /// @param remoteChainSelector The remote chain selector for which the rate limits apply.
- /// @param outboundConfig The new outbound rate limiter config.
- /// @param inboundConfig The new inbound rate limiter config.
- function setChainRateLimiterConfig(
- uint64 remoteChainSelector,
- RateLimiter.Config memory outboundConfig,
- RateLimiter.Config memory inboundConfig
- ) external override {
- if (msg.sender != s_rateLimitAdmin && msg.sender != owner()) revert Unauthorized(msg.sender);
-
- _setRateLimitConfig(remoteChainSelector, outboundConfig, inboundConfig);
+ /// @notice This function can be used to transfer liquidity from an older version of the pool to this pool. To do so
+ /// this pool will have to be set as the rebalancer in the older version of the pool. This allows it to transfer the
+ /// funds in the old pool to the new pool.
+ /// @dev When upgrading a LockRelease pool, this function can be called at the same time as the pool is changed in the
+ /// TokenAdminRegistry. This allows for a smooth transition of both liquidity and transactions to the new pool.
+ /// Alternatively, when no multicall is available, a portion of the funds can be transferred to the new pool before
+ /// changing which pool CCIP uses, to ensure both pools can operate. Then the pool should be changed in the
+ /// TokenAdminRegistry, which will activate the new pool. All new transactions will use the new pool and its
+ /// liquidity. Finally, the remaining liquidity can be transferred to the new pool using this function one more time.
+ /// @param from The address of the old pool.
+ /// @param amount The amount of liquidity to transfer.
+ function transferLiquidity(address from, uint256 amount) external onlyOwner {
+ LockReleaseTokenPool(from).withdrawLiquidity(amount);
+
+ emit LiquidityTransferred(from, amount);
}
}
diff --git a/contracts/src/v0.8/ccip/pools/LockReleaseTokenPoolAndProxy.sol b/contracts/src/v0.8/ccip/pools/LockReleaseTokenPoolAndProxy.sol
index 91766d5f26..dcd78ee969 100644
--- a/contracts/src/v0.8/ccip/pools/LockReleaseTokenPoolAndProxy.sol
+++ b/contracts/src/v0.8/ccip/pools/LockReleaseTokenPoolAndProxy.sol
@@ -5,7 +5,6 @@ import {ILiquidityContainer} from "../../liquiditymanager/interfaces/ILiquidityC
import {ITypeAndVersion} from "../../shared/interfaces/ITypeAndVersion.sol";
import {Pool} from "../libraries/Pool.sol";
-import {RateLimiter} from "../libraries/RateLimiter.sol";
import {LegacyPoolWrapper} from "./LegacyPoolWrapper.sol";
import {IERC20} from "../../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/IERC20.sol";
@@ -20,20 +19,16 @@ contract LockReleaseTokenPoolAndProxy is LegacyPoolWrapper, ILiquidityContainer,
error InsufficientLiquidity();
error LiquidityNotAccepted();
- error Unauthorized(address caller);
string public constant override typeAndVersion = "LockReleaseTokenPoolAndProxy 1.5.0-dev";
/// @dev Whether or not the pool accepts liquidity.
/// External liquidity is not required when there is one canonical token deployed to a chain,
/// and CCIP is facilitating mint/burn on all the other chains, in which case the invariant
- /// balanceOf(pool) on home chain == sum(totalSupply(mint/burn "wrapped" token) on all remote chains) should always hold
+ /// balanceOf(pool) on home chain >= sum(totalSupply(mint/burn "wrapped" token) on all remote chains) should always hold
bool internal immutable i_acceptLiquidity;
/// @notice The address of the rebalancer.
address internal s_rebalancer;
- /// @notice The address of the rate limiter admin.
- /// @dev Can be address(0) if none is configured.
- address internal s_rateLimitAdmin;
constructor(
IERC20 token,
@@ -103,18 +98,6 @@ contract LockReleaseTokenPoolAndProxy is LegacyPoolWrapper, ILiquidityContainer,
s_rebalancer = rebalancer;
}
- /// @notice Sets the rate limiter admin address.
- /// @dev Only callable by the owner.
- /// @param rateLimitAdmin The new rate limiter admin address.
- function setRateLimitAdmin(address rateLimitAdmin) external onlyOwner {
- s_rateLimitAdmin = rateLimitAdmin;
- }
-
- /// @notice Gets the rate limiter admin address.
- function getRateLimitAdmin() external view returns (address) {
- return s_rateLimitAdmin;
- }
-
/// @notice Checks if the pool can accept liquidity.
/// @return true if the pool can accept liquidity, false otherwise.
function canAcceptLiquidity() external view returns (bool) {
@@ -141,19 +124,18 @@ contract LockReleaseTokenPoolAndProxy is LegacyPoolWrapper, ILiquidityContainer,
emit LiquidityRemoved(msg.sender, amount);
}
- /// @notice Sets the rate limiter admin address.
- /// @dev Only callable by the owner or the rate limiter admin. NOTE: overwrites the normal
- /// onlyAdmin check in the base implementation to also allow the rate limiter admin.
- /// @param remoteChainSelector The remote chain selector for which the rate limits apply.
- /// @param outboundConfig The new outbound rate limiter config.
- /// @param inboundConfig The new inbound rate limiter config.
- function setChainRateLimiterConfig(
- uint64 remoteChainSelector,
- RateLimiter.Config memory outboundConfig,
- RateLimiter.Config memory inboundConfig
- ) external override {
- if (msg.sender != s_rateLimitAdmin && msg.sender != owner()) revert Unauthorized(msg.sender);
-
- _setRateLimitConfig(remoteChainSelector, outboundConfig, inboundConfig);
+ /// @notice This function can be used to transfer liquidity from an older version of the pool to this pool. To do so
+ /// this pool will have to be set as the rebalancer in the older version of the pool. This allows it to transfer the
+ /// funds in the old pool to the new pool.
+ /// @dev When upgrading a LockRelease pool, this function can be called at the same time as the pool is changed in the
+ /// TokenAdminRegistry. This allows for a smooth transition of both liquidity and transactions to the new pool.
+ /// Alternatively, when no multicall is available, a portion of the funds can be transferred to the new pool before
+ /// changing which pool CCIP uses, to ensure both pools can operate. Then the pool should be changed in the
+ /// TokenAdminRegistry, which will activate the new pool. All new transactions will use the new pool and its
+ /// liquidity. Finally, the remaining liquidity can be transferred to the new pool using this function one more time.
+ /// @param from The address of the old pool.
+ /// @param amount The amount of liquidity to transfer.
+ function transferLiquidity(address from, uint256 amount) external onlyOwner {
+ LockReleaseTokenPoolAndProxy(from).withdrawLiquidity(amount);
}
}
diff --git a/contracts/src/v0.8/ccip/pools/TokenPool.sol b/contracts/src/v0.8/ccip/pools/TokenPool.sol
index fb1f8c49e6..c0c6f2198d 100644
--- a/contracts/src/v0.8/ccip/pools/TokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/TokenPool.sol
@@ -31,6 +31,7 @@ abstract contract TokenPool is IPoolV1, OwnerIsCreator {
error ChainAlreadyExists(uint64 chainSelector);
error InvalidSourcePoolAddress(bytes sourcePoolAddress);
error InvalidToken(address token);
+ error Unauthorized(address caller);
event Locked(address indexed sender, uint256 amount);
event Burned(address indexed sender, uint256 amount);
@@ -87,6 +88,9 @@ abstract contract TokenPool is IPoolV1, OwnerIsCreator {
/// @dev The chain selectors are in uint256 format because of the EnumerableSet implementation.
EnumerableSet.UintSet internal s_remoteChainSelectors;
mapping(uint64 remoteChainSelector => RemoteChainConfig) internal s_remoteChainConfigs;
+ /// @notice The address of the rate limiter admin.
+ /// @dev Can be address(0) if none is configured.
+ address internal s_rateLimitAdmin;
constructor(IERC20 token, address[] memory allowlist, address rmnProxy, address router) {
if (address(token) == address(0) || router == address(0) || rmnProxy == address(0)) revert ZeroAddressNotAllowed();
@@ -169,7 +173,7 @@ abstract contract TokenPool is IPoolV1, OwnerIsCreator {
/// - if the source pool is valid
/// - rate limit status
/// @param releaseOrMintIn The input to validate.
- /// @dev This function should always be called before executing a lock or burn. Not doing so would allow
+ /// @dev This function should always be called before executing a release or mint. Not doing so would allow
/// for various exploits.
function _validateReleaseOrMint(Pool.ReleaseOrMintInV1 memory releaseOrMintIn) internal {
if (!isSupportedToken(releaseOrMintIn.localToken)) revert InvalidToken(releaseOrMintIn.localToken);
@@ -297,6 +301,18 @@ abstract contract TokenPool is IPoolV1, OwnerIsCreator {
// │ Rate limiting │
// ================================================================
+ /// @notice Sets the rate limiter admin address.
+ /// @dev Only callable by the owner.
+ /// @param rateLimitAdmin The new rate limiter admin address.
+ function setRateLimitAdmin(address rateLimitAdmin) external onlyOwner {
+ s_rateLimitAdmin = rateLimitAdmin;
+ }
+
+ /// @notice Gets the rate limiter admin address.
+ function getRateLimitAdmin() external view returns (address) {
+ return s_rateLimitAdmin;
+ }
+
/// @notice Consumes outbound rate limiting capacity in this pool
function _consumeOutboundRateLimit(uint64 remoteChainSelector, uint256 amount) internal {
s_remoteChainConfigs[remoteChainSelector].outboundRateLimiterConfig._consume(amount, address(i_token));
@@ -335,7 +351,9 @@ abstract contract TokenPool is IPoolV1, OwnerIsCreator {
uint64 remoteChainSelector,
RateLimiter.Config memory outboundConfig,
RateLimiter.Config memory inboundConfig
- ) external virtual onlyOwner {
+ ) external {
+ if (msg.sender != s_rateLimitAdmin && msg.sender != owner()) revert Unauthorized(msg.sender);
+
_setRateLimitConfig(remoteChainSelector, outboundConfig, inboundConfig);
}
diff --git a/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol b/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol
index 339ed09992..adaf946b1e 100644
--- a/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol
+++ b/contracts/src/v0.8/ccip/pools/USDC/USDCTokenPool.sol
@@ -94,8 +94,6 @@ contract USDCTokenPool is TokenPool, ITypeAndVersion {
}
/// @notice Burn the token in the pool
- /// @dev Burn is not rate limited at per-pool level. Burn does not contribute to honey pot risk.
- /// Benefits of rate limiting here does not justify the extra gas cost.
/// @dev emits ITokenMessenger.DepositForBurn
/// @dev Assumes caller has validated destinationReceiver
function lockOrBurn(Pool.LockOrBurnInV1 calldata lockOrBurnIn)
@@ -108,9 +106,6 @@ contract USDCTokenPool is TokenPool, ITypeAndVersion {
Domain memory domain = s_chainToDomain[lockOrBurnIn.remoteChainSelector];
if (!domain.enabled) revert UnknownDomain(lockOrBurnIn.remoteChainSelector);
- if (lockOrBurnIn.receiver.length != 32) {
- revert InvalidReceiver(lockOrBurnIn.receiver);
- }
// Since this pool is the msg sender of the CCTP transaction, only this contract
// is able to call replaceDepositForBurn. Since this contract does not implement
diff --git a/contracts/src/v0.8/ccip/test/BaseTest.t.sol b/contracts/src/v0.8/ccip/test/BaseTest.t.sol
index ee3f3e6fd4..498b1c5731 100644
--- a/contracts/src/v0.8/ccip/test/BaseTest.t.sol
+++ b/contracts/src/v0.8/ccip/test/BaseTest.t.sol
@@ -38,8 +38,8 @@ contract BaseTest is Test {
uint16 internal constant DEST_GAS_PER_PAYLOAD_BYTE = 16;
uint16 internal constant DEFAULT_TOKEN_FEE_USD_CENTS = 50;
- uint32 internal constant DEFAULT_TOKEN_DEST_GAS_OVERHEAD = 34_000;
- uint32 internal constant DEFAULT_TOKEN_BYTES_OVERHEAD = 50;
+ uint32 internal constant DEFAULT_TOKEN_DEST_GAS_OVERHEAD = 110_000;
+ uint32 internal constant DEFAULT_TOKEN_BYTES_OVERHEAD = 32;
bool private s_baseTestInitialized;
diff --git a/contracts/src/v0.8/ccip/test/NonceManager.t.sol b/contracts/src/v0.8/ccip/test/NonceManager.t.sol
index 75de4db8c5..92ea1f221d 100644
--- a/contracts/src/v0.8/ccip/test/NonceManager.t.sol
+++ b/contracts/src/v0.8/ccip/test/NonceManager.t.sol
@@ -230,7 +230,6 @@ contract NonceManager_OnRampUpgrade is EVM2EVMMultiOnRampSetup {
maxPerMsgGasLimit: MAX_GAS_LIMIT,
defaultTokenFeeUSDCents: DEFAULT_TOKEN_FEE_USD_CENTS,
defaultTokenDestGasOverhead: DEFAULT_TOKEN_DEST_GAS_OVERHEAD,
- defaultTokenDestBytesOverhead: DEFAULT_TOKEN_BYTES_OVERHEAD,
enforceOutOfOrder: false
}),
RateLimiter.Config({isEnabled: true, capacity: 100e28, rate: 1e15}),
diff --git a/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol b/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol
index 292ac9a3bf..927c7e1f03 100644
--- a/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol
+++ b/contracts/src/v0.8/ccip/test/legacy/TokenPoolAndProxy.t.sol
@@ -585,7 +585,7 @@ contract LockReleaseTokenPoolPoolAndProxy_provideLiquidity is LockReleaseTokenPo
function test_Unauthorized_Revert() public {
vm.startPrank(STRANGER);
- vm.expectRevert(abi.encodeWithSelector(LockReleaseTokenPoolAndProxy.Unauthorized.selector, STRANGER));
+ vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, STRANGER));
s_lockReleaseTokenPoolAndProxy.provideLiquidity(1);
}
@@ -620,7 +620,7 @@ contract LockReleaseTokenPoolPoolAndProxy_withdrawalLiquidity is LockReleaseToke
function test_Unauthorized_Revert() public {
vm.startPrank(STRANGER);
- vm.expectRevert(abi.encodeWithSelector(LockReleaseTokenPoolAndProxy.Unauthorized.selector, STRANGER));
+ vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, STRANGER));
s_lockReleaseTokenPoolAndProxy.withdrawLiquidity(1);
}
@@ -645,127 +645,3 @@ contract LockReleaseTokenPoolPoolAndProxy_supportsInterface is LockReleaseTokenP
assertTrue(s_lockReleaseTokenPoolAndProxy.supportsInterface(type(IERC165).interfaceId));
}
}
-
-contract LockReleaseTokenPoolPoolAndProxy_setChainRateLimiterConfig is LockReleaseTokenPoolAndProxySetup {
- event ConfigChanged(RateLimiter.Config);
- event ChainConfigured(
- uint64 chainSelector, RateLimiter.Config outboundRateLimiterConfig, RateLimiter.Config inboundRateLimiterConfig
- );
-
- uint64 internal s_remoteChainSelector;
-
- function setUp() public virtual override {
- LockReleaseTokenPoolAndProxySetup.setUp();
- TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](1);
- s_remoteChainSelector = 123124;
- chainUpdates[0] = TokenPool.ChainUpdate({
- remoteChainSelector: s_remoteChainSelector,
- remotePoolAddress: abi.encode(address(1)),
- remoteTokenAddress: abi.encode(address(2)),
- allowed: true,
- outboundRateLimiterConfig: getOutboundRateLimiterConfig(),
- inboundRateLimiterConfig: getInboundRateLimiterConfig()
- });
- s_lockReleaseTokenPoolAndProxy.applyChainUpdates(chainUpdates);
- }
-
- function test_Fuzz_SetChainRateLimiterConfig_Success(uint128 capacity, uint128 rate, uint32 newTime) public {
- // Cap the lower bound to 4 so 4/2 is still >= 2
- vm.assume(capacity >= 4);
- // Cap the lower bound to 2 so 2/2 is still >= 1
- rate = uint128(bound(rate, 2, capacity - 2));
- // Bucket updates only work on increasing time
- newTime = uint32(bound(newTime, block.timestamp + 1, type(uint32).max));
- vm.warp(newTime);
-
- uint256 oldOutboundTokens =
- s_lockReleaseTokenPoolAndProxy.getCurrentOutboundRateLimiterState(s_remoteChainSelector).tokens;
- uint256 oldInboundTokens =
- s_lockReleaseTokenPoolAndProxy.getCurrentInboundRateLimiterState(s_remoteChainSelector).tokens;
-
- RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({isEnabled: true, capacity: capacity, rate: rate});
- RateLimiter.Config memory newInboundConfig =
- RateLimiter.Config({isEnabled: true, capacity: capacity / 2, rate: rate / 2});
-
- vm.expectEmit();
- emit ConfigChanged(newOutboundConfig);
- vm.expectEmit();
- emit ConfigChanged(newInboundConfig);
- vm.expectEmit();
- emit ChainConfigured(s_remoteChainSelector, newOutboundConfig, newInboundConfig);
-
- s_lockReleaseTokenPoolAndProxy.setChainRateLimiterConfig(s_remoteChainSelector, newOutboundConfig, newInboundConfig);
-
- uint256 expectedTokens = RateLimiter._min(newOutboundConfig.capacity, oldOutboundTokens);
-
- RateLimiter.TokenBucket memory bucket =
- s_lockReleaseTokenPoolAndProxy.getCurrentOutboundRateLimiterState(s_remoteChainSelector);
- assertEq(bucket.capacity, newOutboundConfig.capacity);
- assertEq(bucket.rate, newOutboundConfig.rate);
- assertEq(bucket.tokens, expectedTokens);
- assertEq(bucket.lastUpdated, newTime);
-
- expectedTokens = RateLimiter._min(newInboundConfig.capacity, oldInboundTokens);
-
- bucket = s_lockReleaseTokenPoolAndProxy.getCurrentInboundRateLimiterState(s_remoteChainSelector);
- assertEq(bucket.capacity, newInboundConfig.capacity);
- assertEq(bucket.rate, newInboundConfig.rate);
- assertEq(bucket.tokens, expectedTokens);
- assertEq(bucket.lastUpdated, newTime);
- }
-
- function test_OnlyOwnerOrRateLimitAdmin_Revert() public {
- address rateLimiterAdmin = address(28973509103597907);
-
- s_lockReleaseTokenPoolAndProxy.setRateLimitAdmin(rateLimiterAdmin);
-
- vm.startPrank(rateLimiterAdmin);
-
- s_lockReleaseTokenPoolAndProxy.setChainRateLimiterConfig(
- s_remoteChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
- );
-
- vm.startPrank(OWNER);
-
- s_lockReleaseTokenPoolAndProxy.setChainRateLimiterConfig(
- s_remoteChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
- );
- }
-
- // Reverts
-
- function test_OnlyOwner_Revert() public {
- vm.startPrank(STRANGER);
-
- vm.expectRevert(abi.encodeWithSelector(LockReleaseTokenPoolAndProxy.Unauthorized.selector, STRANGER));
- s_lockReleaseTokenPoolAndProxy.setChainRateLimiterConfig(
- s_remoteChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
- );
- }
-
- function test_NonExistentChain_Revert() public {
- uint64 wrongChainSelector = 9084102894;
-
- vm.expectRevert(abi.encodeWithSelector(TokenPool.NonExistentChain.selector, wrongChainSelector));
- s_lockReleaseTokenPoolAndProxy.setChainRateLimiterConfig(
- wrongChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
- );
- }
-}
-
-contract LockReleaseTokenPoolAndProxy_setRateLimitAdmin is LockReleaseTokenPoolAndProxySetup {
- function test_SetRateLimitAdmin_Success() public {
- assertEq(address(0), s_lockReleaseTokenPoolAndProxy.getRateLimitAdmin());
- s_lockReleaseTokenPoolAndProxy.setRateLimitAdmin(OWNER);
- assertEq(OWNER, s_lockReleaseTokenPoolAndProxy.getRateLimitAdmin());
- }
-
- // Reverts
-
- function test_SetRateLimitAdmin_Revert() public {
- vm.startPrank(STRANGER);
-
- vm.expectRevert("Only callable by owner");
- s_lockReleaseTokenPoolAndProxy.setRateLimitAdmin(STRANGER);
- }
-}
diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol
index 507e966a70..ffd40d9de9 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRampSetup.t.sol
@@ -222,9 +222,7 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba
router: router,
priceRegistry: priceRegistry,
maxNumberOfTokensPerMsg: MAX_TOKENS_LENGTH,
- maxDataBytes: MAX_DATA_SIZE,
- maxPoolReleaseOrMintGas: MAX_TOKEN_POOL_RELEASE_OR_MINT_GAS,
- maxTokenTransferGas: MAX_TOKEN_POOL_TRANSFER_GAS
+ maxDataBytes: MAX_DATA_SIZE
});
}
@@ -400,8 +398,6 @@ contract EVM2EVMMultiOffRampSetup is TokenSetup, PriceRegistrySetup, MultiOCR3Ba
) public pure {
assertEq(a.permissionLessExecutionThresholdSeconds, b.permissionLessExecutionThresholdSeconds);
assertEq(a.router, b.router);
- assertEq(a.maxPoolReleaseOrMintGas, b.maxPoolReleaseOrMintGas);
- assertEq(a.maxTokenTransferGas, b.maxTokenTransferGas);
assertEq(a.messageValidator, b.messageValidator);
assertEq(a.priceRegistry, b.priceRegistry);
}
diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
index 3813ef042d..64501c9a1e 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
@@ -590,7 +590,8 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup {
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(fakePoolAddress),
destTokenAddress: abi.encode(s_destTokenBySourceToken[messages[0].tokenAmounts[0].token]),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
@@ -1221,7 +1222,8 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup {
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(s_sourcePoolByToken[s_sourceFeeToken]),
destTokenAddress: abi.encode(s_destTokenBySourceToken[s_sourceFeeToken]),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
@@ -1406,7 +1408,8 @@ contract EVM2EVMOffRamp__trialExecute is EVM2EVMOffRampSetup {
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(address(0)),
destTokenAddress: abi.encode(address(0)),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
@@ -1429,7 +1432,8 @@ contract EVM2EVMOffRamp__trialExecute is EVM2EVMOffRampSetup {
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(address(0)),
destTokenAddress: abi.encode(notAContract),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
@@ -1460,7 +1464,8 @@ contract EVM2EVMOffRamp__releaseOrMintToken is EVM2EVMOffRampSetup {
Internal.SourceTokenData memory sourceTokenData = Internal.SourceTokenData({
sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]),
destTokenAddress: abi.encode(s_destTokenBySourceToken[token]),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
});
vm.expectCall(
@@ -1496,7 +1501,8 @@ contract EVM2EVMOffRamp__releaseOrMintToken is EVM2EVMOffRampSetup {
Internal.SourceTokenData memory sourceTokenData = Internal.SourceTokenData({
sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]),
destTokenAddress: abi.encode(destToken),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
});
// Address(0) should always revert
@@ -1537,7 +1543,8 @@ contract EVM2EVMOffRamp__releaseOrMintToken is EVM2EVMOffRampSetup {
Internal.SourceTokenData memory sourceTokenData = Internal.SourceTokenData({
sourcePoolAddress: abi.encode(s_sourcePoolByToken[token]),
destTokenAddress: abi.encode(destToken),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
});
bytes memory revertData = "call reverted :o";
@@ -1731,7 +1738,8 @@ contract EVM2EVMOffRamp__releaseOrMintTokens is EVM2EVMOffRampSetup {
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(s_sourcePoolByToken[srcTokenAmounts[0].token]),
destTokenAddress: wrongAddress,
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
@@ -1778,7 +1786,8 @@ contract EVM2EVMOffRamp__releaseOrMintTokens is EVM2EVMOffRampSetup {
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(fakePoolAddress),
destTokenAddress: abi.encode(fakePoolAddress),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
@@ -1821,7 +1830,8 @@ contract EVM2EVMOffRamp__releaseOrMintTokens is EVM2EVMOffRampSetup {
Internal.SourceTokenData({
sourcePoolAddress: unusedVar,
destTokenAddress: abi.encode(destPool),
- extraData: unusedVar
+ extraData: unusedVar,
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol
index 053869b88a..b67adbf37e 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRampSetup.t.sol
@@ -90,9 +90,7 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup {
router: router,
priceRegistry: priceRegistry,
maxNumberOfTokensPerMsg: MAX_TOKENS_LENGTH,
- maxDataBytes: MAX_DATA_SIZE,
- maxPoolReleaseOrMintGas: MAX_TOKEN_POOL_RELEASE_OR_MINT_GAS,
- maxTokenTransferGas: MAX_TOKEN_POOL_TRANSFER_GAS
+ maxDataBytes: MAX_DATA_SIZE
});
}
@@ -170,7 +168,8 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup {
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(s_sourcePoolByToken[tokenAmounts[i].token]),
destTokenAddress: abi.encode(s_destTokenBySourceToken[tokenAmounts[i].token]),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
}
@@ -240,8 +239,6 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup {
assertEq(a.priceRegistry, b.priceRegistry);
assertEq(a.maxNumberOfTokensPerMsg, b.maxNumberOfTokensPerMsg);
assertEq(a.maxDataBytes, b.maxDataBytes);
- assertEq(a.maxPoolReleaseOrMintGas, b.maxPoolReleaseOrMintGas);
- assertEq(a.maxTokenTransferGas, b.maxTokenTransferGas);
}
function _getDefaultSourceTokenData(Client.EVMTokenAmount[] memory srcTokenAmounts)
@@ -255,7 +252,8 @@ contract EVM2EVMOffRampSetup is TokenSetup, PriceRegistrySetup, OCR2BaseSetup {
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(s_sourcePoolByToken[srcTokenAmounts[i].token]),
destTokenAddress: abi.encode(s_destTokenBySourceToken[srcTokenAmounts[i].token]),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
}
diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol
index 197a87b708..a30ecc9130 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRamp.t.sol
@@ -339,7 +339,6 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup {
maxPerMsgGasLimit: dynamicConfig.maxPerMsgGasLimit,
defaultTokenFeeUSDCents: dynamicConfig.defaultTokenFeeUSDCents,
defaultTokenDestGasOverhead: dynamicConfig.defaultTokenDestGasOverhead,
- defaultTokenDestBytesOverhead: dynamicConfig.defaultTokenDestBytesOverhead,
enforceOutOfOrder: enforce
})
);
@@ -522,6 +521,68 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup {
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
}
+ function test_forwardFromRouter_correctSourceTokenData_Success() public {
+ Client.EVM2AnyMessage memory message = _generateTokenMessage();
+
+ for (uint256 i = 0; i < message.tokenAmounts.length; ++i) {
+ address token = message.tokenAmounts[i].token;
+ deal(token, s_sourcePoolByToken[token], message.tokenAmounts[i].amount * 2);
+ }
+
+ uint256 feeAmount = 1234567890;
+ IERC20(s_sourceFeeToken).transferFrom(OWNER, address(s_onRamp), feeAmount * 2);
+
+ Internal.EVM2EVMMessage memory expectedEvent = _messageToEvent(message, 1, 1, feeAmount, OWNER);
+
+ vm.expectEmit();
+ emit EVM2EVMOnRamp.CCIPSendRequested(expectedEvent);
+
+ s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
+
+ // Same message, but we change the onchain config which should be reflected in the event.
+ // We get the event before changing the onRamp config, as the event generation code uses the current
+ // onramp to generate the event. This test checks if it does so correctly.
+ expectedEvent = _messageToEvent(message, 2, 2, feeAmount, OWNER);
+
+ uint256 tokenIndexToChange = 1;
+ address changedToken = message.tokenAmounts[tokenIndexToChange].token;
+
+ // Set token config to change the destGasOverhead
+ vm.startPrank(OWNER);
+ EVM2EVMOnRamp.TokenTransferFeeConfigArgs[] memory tokenTransferFeeConfigArgs =
+ new EVM2EVMOnRamp.TokenTransferFeeConfigArgs[](1);
+ tokenTransferFeeConfigArgs[0] = EVM2EVMOnRamp.TokenTransferFeeConfigArgs({
+ token: changedToken,
+ minFeeUSDCents: 0,
+ maxFeeUSDCents: 100,
+ deciBps: 0,
+ destGasOverhead: 1_000_111,
+ destBytesOverhead: uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) + 32,
+ aggregateRateLimitEnabled: false
+ });
+ s_onRamp.setTokenTransferFeeConfig(tokenTransferFeeConfigArgs, new address[](0));
+
+ vm.startPrank(address(s_sourceRouter));
+
+ expectedEvent.sourceTokenData[tokenIndexToChange] = abi.encode(
+ Internal.SourceTokenData({
+ sourcePoolAddress: abi.encode(s_sourcePoolByToken[changedToken]),
+ destTokenAddress: abi.encode(s_destTokenBySourceToken[changedToken]),
+ extraData: "",
+ // The user will be billed either the default or the override, so we send the exact amount that we billed for
+ // to the destination chain to be used for the token releaseOrMint and transfer.
+ destGasAmount: tokenTransferFeeConfigArgs[0].destGasOverhead
+ })
+ );
+ // Update the hash because we manually changed sourceTokenData
+ expectedEvent.messageId = Internal._hash(expectedEvent, s_metadataHash);
+
+ vm.expectEmit();
+ emit EVM2EVMOnRamp.CCIPSendRequested(expectedEvent);
+
+ s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, feeAmount, OWNER);
+ }
+
// Reverts
function test_Paused_Revert() public {
@@ -806,7 +867,6 @@ contract EVM2EVMOnRamp_forwardFromRouter is EVM2EVMOnRampSetup {
maxPerMsgGasLimit: dynamicConfig.maxPerMsgGasLimit,
defaultTokenFeeUSDCents: dynamicConfig.defaultTokenFeeUSDCents,
defaultTokenDestGasOverhead: dynamicConfig.defaultTokenDestGasOverhead,
- defaultTokenDestBytesOverhead: dynamicConfig.defaultTokenDestBytesOverhead,
enforceOutOfOrder: true
})
);
@@ -1155,32 +1215,6 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup {
assertEq(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES, destBytesOverhead);
}
- function test_WETHTokenBpsFee_Success() public view {
- uint256 tokenAmount = 100e18;
-
- Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
- receiver: abi.encode(OWNER),
- data: "",
- tokenAmounts: new Client.EVMTokenAmount[](1),
- feeToken: s_sourceRouter.getWrappedNative(),
- extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: GAS_LIMIT}))
- });
- message.tokenAmounts[0] = Client.EVMTokenAmount({token: s_sourceRouter.getWrappedNative(), amount: tokenAmount});
-
- EVM2EVMOnRamp.TokenTransferFeeConfig memory transferFeeConfig =
- s_onRamp.getTokenTransferFeeConfig(message.tokenAmounts[0].token);
-
- (uint256 feeUSDWei, uint32 destGasOverhead, uint32 destBytesOverhead) =
- s_onRamp.getTokenTransferCost(message.feeToken, s_wrappedTokenPrice, message.tokenAmounts);
-
- uint256 usdWei = calcUSDValueFromTokenAmount(s_wrappedTokenPrice, tokenAmount);
- uint256 bpsUSDWei = applyBpsRatio(usdWei, s_tokenTransferFeeConfigArgs[1].deciBps);
-
- assertEq(bpsUSDWei, feeUSDWei);
- assertEq(transferFeeConfig.destGasOverhead, destGasOverhead);
- assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead);
- }
-
function test_CustomTokenBpsFee_Success() public view {
uint256 tokenAmount = 200000e18;
@@ -1200,7 +1234,7 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup {
s_onRamp.getTokenTransferCost(message.feeToken, s_feeTokenPrice, message.tokenAmounts);
uint256 usdWei = calcUSDValueFromTokenAmount(s_customTokenPrice, tokenAmount);
- uint256 bpsUSDWei = applyBpsRatio(usdWei, s_tokenTransferFeeConfigArgs[2].deciBps);
+ uint256 bpsUSDWei = applyBpsRatio(usdWei, s_tokenTransferFeeConfigArgs[1].deciBps);
assertEq(bpsUSDWei, feeUSDWei);
assertEq(transferFeeConfig.destGasOverhead, destGasOverhead);
@@ -1280,51 +1314,57 @@ contract EVM2EVMOnRamp_getTokenTransferCost is EVM2EVMOnRamp_getFeeSetup {
// Start with small token transfers, total bps fee is lower than min token transfer fee
for (uint256 i = 0; i < testTokens.length; ++i) {
message.tokenAmounts[i] = Client.EVMTokenAmount({token: testTokens[i], amount: 1e14});
- expectedTotalGas += s_onRamp.getTokenTransferFeeConfig(testTokens[i]).destGasOverhead;
- uint32 dstBytesOverhead = s_onRamp.getTokenTransferFeeConfig(message.tokenAmounts[i].token).destBytesOverhead;
- expectedTotalBytes += dstBytesOverhead == 0 ? uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES) : dstBytesOverhead;
+ EVM2EVMOnRamp.TokenTransferFeeConfig memory tokenTransferFeeConfig =
+ s_onRamp.getTokenTransferFeeConfig(testTokens[i]);
+ expectedTotalGas += tokenTransferFeeConfig.destGasOverhead == 0
+ ? DEFAULT_TOKEN_DEST_GAS_OVERHEAD
+ : tokenTransferFeeConfig.destGasOverhead;
+ expectedTotalBytes += tokenTransferFeeConfig.destBytesOverhead == 0
+ ? uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES)
+ : tokenTransferFeeConfig.destBytesOverhead;
}
(uint256 feeUSDWei, uint32 destGasOverhead, uint32 destBytesOverhead) =
s_onRamp.getTokenTransferCost(message.feeToken, s_wrappedTokenPrice, message.tokenAmounts);
uint256 expectedFeeUSDWei = 0;
for (uint256 i = 0; i < testTokens.length; ++i) {
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[i].minFeeUSDCents);
+ expectedFeeUSDWei += configUSDCentToWei(
+ tokenTransferFeeConfigs[i].minFeeUSDCents == 0
+ ? DEFAULT_TOKEN_FEE_USD_CENTS
+ : tokenTransferFeeConfigs[i].minFeeUSDCents
+ );
}
- assertEq(expectedFeeUSDWei, feeUSDWei);
- assertEq(expectedTotalGas, destGasOverhead);
- assertEq(expectedTotalBytes, destBytesOverhead);
+ assertEq(expectedFeeUSDWei, feeUSDWei, "wrong feeUSDWei 1");
+ assertEq(expectedTotalGas, destGasOverhead, "wrong destGasOverhead 1");
+ assertEq(expectedTotalBytes, destBytesOverhead, "wrong destBytesOverhead 1");
// Set 1st token transfer to a meaningful amount so its bps fee is now between min and max fee
message.tokenAmounts[0] = Client.EVMTokenAmount({token: testTokens[0], amount: 10000e18});
- (feeUSDWei, destGasOverhead, destBytesOverhead) =
- s_onRamp.getTokenTransferCost(message.feeToken, s_wrappedTokenPrice, message.tokenAmounts);
- expectedFeeUSDWei = applyBpsRatio(
+ uint256 token0USDWei = applyBpsRatio(
calcUSDValueFromTokenAmount(tokenPrices[0], message.tokenAmounts[0].amount), tokenTransferFeeConfigs[0].deciBps
);
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[1].minFeeUSDCents);
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[2].minFeeUSDCents);
+ uint256 token1USDWei = configUSDCentToWei(DEFAULT_TOKEN_FEE_USD_CENTS);
+
+ (feeUSDWei, destGasOverhead, destBytesOverhead) =
+ s_onRamp.getTokenTransferCost(message.feeToken, s_wrappedTokenPrice, message.tokenAmounts);
+ expectedFeeUSDWei = token0USDWei + token1USDWei + configUSDCentToWei(tokenTransferFeeConfigs[2].minFeeUSDCents);
- assertEq(expectedFeeUSDWei, feeUSDWei);
- assertEq(expectedTotalGas, destGasOverhead);
- assertEq(expectedTotalBytes, destBytesOverhead);
+ assertEq(expectedFeeUSDWei, feeUSDWei, "wrong feeUSDWei 2");
+ assertEq(expectedTotalGas, destGasOverhead, "wrong destGasOverhead 2");
+ assertEq(expectedTotalBytes, destBytesOverhead, "wrong destBytesOverhead 2");
// Set 2nd token transfer to a large amount that is higher than maxFeeUSD
- message.tokenAmounts[1] = Client.EVMTokenAmount({token: testTokens[1], amount: 1e36});
+ message.tokenAmounts[2] = Client.EVMTokenAmount({token: testTokens[2], amount: 1e36});
(feeUSDWei, destGasOverhead, destBytesOverhead) =
s_onRamp.getTokenTransferCost(message.feeToken, s_wrappedTokenPrice, message.tokenAmounts);
- expectedFeeUSDWei = applyBpsRatio(
- calcUSDValueFromTokenAmount(tokenPrices[0], message.tokenAmounts[0].amount), tokenTransferFeeConfigs[0].deciBps
- );
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[1].maxFeeUSDCents);
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[2].minFeeUSDCents);
+ expectedFeeUSDWei = token0USDWei + token1USDWei + configUSDCentToWei(tokenTransferFeeConfigs[2].maxFeeUSDCents);
- assertEq(expectedFeeUSDWei, feeUSDWei);
- assertEq(expectedTotalGas, destGasOverhead);
- assertEq(expectedTotalBytes, destBytesOverhead);
+ assertEq(expectedFeeUSDWei, feeUSDWei, "wrong feeUSDWei 3");
+ assertEq(expectedTotalGas, destGasOverhead, "wrong destGasOverhead 3");
+ assertEq(expectedTotalBytes, destBytesOverhead, "wrong destBytesOverhead 3");
}
// reverts
@@ -1926,7 +1966,6 @@ contract EVM2EVMOnRamp_setDynamicConfig is EVM2EVMOnRampSetup {
maxPerMsgGasLimit: MAX_GAS_LIMIT / 2,
defaultTokenFeeUSDCents: DEFAULT_TOKEN_FEE_USD_CENTS,
defaultTokenDestGasOverhead: DEFAULT_TOKEN_DEST_GAS_OVERHEAD,
- defaultTokenDestBytesOverhead: DEFAULT_TOKEN_BYTES_OVERHEAD,
enforceOutOfOrder: false
});
@@ -1961,7 +2000,6 @@ contract EVM2EVMOnRamp_setDynamicConfig is EVM2EVMOnRampSetup {
maxPerMsgGasLimit: MAX_GAS_LIMIT / 2,
defaultTokenFeeUSDCents: DEFAULT_TOKEN_FEE_USD_CENTS,
defaultTokenDestGasOverhead: DEFAULT_TOKEN_DEST_GAS_OVERHEAD,
- defaultTokenDestBytesOverhead: DEFAULT_TOKEN_BYTES_OVERHEAD,
enforceOutOfOrder: false
});
diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol
index 6659b1217f..91e47a7e98 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMOnRampSetup.t.sol
@@ -65,29 +65,18 @@ contract EVM2EVMOnRampSetup is TokenSetup, PriceRegistrySetup {
minFeeUSDCents: 1_00, // 1 USD
maxFeeUSDCents: 1000_00, // 1,000 USD
deciBps: 2_5, // 2.5 bps, or 0.025%
- destGasOverhead: 40_000,
+ destGasOverhead: 100_000,
destBytesOverhead: uint32(Pool.CCIP_LOCK_OR_BURN_V1_RET_BYTES),
aggregateRateLimitEnabled: true
})
);
- s_tokenTransferFeeConfigArgs.push(
- EVM2EVMOnRamp.TokenTransferFeeConfigArgs({
- token: s_sourceRouter.getWrappedNative(),
- minFeeUSDCents: 50, // 0.5 USD
- maxFeeUSDCents: 500_00, // 500 USD
- deciBps: 5_0, // 5 bps, or 0.05%
- destGasOverhead: 10_000,
- destBytesOverhead: 100,
- aggregateRateLimitEnabled: true
- })
- );
s_tokenTransferFeeConfigArgs.push(
EVM2EVMOnRamp.TokenTransferFeeConfigArgs({
token: CUSTOM_TOKEN,
minFeeUSDCents: 2_00, // 1 USD
- maxFeeUSDCents: 2000_00, // 1,000 USD
+ maxFeeUSDCents: 500_00, // 500 USD
deciBps: 10_0, // 10 bps, or 0.1%
- destGasOverhead: 1,
+ destGasOverhead: 90_000,
destBytesOverhead: 200,
aggregateRateLimitEnabled: true
})
@@ -157,7 +146,6 @@ contract EVM2EVMOnRampSetup is TokenSetup, PriceRegistrySetup {
maxPerMsgGasLimit: MAX_GAS_LIMIT,
defaultTokenFeeUSDCents: DEFAULT_TOKEN_FEE_USD_CENTS,
defaultTokenDestGasOverhead: DEFAULT_TOKEN_DEST_GAS_OVERHEAD,
- defaultTokenDestBytesOverhead: DEFAULT_TOKEN_BYTES_OVERHEAD,
enforceOutOfOrder: false
});
}
@@ -232,11 +220,17 @@ contract EVM2EVMOnRampSetup is TokenSetup, PriceRegistrySetup {
});
for (uint256 i = 0; i < numberOfTokens; ++i) {
+ EVM2EVMOnRamp.TokenTransferFeeConfig memory tokenTransferFeeConfig =
+ s_onRamp.getTokenTransferFeeConfig(message.tokenAmounts[i].token);
+
messageEvent.sourceTokenData[i] = abi.encode(
Internal.SourceTokenData({
sourcePoolAddress: abi.encode(s_sourcePoolByToken[message.tokenAmounts[i].token]),
destTokenAddress: abi.encode(s_destTokenBySourceToken[message.tokenAmounts[i].token]),
- extraData: ""
+ extraData: "",
+ destGasAmount: tokenTransferFeeConfig.isEnabled
+ ? tokenTransferFeeConfig.destGasOverhead
+ : DEFAULT_TOKEN_DEST_GAS_OVERHEAD
})
);
}
diff --git a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool.t.sol b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool.t.sol
index 97d0d4e894..6af905cfe5 100644
--- a/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/LockReleaseTokenPool.t.sol
@@ -333,7 +333,7 @@ contract LockReleaseTokenPool_provideLiquidity is LockReleaseTokenPoolSetup {
function test_Unauthorized_Revert() public {
vm.startPrank(STRANGER);
- vm.expectRevert(abi.encodeWithSelector(LockReleaseTokenPool.Unauthorized.selector, STRANGER));
+ vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, STRANGER));
s_lockReleaseTokenPool.provideLiquidity(1);
}
@@ -368,7 +368,7 @@ contract LockReleaseTokenPool_withdrawalLiquidity is LockReleaseTokenPoolSetup {
function test_Unauthorized_Revert() public {
vm.startPrank(STRANGER);
- vm.expectRevert(abi.encodeWithSelector(LockReleaseTokenPool.Unauthorized.selector, STRANGER));
+ vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, STRANGER));
s_lockReleaseTokenPool.withdrawLiquidity(1);
}
@@ -387,126 +387,47 @@ contract LockReleaseTokenPool_withdrawalLiquidity is LockReleaseTokenPoolSetup {
}
}
-contract LockReleaseTokenPool_supportsInterface is LockReleaseTokenPoolSetup {
- function test_SupportsInterface_Success() public view {
- assertTrue(s_lockReleaseTokenPool.supportsInterface(type(IPoolV1).interfaceId));
- assertTrue(s_lockReleaseTokenPool.supportsInterface(type(IERC165).interfaceId));
- }
-}
-
-contract LockReleaseTokenPool_setChainRateLimiterConfig is LockReleaseTokenPoolSetup {
- uint64 internal s_remoteChainSelector;
+contract LockReleaseTokenPool_transferLiquidity is LockReleaseTokenPoolSetup {
+ LockReleaseTokenPool internal s_oldLockReleaseTokenPool;
+ uint256 internal s_amount = 100000;
function setUp() public virtual override {
- LockReleaseTokenPoolSetup.setUp();
- TokenPool.ChainUpdate[] memory chainUpdates = new TokenPool.ChainUpdate[](1);
- s_remoteChainSelector = 123124;
- chainUpdates[0] = TokenPool.ChainUpdate({
- remoteChainSelector: s_remoteChainSelector,
- remotePoolAddress: abi.encode(address(1)),
- remoteTokenAddress: abi.encode(address(2)),
- allowed: true,
- outboundRateLimiterConfig: getOutboundRateLimiterConfig(),
- inboundRateLimiterConfig: getInboundRateLimiterConfig()
- });
- s_lockReleaseTokenPool.applyChainUpdates(chainUpdates);
- }
-
- function test_Fuzz_SetChainRateLimiterConfig_Success(uint128 capacity, uint128 rate, uint32 newTime) public {
- // Cap the lower bound to 4 so 4/2 is still >= 2
- vm.assume(capacity >= 4);
- // Cap the lower bound to 2 so 2/2 is still >= 1
- rate = uint128(bound(rate, 2, capacity - 2));
- // Bucket updates only work on increasing time
- newTime = uint32(bound(newTime, block.timestamp + 1, type(uint32).max));
- vm.warp(newTime);
-
- uint256 oldOutboundTokens = s_lockReleaseTokenPool.getCurrentOutboundRateLimiterState(s_remoteChainSelector).tokens;
- uint256 oldInboundTokens = s_lockReleaseTokenPool.getCurrentInboundRateLimiterState(s_remoteChainSelector).tokens;
-
- RateLimiter.Config memory newOutboundConfig = RateLimiter.Config({isEnabled: true, capacity: capacity, rate: rate});
- RateLimiter.Config memory newInboundConfig =
- RateLimiter.Config({isEnabled: true, capacity: capacity / 2, rate: rate / 2});
-
- vm.expectEmit();
- emit RateLimiter.ConfigChanged(newOutboundConfig);
- vm.expectEmit();
- emit RateLimiter.ConfigChanged(newInboundConfig);
- vm.expectEmit();
- emit TokenPool.ChainConfigured(s_remoteChainSelector, newOutboundConfig, newInboundConfig);
-
- s_lockReleaseTokenPool.setChainRateLimiterConfig(s_remoteChainSelector, newOutboundConfig, newInboundConfig);
-
- uint256 expectedTokens = RateLimiter._min(newOutboundConfig.capacity, oldOutboundTokens);
-
- RateLimiter.TokenBucket memory bucket =
- s_lockReleaseTokenPool.getCurrentOutboundRateLimiterState(s_remoteChainSelector);
- assertEq(bucket.capacity, newOutboundConfig.capacity);
- assertEq(bucket.rate, newOutboundConfig.rate);
- assertEq(bucket.tokens, expectedTokens);
- assertEq(bucket.lastUpdated, newTime);
+ super.setUp();
- expectedTokens = RateLimiter._min(newInboundConfig.capacity, oldInboundTokens);
+ s_oldLockReleaseTokenPool =
+ new LockReleaseTokenPool(s_token, new address[](0), address(s_mockRMN), true, address(s_sourceRouter));
- bucket = s_lockReleaseTokenPool.getCurrentInboundRateLimiterState(s_remoteChainSelector);
- assertEq(bucket.capacity, newInboundConfig.capacity);
- assertEq(bucket.rate, newInboundConfig.rate);
- assertEq(bucket.tokens, expectedTokens);
- assertEq(bucket.lastUpdated, newTime);
+ deal(address(s_token), address(s_oldLockReleaseTokenPool), s_amount);
}
- function test_OnlyOwnerOrRateLimitAdmin_Revert() public {
- address rateLimiterAdmin = address(28973509103597907);
-
- s_lockReleaseTokenPool.setRateLimitAdmin(rateLimiterAdmin);
+ function test_transferLiquidity_Success() public {
+ uint256 balancePre = s_token.balanceOf(address(s_lockReleaseTokenPool));
- vm.startPrank(rateLimiterAdmin);
+ s_oldLockReleaseTokenPool.setRebalancer(address(s_lockReleaseTokenPool));
- s_lockReleaseTokenPool.setChainRateLimiterConfig(
- s_remoteChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
- );
+ vm.expectEmit();
+ emit LockReleaseTokenPool.LiquidityTransferred(address(s_oldLockReleaseTokenPool), s_amount);
- vm.startPrank(OWNER);
+ s_lockReleaseTokenPool.transferLiquidity(address(s_oldLockReleaseTokenPool), s_amount);
- s_lockReleaseTokenPool.setChainRateLimiterConfig(
- s_remoteChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
- );
+ assertEq(s_token.balanceOf(address(s_lockReleaseTokenPool)), balancePre + s_amount);
}
- // Reverts
-
- function test_OnlyOwner_Revert() public {
- vm.startPrank(STRANGER);
+ function test_transferLiquidity_transferTooMuch_Revert() public {
+ uint256 balancePre = s_token.balanceOf(address(s_lockReleaseTokenPool));
- vm.expectRevert(abi.encodeWithSelector(LockReleaseTokenPool.Unauthorized.selector, STRANGER));
- s_lockReleaseTokenPool.setChainRateLimiterConfig(
- s_remoteChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
- );
- }
+ s_oldLockReleaseTokenPool.setRebalancer(address(s_lockReleaseTokenPool));
- function test_NonExistentChain_Revert() public {
- uint64 wrongChainSelector = 9084102894;
+ vm.expectRevert(LockReleaseTokenPool.InsufficientLiquidity.selector);
+ s_lockReleaseTokenPool.transferLiquidity(address(s_oldLockReleaseTokenPool), s_amount + 1);
- vm.expectRevert(abi.encodeWithSelector(TokenPool.NonExistentChain.selector, wrongChainSelector));
- s_lockReleaseTokenPool.setChainRateLimiterConfig(
- wrongChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
- );
+ assertEq(s_token.balanceOf(address(s_lockReleaseTokenPool)), balancePre);
}
}
-contract LockReleaseTokenPool_setRateLimitAdmin is LockReleaseTokenPoolSetup {
- function test_SetRateLimitAdmin_Success() public {
- assertEq(address(0), s_lockReleaseTokenPool.getRateLimitAdmin());
- s_lockReleaseTokenPool.setRateLimitAdmin(OWNER);
- assertEq(OWNER, s_lockReleaseTokenPool.getRateLimitAdmin());
- }
-
- // Reverts
-
- function test_SetRateLimitAdmin_Revert() public {
- vm.startPrank(STRANGER);
-
- vm.expectRevert("Only callable by owner");
- s_lockReleaseTokenPool.setRateLimitAdmin(STRANGER);
+contract LockReleaseTokenPool_supportsInterface is LockReleaseTokenPoolSetup {
+ function test_SupportsInterface_Success() public view {
+ assertTrue(s_lockReleaseTokenPool.supportsInterface(type(IPoolV1).interfaceId));
+ assertTrue(s_lockReleaseTokenPool.supportsInterface(type(IERC165).interfaceId));
}
}
diff --git a/contracts/src/v0.8/ccip/test/pools/TokenPool.t.sol b/contracts/src/v0.8/ccip/test/pools/TokenPool.t.sol
index e5eb04b741..2c9eaf6df0 100644
--- a/contracts/src/v0.8/ccip/test/pools/TokenPool.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/TokenPool.t.sol
@@ -429,10 +429,10 @@ contract TokenPool_setChainRateLimiterConfig is TokenPoolSetup {
// Reverts
- function test_OnlyOwner_Revert() public {
+ function test_OnlyOwnerOrRateLimitAdmin_Revert() public {
vm.startPrank(STRANGER);
- vm.expectRevert("Only callable by owner");
+ vm.expectRevert(abi.encodeWithSelector(TokenPool.Unauthorized.selector, STRANGER));
s_tokenPool.setChainRateLimiterConfig(
s_remoteChainSelector, getOutboundRateLimiterConfig(), getInboundRateLimiterConfig()
);
@@ -448,6 +448,23 @@ contract TokenPool_setChainRateLimiterConfig is TokenPoolSetup {
}
}
+contract LockRelease_setRateLimitAdmin is TokenPoolSetup {
+ function test_SetRateLimitAdmin_Success() public {
+ assertEq(address(0), s_tokenPool.getRateLimitAdmin());
+ s_tokenPool.setRateLimitAdmin(OWNER);
+ assertEq(OWNER, s_tokenPool.getRateLimitAdmin());
+ }
+
+ // Reverts
+
+ function test_SetRateLimitAdmin_Revert() public {
+ vm.startPrank(STRANGER);
+
+ vm.expectRevert("Only callable by owner");
+ s_tokenPool.setRateLimitAdmin(STRANGER);
+ }
+}
+
contract TokenPool_onlyOnRamp is TokenPoolSetup {
function test_onlyOnRamp_Success() public {
uint64 chainSelector = 13377;
diff --git a/contracts/src/v0.8/ccip/test/pools/USDCTokenPool.t.sol b/contracts/src/v0.8/ccip/test/pools/USDCTokenPool.t.sol
index 200ffb4f6d..564407df5a 100644
--- a/contracts/src/v0.8/ccip/test/pools/USDCTokenPool.t.sol
+++ b/contracts/src/v0.8/ccip/test/pools/USDCTokenPool.t.sol
@@ -23,6 +23,7 @@ contract USDCTokenPoolSetup is BaseTest {
IBurnMintERC20 internal s_token;
MockUSDCTokenMessenger internal s_mockUSDC;
MockE2EUSDCTransmitter internal s_mockUSDCTransmitter;
+ uint32 internal constant USDC_DEST_TOKEN_GAS = 150_000;
struct USDCMessage {
uint32 version;
@@ -319,24 +320,6 @@ contract USDCTokenPool_lockOrBurn is USDCTokenPoolSetup {
})
);
}
-
- function test_lockOrBurn_InvalidReceiver_Revert() public {
- vm.startPrank(s_routerAllowedOnRamp);
-
- bytes memory receiver = abi.encodePacked(address(0), address(1));
-
- vm.expectRevert(abi.encodeWithSelector(USDCTokenPool.InvalidReceiver.selector, receiver));
-
- s_usdcTokenPool.lockOrBurn(
- Pool.LockOrBurnInV1({
- originalSender: OWNER,
- receiver: receiver,
- amount: 1,
- remoteChainSelector: DEST_CHAIN_SELECTOR,
- localToken: address(s_token)
- })
- );
- }
}
contract USDCTokenPool_releaseOrMint is USDCTokenPoolSetup {
@@ -363,7 +346,8 @@ contract USDCTokenPool_releaseOrMint is USDCTokenPoolSetup {
destTokenAddress: abi.encode(address(s_usdcTokenPool)),
extraData: abi.encode(
USDCTokenPool.SourceTokenDataPayload({nonce: usdcMessage.nonce, sourceDomain: SOURCE_DOMAIN_IDENTIFIER})
- )
+ ),
+ destGasAmount: USDC_DEST_TOKEN_GAS
});
bytes memory offchainTokenData =
@@ -408,7 +392,8 @@ contract USDCTokenPool_releaseOrMint is USDCTokenPoolSetup {
Internal.SourceTokenData memory sourceTokenData = Internal.SourceTokenData({
sourcePoolAddress: abi.encode(SOURCE_CHAIN_USDC_POOL),
destTokenAddress: abi.encode(address(s_usdcTokenPool)),
- extraData: abi.encode(USDCTokenPool.SourceTokenDataPayload({nonce: nonce, sourceDomain: sourceDomain}))
+ extraData: abi.encode(USDCTokenPool.SourceTokenDataPayload({nonce: nonce, sourceDomain: sourceDomain})),
+ destGasAmount: USDC_DEST_TOKEN_GAS
});
// The mocked receiver does not release the token to the pool, so we manually do it here
@@ -460,7 +445,8 @@ contract USDCTokenPool_releaseOrMint is USDCTokenPoolSetup {
destTokenAddress: abi.encode(address(s_usdcTokenPool)),
extraData: abi.encode(
USDCTokenPool.SourceTokenDataPayload({nonce: usdcMessage.nonce, sourceDomain: SOURCE_DOMAIN_IDENTIFIER})
- )
+ ),
+ destGasAmount: USDC_DEST_TOKEN_GAS
});
bytes memory offchainTokenData = abi.encode(
@@ -492,7 +478,8 @@ contract USDCTokenPool_releaseOrMint is USDCTokenPoolSetup {
Internal.SourceTokenData memory sourceTokenData = Internal.SourceTokenData({
sourcePoolAddress: abi.encode(SOURCE_CHAIN_USDC_POOL),
destTokenAddress: abi.encode(address(s_usdcTokenPool)),
- extraData: abi.encode(USDCTokenPool.SourceTokenDataPayload({nonce: 1, sourceDomain: SOURCE_DOMAIN_IDENTIFIER}))
+ extraData: abi.encode(USDCTokenPool.SourceTokenDataPayload({nonce: 1, sourceDomain: SOURCE_DOMAIN_IDENTIFIER})),
+ destGasAmount: USDC_DEST_TOKEN_GAS
});
bytes memory offchainTokenData =
diff --git a/contracts/src/v0.8/ccip/test/priceRegistry/PriceRegistry.t.sol b/contracts/src/v0.8/ccip/test/priceRegistry/PriceRegistry.t.sol
index c3c22ef290..b26eb56474 100644
--- a/contracts/src/v0.8/ccip/test/priceRegistry/PriceRegistry.t.sol
+++ b/contracts/src/v0.8/ccip/test/priceRegistry/PriceRegistry.t.sol
@@ -139,19 +139,6 @@ contract PriceRegistrySetup is TokenSetup {
})
})
);
- s_priceRegistryTokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs.push(
- PriceRegistry.TokenTransferFeeConfigSingleTokenArgs({
- token: s_sourceRouter.getWrappedNative(),
- tokenTransferFeeConfig: PriceRegistry.TokenTransferFeeConfig({
- minFeeUSDCents: 50, // 0.5 USD
- maxFeeUSDCents: 500_00, // 500 USD
- deciBps: 5_0, // 5 bps, or 0.05%
- destGasOverhead: 10_000,
- destBytesOverhead: 100,
- isEnabled: true
- })
- })
- );
s_priceRegistryTokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs.push(
PriceRegistry.TokenTransferFeeConfigSingleTokenArgs({
token: CUSTOM_TOKEN,
@@ -1777,35 +1764,6 @@ contract PriceRegistry_getTokenTransferCost is PriceRegistryFeeSetup {
assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead);
}
- function test_WETHTokenBpsFee_Success() public view {
- uint256 tokenAmount = 100e18;
-
- Client.EVM2AnyMessage memory message = Client.EVM2AnyMessage({
- receiver: abi.encode(OWNER),
- data: "",
- tokenAmounts: new Client.EVMTokenAmount[](1),
- feeToken: s_sourceRouter.getWrappedNative(),
- extraArgs: Client._argsToBytes(Client.EVMExtraArgsV1({gasLimit: GAS_LIMIT}))
- });
- message.tokenAmounts[0] = Client.EVMTokenAmount({token: s_sourceRouter.getWrappedNative(), amount: tokenAmount});
-
- PriceRegistry.TokenTransferFeeConfig memory transferFeeConfig =
- s_priceRegistry.getTokenTransferFeeConfig(DEST_CHAIN_SELECTOR, message.tokenAmounts[0].token);
-
- (uint256 feeUSDWei, uint32 destGasOverhead, uint32 destBytesOverhead) = s_priceRegistry.getTokenTransferCost(
- DEST_CHAIN_SELECTOR, message.feeToken, s_wrappedTokenPrice, message.tokenAmounts
- );
-
- uint256 usdWei = calcUSDValueFromTokenAmount(s_wrappedTokenPrice, tokenAmount);
- uint256 bpsUSDWei = applyBpsRatio(
- usdWei, s_priceRegistryTokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[1].tokenTransferFeeConfig.deciBps
- );
-
- assertEq(bpsUSDWei, feeUSDWei);
- assertEq(transferFeeConfig.destGasOverhead, destGasOverhead);
- assertEq(transferFeeConfig.destBytesOverhead, destBytesOverhead);
- }
-
function test_CustomTokenBpsFee_Success() public view {
uint256 tokenAmount = 200000e18;
@@ -1826,7 +1784,7 @@ contract PriceRegistry_getTokenTransferCost is PriceRegistryFeeSetup {
uint256 usdWei = calcUSDValueFromTokenAmount(s_customTokenPrice, tokenAmount);
uint256 bpsUSDWei = applyBpsRatio(
- usdWei, s_priceRegistryTokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[2].tokenTransferFeeConfig.deciBps
+ usdWei, s_priceRegistryTokenTransferFeeConfigArgs[0].tokenTransferFeeConfigs[1].tokenTransferFeeConfig.deciBps
);
assertEq(bpsUSDWei, feeUSDWei);
@@ -1914,9 +1872,15 @@ contract PriceRegistry_getTokenTransferCost is PriceRegistryFeeSetup {
// Start with small token transfers, total bps fee is lower than min token transfer fee
for (uint256 i = 0; i < testTokens.length; ++i) {
message.tokenAmounts[i] = Client.EVMTokenAmount({token: testTokens[i], amount: 1e14});
- expectedTotalGas += s_priceRegistry.getTokenTransferFeeConfig(DEST_CHAIN_SELECTOR, testTokens[i]).destGasOverhead;
- expectedTotalBytes +=
- s_priceRegistry.getTokenTransferFeeConfig(DEST_CHAIN_SELECTOR, testTokens[i]).destBytesOverhead;
+ PriceRegistry.TokenTransferFeeConfig memory tokenTransferFeeConfig =
+ s_priceRegistry.getTokenTransferFeeConfig(DEST_CHAIN_SELECTOR, testTokens[i]);
+
+ expectedTotalGas += tokenTransferFeeConfig.destGasOverhead == 0
+ ? DEFAULT_TOKEN_DEST_GAS_OVERHEAD
+ : tokenTransferFeeConfig.destGasOverhead;
+ expectedTotalBytes += tokenTransferFeeConfig.destBytesOverhead == 0
+ ? DEFAULT_TOKEN_BYTES_OVERHEAD
+ : tokenTransferFeeConfig.destBytesOverhead;
}
(uint256 feeUSDWei, uint32 destGasOverhead, uint32 destBytesOverhead) = s_priceRegistry.getTokenTransferCost(
DEST_CHAIN_SELECTOR, message.feeToken, s_wrappedTokenPrice, message.tokenAmounts
@@ -1924,44 +1888,45 @@ contract PriceRegistry_getTokenTransferCost is PriceRegistryFeeSetup {
uint256 expectedFeeUSDWei = 0;
for (uint256 i = 0; i < testTokens.length; ++i) {
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[i].minFeeUSDCents);
+ expectedFeeUSDWei += configUSDCentToWei(
+ tokenTransferFeeConfigs[i].minFeeUSDCents == 0
+ ? DEFAULT_TOKEN_FEE_USD_CENTS
+ : tokenTransferFeeConfigs[i].minFeeUSDCents
+ );
}
- assertEq(expectedFeeUSDWei, feeUSDWei);
- assertEq(expectedTotalGas, destGasOverhead);
- assertEq(expectedTotalBytes, destBytesOverhead);
+ assertEq(expectedFeeUSDWei, feeUSDWei, "wrong feeUSDWei 1");
+ assertEq(expectedTotalGas, destGasOverhead, "wrong destGasOverhead 1");
+ assertEq(expectedTotalBytes, destBytesOverhead, "wrong destBytesOverhead 1");
// Set 1st token transfer to a meaningful amount so its bps fee is now between min and max fee
message.tokenAmounts[0] = Client.EVMTokenAmount({token: testTokens[0], amount: 10000e18});
+ uint256 token0USDWei = applyBpsRatio(
+ calcUSDValueFromTokenAmount(tokenPrices[0], message.tokenAmounts[0].amount), tokenTransferFeeConfigs[0].deciBps
+ );
+ uint256 token1USDWei = configUSDCentToWei(DEFAULT_TOKEN_FEE_USD_CENTS);
+
(feeUSDWei, destGasOverhead, destBytesOverhead) = s_priceRegistry.getTokenTransferCost(
DEST_CHAIN_SELECTOR, message.feeToken, s_wrappedTokenPrice, message.tokenAmounts
);
- expectedFeeUSDWei = applyBpsRatio(
- calcUSDValueFromTokenAmount(tokenPrices[0], message.tokenAmounts[0].amount), tokenTransferFeeConfigs[0].deciBps
- );
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[1].minFeeUSDCents);
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[2].minFeeUSDCents);
+ expectedFeeUSDWei = token0USDWei + token1USDWei + configUSDCentToWei(tokenTransferFeeConfigs[2].minFeeUSDCents);
- assertEq(expectedFeeUSDWei, feeUSDWei);
- assertEq(expectedTotalGas, destGasOverhead);
- assertEq(expectedTotalBytes, destBytesOverhead);
+ assertEq(expectedFeeUSDWei, feeUSDWei, "wrong feeUSDWei 2");
+ assertEq(expectedTotalGas, destGasOverhead, "wrong destGasOverhead 2");
+ assertEq(expectedTotalBytes, destBytesOverhead, "wrong destBytesOverhead 2");
// Set 2nd token transfer to a large amount that is higher than maxFeeUSD
- message.tokenAmounts[1] = Client.EVMTokenAmount({token: testTokens[1], amount: 1e36});
+ message.tokenAmounts[2] = Client.EVMTokenAmount({token: testTokens[2], amount: 1e36});
(feeUSDWei, destGasOverhead, destBytesOverhead) = s_priceRegistry.getTokenTransferCost(
DEST_CHAIN_SELECTOR, message.feeToken, s_wrappedTokenPrice, message.tokenAmounts
);
- expectedFeeUSDWei = applyBpsRatio(
- calcUSDValueFromTokenAmount(tokenPrices[0], message.tokenAmounts[0].amount), tokenTransferFeeConfigs[0].deciBps
- );
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[1].maxFeeUSDCents);
- expectedFeeUSDWei += configUSDCentToWei(tokenTransferFeeConfigs[2].minFeeUSDCents);
+ expectedFeeUSDWei = token0USDWei + token1USDWei + configUSDCentToWei(tokenTransferFeeConfigs[2].maxFeeUSDCents);
- assertEq(expectedFeeUSDWei, feeUSDWei);
- assertEq(expectedTotalGas, destGasOverhead);
- assertEq(expectedTotalBytes, destBytesOverhead);
+ assertEq(expectedFeeUSDWei, feeUSDWei, "wrong feeUSDWei 3");
+ assertEq(expectedTotalGas, destGasOverhead, "wrong destGasOverhead 3");
+ assertEq(expectedTotalBytes, destBytesOverhead, "wrong destBytesOverhead 3");
}
}
diff --git a/contracts/src/v0.8/ccip/test/router/RouterSetup.t.sol b/contracts/src/v0.8/ccip/test/router/RouterSetup.t.sol
index de75161761..423a47951d 100644
--- a/contracts/src/v0.8/ccip/test/router/RouterSetup.t.sol
+++ b/contracts/src/v0.8/ccip/test/router/RouterSetup.t.sol
@@ -41,7 +41,8 @@ contract RouterSetup is BaseTest {
return Internal.SourceTokenData({
sourcePoolAddress: abi.encode(address(12312412312)),
destTokenAddress: abi.encode(address(9809808909)),
- extraData: ""
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
});
}
}
diff --git a/core/gethwrappers/ccip/generated/burn_from_mint_token_pool/burn_from_mint_token_pool.go b/core/gethwrappers/ccip/generated/burn_from_mint_token_pool/burn_from_mint_token_pool.go
index 28e67b0dff..e5a9e0be79 100644
--- a/core/gethwrappers/ccip/generated/burn_from_mint_token_pool/burn_from_mint_token_pool.go
+++ b/core/gethwrappers/ccip/generated/burn_from_mint_token_pool/burn_from_mint_token_pool.go
@@ -82,8 +82,8 @@ type TokenPoolChainUpdate struct {
}
var BurnFromMintTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b50604051620043d9380380620043d98339810160408190526200003491620008c0565b8383838333806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200018f565b5050506001600160a01b0384161580620000e357506001600160a01b038116155b80620000f657506001600160a01b038216155b1562000115576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c05262000168576040805160008152602081019091526200016890846200023a565b5062000185925050506001600160a01b0385163060001962000397565b5050505062000afc565b336001600160a01b03821603620001e95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200025b576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002e65760008382815181106200027f576200027f620009d0565b60209081029190910101519050620002996002826200047d565b15620002dc576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200025e565b5060005b8151811015620003925760008282815181106200030b576200030b620009d0565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000337575062000389565b620003446002826200049d565b1562000387576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002ea565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040f9190620009e6565b6200041b919062000a16565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200047791869190620004b416565b50505050565b600062000494836001600160a01b03841662000585565b90505b92915050565b600062000494836001600160a01b03841662000689565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000503906001600160a01b038516908490620006db565b80519091501562000392578080602001905181019062000524919062000a2c565b620003925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b600081815260018301602052604081205480156200067e576000620005ac60018362000a57565b8554909150600090620005c29060019062000a57565b90508181146200062e576000866000018281548110620005e657620005e6620009d0565b90600052602060002001549050808760000184815481106200060c576200060c620009d0565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000642576200064262000a6d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000497565b600091505062000497565b6000818152600183016020526040812054620006d25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000497565b50600062000497565b6060620006ec8484600085620006f4565b949350505050565b606082471015620007575760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b0316858760405162000775919062000aa9565b60006040518083038185875af1925050503d8060008114620007b4576040519150601f19603f3d011682016040523d82523d6000602084013e620007b9565b606091505b509092509050620007cd87838387620007d8565b979650505050505050565b606083156200084c57825160000362000844576001600160a01b0385163b620008445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620006ec565b620006ec8383815115620008635781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000ac7565b6001600160a01b03811681146200089557600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008bb816200087f565b919050565b60008060008060808587031215620008d757600080fd5b8451620008e4816200087f565b602086810151919550906001600160401b03808211156200090457600080fd5b818801915088601f8301126200091957600080fd5b8151818111156200092e576200092e62000898565b8060051b604051601f19603f8301168101818110858211171562000956576200095662000898565b60405291825284820192508381018501918b8311156200097557600080fd5b938501935b828510156200099e576200098e85620008ae565b845293850193928501926200097a565b809850505050505050620009b560408601620008ae565b9150620009c560608601620008ae565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009f957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000497576200049762000a00565b60006020828403121562000a3f57600080fd5b8151801515811462000a5057600080fd5b9392505050565b8181038181111562000497576200049762000a00565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aa057818101518382015260200162000a86565b50506000910152565b6000825162000abd81846020870162000a83565b9190910192915050565b602081526000825180602084015262000ae881604085016020870162000a83565b601f01601f19169190910160400192915050565b60805160a05160c05161386062000b79600039600081816104960152818161164501526120290152600081816104700152818161147601526118fb01526000818161022301528181610278015281816106ba015281816113960152818161181b01528181611a1301528181611fbf015261221401526138606000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c8063a7cd63b7116100e3578063c75eea9c1161008c578063dc0bd97111610066578063dc0bd9711461046e578063e0351e1314610494578063f2fde38b146104ba57600080fd5b8063c75eea9c14610435578063cf7401f314610448578063db6327dc1461045b57600080fd5b8063b7946580116100bd578063b7946580146103fa578063c0d786551461040d578063c4bffe2b1461042057600080fd5b8063a7cd63b714610358578063af58d59f1461036d578063b0f479a1146103dc57600080fd5b806354c8a4f3116101455780638926f54f1161011f5780638926f54f146103075780638da5cb5b1461031a5780639a4575b91461033857600080fd5b806354c8a4f3146102d757806378a010b2146102ec57806379ba5097146102ff57600080fd5b806321df0da71161017657806321df0da714610221578063240028e81461026857806339077537146102b557600080fd5b806301ffc9a71461019d5780630a2fd493146101c5578063181f5a77146101e5575b600080fd5b6101b06101ab3660046129b7565b6104cd565b60405190151581526020015b60405180910390f35b6101d86101d3366004612a16565b6105b2565b6040516101bc9190612a95565b6101d86040518060400160405280601f81526020017f4275726e46726f6d4d696e74546f6b656e506f6f6c20312e352e302d6465760081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b6101b0610276366004612ad5565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102c86102c3366004612af2565b610662565b604051905181526020016101bc565b6102ea6102e5366004612b7a565b6107bd565b005b6102ea6102fa366004612be6565b610838565b6102ea6109ac565b6101b0610315366004612a16565b610aa9565b60005473ffffffffffffffffffffffffffffffffffffffff16610243565b61034b610346366004612c69565b610ac0565b6040516101bc9190612ca4565b610360610b67565b6040516101bc9190612d04565b61038061037b366004612a16565b610b78565b6040516101bc919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610243565b6101d8610408366004612a16565b610c4d565b6102ea61041b366004612ad5565b610c78565b610428610d53565b6040516101bc9190612d5e565b610380610443366004612a16565b610e0b565b6102ea610456366004612ec6565b610edd565b6102ea610469366004612f0b565b610ef5565b7f0000000000000000000000000000000000000000000000000000000000000000610243565b7f00000000000000000000000000000000000000000000000000000000000000006101b0565b6102ea6104c8366004612ad5565b61137b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061056057507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105ac57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906105dd90612f4d565b80601f016020809104026020016040519081016040528092919081815260200182805461060990612f4d565b80156106565780601f1061062b57610100808354040283529160200191610656565b820191906000526020600020905b81548152906001019060200180831161063957829003601f168201915b50505050509050919050565b60408051602081019091526000815261068261067d8361304b565b61138f565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b15801561071357600080fd5b505af1158015610727573d6000803e3d6000fd5b5061073c925050506060830160408401612ad5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0846060013560405161079e91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6107c56115c0565b6108328484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061164392505050565b50505050565b6108406115c0565b61084983610aa9565b610890576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546108b790612f4d565b80601f01602080910402602001604051908101604052809291908181526020018280546108e390612f4d565b80156109305780601f1061090557610100808354040283529160200191610930565b820191906000526020600020905b81548152906001019060200180831161091357829003601f168201915b5050505067ffffffffffffffff861660009081526007602052604090209192505060040161095f838583613190565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf82858560405161099e939291906132aa565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610887565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006105ac600567ffffffffffffffff84166117f9565b6040805180820190915260608082526020820152610ae5610ae08361330e565b611814565b610af282606001356119de565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610b4c8460200160208101906104089190612a16565b81526040805160208181019092526000815291015292915050565b6060610b736002611a87565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105ac90611a94565b67ffffffffffffffff811660009081526007602052604090206005018054606091906105dd90612f4d565b610c806115c0565b73ffffffffffffffffffffffffffffffffffffffff8116610ccd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610d616005611a87565b90506000815167ffffffffffffffff811115610d7f57610d7f612da0565b604051908082528060200260200182016040528015610da8578160200160208202803683370190505b50905060005b8251811015610e0457828181518110610dc957610dc96133b0565b6020026020010151828281518110610de357610de36133b0565b67ffffffffffffffff90921660209283029190910190910152600101610dae565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105ac90611a94565b610ee56115c0565b610ef0838383611b46565b505050565b610efd6115c0565b60005b81811015610ef0576000838383818110610f1c57610f1c6133b0565b9050602002810190610f2e91906133df565b610f379061341d565b9050610f4c8160800151826020015115611c30565b610f5f8160a00151826020015115611c30565b80602001511561125b578051610f819060059067ffffffffffffffff16611d69565b610fc65780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610887565b6040810151511580610fdb5750606081015151155b15611012576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906111f390826134d1565b506060820151600582019061120890826134d1565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2955061124e94939291906135eb565b60405180910390a1611372565b80516112739060059067ffffffffffffffff16611d75565b6112b85780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610887565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906113216004830182612969565b61132f600583016000612969565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101610f00565b6113836115c0565b61138c81611d81565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146114245760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610887565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156114d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f69190613684565b1561152d576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61153a8160200151611e76565b600061154982602001516105b2565b905080516000148061156d575080805190602001208260a001518051906020012014155b156115aa578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016108879190612a95565b6115bc82602001518360600151611f9c565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610887565b565b7f000000000000000000000000000000000000000000000000000000000000000061169a576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156117305760008382815181106116ba576116ba6133b0565b602002602001015190506116d8816002611fe390919063ffffffff16565b156117275760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010161169d565b5060005b8151811015610ef0576000828281518110611751576117516133b0565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361179557506117f1565b6117a0600282612005565b156117ef5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611734565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146118a95760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610887565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b9190613684565b156119b2576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119bf8160400151612027565b6119cc81602001516120a6565b61138c816020015182606001516121f4565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b158015611a6c57600080fd5b505af1158015611a80573d6000803e3d6000fd5b5050505050565b6060600061180d83612238565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611b2282606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611b0691906136d0565b85608001516fffffffffffffffffffffffffffffffff16612293565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611b4f83610aa9565b611b91576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610887565b611b9c826000611c30565b67ffffffffffffffff83166000908152600760205260409020611bbf90836122bd565b611bca816000611c30565b67ffffffffffffffff83166000908152600760205260409020611bf090600201826122bd565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611c23939291906136e3565b60405180910390a1505050565b815115611cf75781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611c86575060408201516fffffffffffffffffffffffffffffffff16155b15611cbf57816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016108879190613766565b80156115bc576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580611d30575060208201516fffffffffffffffffffffffffffffffff1615155b156115bc57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016108879190613766565b600061180d838361245f565b600061180d83836124ae565b3373ffffffffffffffffffffffffffffffffffffffff821603611e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610887565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611e7f81610aa9565b611ec1576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610887565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015611f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f649190613684565b61138c576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610887565b67ffffffffffffffff821660009081526007602052604090206115bc90600201827f00000000000000000000000000000000000000000000000000000000000000006125a1565b600061180d8373ffffffffffffffffffffffffffffffffffffffff84166124ae565b600061180d8373ffffffffffffffffffffffffffffffffffffffff841661245f565b7f00000000000000000000000000000000000000000000000000000000000000001561138c57612058600282612924565b61138c576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610887565b6120af81610aa9565b6120f1576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610887565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa15801561216a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061218e91906137a2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461138c576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610887565b67ffffffffffffffff821660009081526007602052604090206115bc90827f00000000000000000000000000000000000000000000000000000000000000006125a1565b60608160000180548060200260200160405190810160405280929190818152602001828054801561065657602002820191906000526020600020905b8154815260200190600101908083116122745750505050509050919050565b60006122b2856122a384866137bf565b6122ad90876137d6565b612953565b90505b949350505050565b81546000906122e690700100000000000000000000000000000000900463ffffffff16426136d0565b90508015612388576001830154835461232e916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612293565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546123ae916fffffffffffffffffffffffffffffffff9081169116612953565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611c23908490613766565b60008181526001830160205260408120546124a6575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105ac565b5060006105ac565b600081815260018301602052604081205480156125975760006124d26001836136d0565b85549091506000906124e6906001906136d0565b905081811461254b576000866000018281548110612506576125066133b0565b9060005260206000200154905080876000018481548110612529576125296133b0565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061255c5761255c6137e9565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105ac565b60009150506105ac565b825474010000000000000000000000000000000000000000900460ff1615806125c8575081155b156125d257505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061261890700100000000000000000000000000000000900463ffffffff16426136d0565b905080156126d8578183111561265a576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546126949083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612293565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b8482101561278f5773ffffffffffffffffffffffffffffffffffffffff8416612737576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610887565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610887565b848310156128a25760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906127d390826136d0565b6127dd878a6136d0565b6127e791906137d6565b6127f19190613818565b905073ffffffffffffffffffffffffffffffffffffffff861661284a576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610887565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610887565b6128ac85846136d0565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561180d565b6000818310612962578161180d565b5090919050565b50805461297590612f4d565b6000825580601f10612985575050565b601f01602090049060005260206000209081019061138c91905b808211156129b3576000815560010161299f565b5090565b6000602082840312156129c957600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461180d57600080fd5b803567ffffffffffffffff81168114612a1157600080fd5b919050565b600060208284031215612a2857600080fd5b61180d826129f9565b6000815180845260005b81811015612a5757602081850181015186830182015201612a3b565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061180d6020830184612a31565b73ffffffffffffffffffffffffffffffffffffffff8116811461138c57600080fd5b8035612a1181612aa8565b600060208284031215612ae757600080fd5b813561180d81612aa8565b600060208284031215612b0457600080fd5b813567ffffffffffffffff811115612b1b57600080fd5b8201610100818503121561180d57600080fd5b60008083601f840112612b4057600080fd5b50813567ffffffffffffffff811115612b5857600080fd5b6020830191508360208260051b8501011115612b7357600080fd5b9250929050565b60008060008060408587031215612b9057600080fd5b843567ffffffffffffffff80821115612ba857600080fd5b612bb488838901612b2e565b90965094506020870135915080821115612bcd57600080fd5b50612bda87828801612b2e565b95989497509550505050565b600080600060408486031215612bfb57600080fd5b612c04846129f9565b9250602084013567ffffffffffffffff80821115612c2157600080fd5b818601915086601f830112612c3557600080fd5b813581811115612c4457600080fd5b876020828501011115612c5657600080fd5b6020830194508093505050509250925092565b600060208284031215612c7b57600080fd5b813567ffffffffffffffff811115612c9257600080fd5b820160a0818503121561180d57600080fd5b602081526000825160406020840152612cc06060840182612a31565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612cfb8282612a31565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d5257835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612d20565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d5257835167ffffffffffffffff1683529284019291840191600101612d7a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715612df357612df3612da0565b60405290565b60405160c0810167ffffffffffffffff81118282101715612df357612df3612da0565b801515811461138c57600080fd5b8035612a1181612e1c565b80356fffffffffffffffffffffffffffffffff81168114612a1157600080fd5b600060608284031215612e6757600080fd5b6040516060810181811067ffffffffffffffff82111715612e8a57612e8a612da0565b6040529050808235612e9b81612e1c565b8152612ea960208401612e35565b6020820152612eba60408401612e35565b60408201525092915050565b600080600060e08486031215612edb57600080fd5b612ee4846129f9565b9250612ef38560208601612e55565b9150612f028560808601612e55565b90509250925092565b60008060208385031215612f1e57600080fd5b823567ffffffffffffffff811115612f3557600080fd5b612f4185828601612b2e565b90969095509350505050565b600181811c90821680612f6157607f821691505b602082108103612f9a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f830112612fb157600080fd5b813567ffffffffffffffff80821115612fcc57612fcc612da0565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561301257613012612da0565b8160405283815286602085880101111561302b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561305e57600080fd5b613066612dcf565b823567ffffffffffffffff8082111561307e57600080fd5b61308a36838701612fa0565b8352613098602086016129f9565b60208401526130a960408601612aca565b6040840152606085013560608401526130c460808601612aca565b608084015260a08501359150808211156130dd57600080fd5b6130e936838701612fa0565b60a084015260c085013591508082111561310257600080fd5b61310e36838701612fa0565b60c084015260e085013591508082111561312757600080fd5b5061313436828601612fa0565b60e08301525092915050565b601f821115610ef0576000816000526020600020601f850160051c810160208610156131695750805b601f850160051c820191505b8181101561318857828155600101613175565b505050505050565b67ffffffffffffffff8311156131a8576131a8612da0565b6131bc836131b68354612f4d565b83613140565b6000601f84116001811461320e57600085156131d85750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611a80565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561325d578685013582556020948501946001909201910161323d565b5086821015613298577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006132bd6040830186612a31565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561332057600080fd5b60405160a0810167ffffffffffffffff828210818311171561334457613344612da0565b81604052843591508082111561335957600080fd5b5061336636828601612fa0565b825250613375602084016129f9565b6020820152604083013561338881612aa8565b60408201526060838101359082015260808301356133a581612aa8565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261341357600080fd5b9190910192915050565b6000610140823603121561343057600080fd5b613438612df9565b613441836129f9565b815261344f60208401612e2a565b6020820152604083013567ffffffffffffffff8082111561346f57600080fd5b61347b36838701612fa0565b6040840152606085013591508082111561349457600080fd5b506134a136828601612fa0565b6060830152506134b43660808501612e55565b60808201526134c63660e08501612e55565b60a082015292915050565b815167ffffffffffffffff8111156134eb576134eb612da0565b6134ff816134f98454612f4d565b84613140565b602080601f831160018114613552576000841561351c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613188565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561359f57888601518255948401946001909101908401613580565b50858210156135db57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff8716835280602084015261360f81840187612a31565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff908116606087015290870151166080850152915061364d9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612cfb565b60006020828403121561369657600080fd5b815161180d81612e1c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105ac576105ac6136a1565b67ffffffffffffffff8416815260e0810161372f60208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526122b5565b606081016105ac82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156137b457600080fd5b815161180d81612aa8565b80820281158282048414176105ac576105ac6136a1565b808201808211156105ac576105ac6136a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008261384e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60e06040523480156200001157600080fd5b50604051620044e0380380620044e08339810160408190526200003491620008c0565b8383838333806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200018f565b5050506001600160a01b0384161580620000e357506001600160a01b038116155b80620000f657506001600160a01b038216155b1562000115576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c05262000168576040805160008152602081019091526200016890846200023a565b5062000185925050506001600160a01b0385163060001962000397565b5050505062000afc565b336001600160a01b03821603620001e95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200025b576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002e65760008382815181106200027f576200027f620009d0565b60209081029190910101519050620002996002826200047d565b15620002dc576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200025e565b5060005b8151811015620003925760008282815181106200030b576200030b620009d0565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000337575062000389565b620003446002826200049d565b1562000387576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002ea565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040f9190620009e6565b6200041b919062000a16565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200047791869190620004b416565b50505050565b600062000494836001600160a01b03841662000585565b90505b92915050565b600062000494836001600160a01b03841662000689565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000503906001600160a01b038516908490620006db565b80519091501562000392578080602001905181019062000524919062000a2c565b620003925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b600081815260018301602052604081205480156200067e576000620005ac60018362000a57565b8554909150600090620005c29060019062000a57565b90508181146200062e576000866000018281548110620005e657620005e6620009d0565b90600052602060002001549050808760000184815481106200060c576200060c620009d0565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000642576200064262000a6d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000497565b600091505062000497565b6000818152600183016020526040812054620006d25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000497565b50600062000497565b6060620006ec8484600085620006f4565b949350505050565b606082471015620007575760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b0316858760405162000775919062000aa9565b60006040518083038185875af1925050503d8060008114620007b4576040519150601f19603f3d011682016040523d82523d6000602084013e620007b9565b606091505b509092509050620007cd87838387620007d8565b979650505050505050565b606083156200084c57825160000362000844576001600160a01b0385163b620008445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620006ec565b620006ec8383815115620008635781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000ac7565b6001600160a01b03811681146200089557600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008bb816200087f565b919050565b60008060008060808587031215620008d757600080fd5b8451620008e4816200087f565b602086810151919550906001600160401b03808211156200090457600080fd5b818801915088601f8301126200091957600080fd5b8151818111156200092e576200092e62000898565b8060051b604051601f19603f8301168101818110858211171562000956576200095662000898565b60405291825284820192508381018501918b8311156200097557600080fd5b938501935b828510156200099e576200098e85620008ae565b845293850193928501926200097a565b809850505050505050620009b560408601620008ae565b9150620009c560608601620008ae565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009f957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000497576200049762000a00565b60006020828403121562000a3f57600080fd5b8151801515811462000a5057600080fd5b9392505050565b8181038181111562000497576200049762000a00565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aa057818101518382015260200162000a86565b50506000910152565b6000825162000abd81846020870162000a83565b9190910192915050565b602081526000825180602084015262000ae881604085016020870162000a83565b601f01601f19169190910160400192915050565b60805160a05160c05161396762000b79600039600081816104dd0152818161174c01526121300152600081816104b70152818161157d0152611a020152600081816102390152818161028e015281816107010152818161149d0152818161192201528181611b1a015281816120c6015261231b01526139676000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639a4575b9116100ee578063c4bffe2b11610097578063db6327dc11610071578063db6327dc146104a2578063dc0bd971146104b5578063e0351e13146104db578063f2fde38b1461050157600080fd5b8063c4bffe2b14610467578063c75eea9c1461047c578063cf7401f31461048f57600080fd5b8063b0f479a1116100c8578063b0f479a114610423578063b794658014610441578063c0d786551461045457600080fd5b80639a4575b91461037f578063a7cd63b71461039f578063af58d59f146103b457600080fd5b806354c8a4f31161015b57806379ba50971161013557806379ba5097146103335780637d54534e1461033b5780638926f54f1461034e5780638da5cb5b1461036157600080fd5b806354c8a4f3146102ed5780636d3d1a581461030257806378a010b21461032057600080fd5b806321df0da71161018c57806321df0da714610237578063240028e81461027e57806339077537146102cb57600080fd5b806301ffc9a7146101b35780630a2fd493146101db578063181f5a77146101fb575b600080fd5b6101c66101c1366004612abe565b610514565b60405190151581526020015b60405180910390f35b6101ee6101e9366004612b1d565b6105f9565b6040516101d29190612b9c565b6101ee6040518060400160405280601f81526020017f4275726e46726f6d4d696e74546f6b656e506f6f6c20312e352e302d6465760081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b6101c661028c366004612bdc565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102de6102d9366004612bf9565b6106a9565b604051905181526020016101d2565b6103006102fb366004612c81565b610804565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610259565b61030061032e366004612ced565b61087f565b6103006109f3565b610300610349366004612bdc565b610af0565b6101c661035c366004612b1d565b610b3f565b60005473ffffffffffffffffffffffffffffffffffffffff16610259565b61039261038d366004612d70565b610b56565b6040516101d29190612dab565b6103a7610bfd565b6040516101d29190612e0b565b6103c76103c2366004612b1d565b610c0e565b6040516101d2919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610259565b6101ee61044f366004612b1d565b610ce3565b610300610462366004612bdc565b610d0e565b61046f610de9565b6040516101d29190612e65565b6103c761048a366004612b1d565b610ea1565b61030061049d366004612fcd565b610f73565b6103006104b0366004613012565b610ffc565b7f0000000000000000000000000000000000000000000000000000000000000000610259565b7f00000000000000000000000000000000000000000000000000000000000000006101c6565b61030061050f366004612bdc565b611482565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806105a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff8116600090815260076020526040902060040180546060919061062490613054565b80601f016020809104026020016040519081016040528092919081815260200182805461065090613054565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b50505050509050919050565b6040805160208101909152600081526106c96106c483613152565b611496565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b15801561075a57600080fd5b505af115801561076e573d6000803e3d6000fd5b50610783925050506060830160408401612bdc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f084606001356040516107e591815260200190565b60405180910390a3506040805160208101909152606090910135815290565b61080c6116c7565b6108798484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061174a92505050565b50505050565b6108876116c7565b61089083610b3f565b6108d7576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546108fe90613054565b80601f016020809104026020016040519081016040528092919081815260200182805461092a90613054565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b5050505067ffffffffffffffff86166000908152600760205260409020919250506004016109a6838583613297565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf8285856040516109e5939291906133b1565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108ce565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610af86116c7565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006105f3600567ffffffffffffffff8416611900565b6040805180820190915260608082526020820152610b7b610b7683613415565b61191b565b610b888260600135611ae5565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610be284602001602081019061044f9190612b1d565b81526040805160208181019092526000815291015292915050565b6060610c096002611b8e565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105f390611b9b565b67ffffffffffffffff8116600090815260076020526040902060050180546060919061062490613054565b610d166116c7565b73ffffffffffffffffffffffffffffffffffffffff8116610d63576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610df76005611b8e565b90506000815167ffffffffffffffff811115610e1557610e15612ea7565b604051908082528060200260200182016040528015610e3e578160200160208202803683370190505b50905060005b8251811015610e9a57828181518110610e5f57610e5f6134b7565b6020026020010151828281518110610e7957610e796134b7565b67ffffffffffffffff90921660209283029190910190910152600101610e44565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105f390611b9b565b60085473ffffffffffffffffffffffffffffffffffffffff163314801590610fb3575060005473ffffffffffffffffffffffffffffffffffffffff163314155b15610fec576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024016108ce565b610ff7838383611c4d565b505050565b6110046116c7565b60005b81811015610ff7576000838383818110611023576110236134b7565b905060200281019061103591906134e6565b61103e90613524565b90506110538160800151826020015115611d37565b6110668160a00151826020015115611d37565b8060200151156113625780516110889060059067ffffffffffffffff16611e70565b6110cd5780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108ce565b60408101515115806110e25750606081015151155b15611119576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906112fa90826135d8565b506060820151600582019061130f90826135d8565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2955061135594939291906136f2565b60405180910390a1611479565b805161137a9060059067ffffffffffffffff16611e7c565b6113bf5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108ce565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906114286004830182612a70565b611436600583016000612a70565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101611007565b61148a6116c7565b61149381611e88565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161461152b5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108ce565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156115d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fd919061378b565b15611634576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116418160200151611f7d565b600061165082602001516105f9565b9050805160001480611674575080805190602001208260a001518051906020012014155b156116b1578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016108ce9190612b9c565b6116c3826020015183606001516120a3565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108ce565b565b7f00000000000000000000000000000000000000000000000000000000000000006117a1576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156118375760008382815181106117c1576117c16134b7565b602002602001015190506117df8160026120ea90919063ffffffff16565b1561182e5760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016117a4565b5060005b8151811015610ff7576000828281518110611858576118586134b7565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361189c57506118f8565b6118a760028261210c565b156118f65760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010161183b565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146119b05760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108ce565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a82919061378b565b15611ab9576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac6816040015161212e565b611ad381602001516121ad565b611493816020015182606001516122fb565b6040517f79cc6790000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906379cc679090604401600060405180830381600087803b158015611b7357600080fd5b505af1158015611b87573d6000803e3d6000fd5b5050505050565b606060006119148361233f565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c2982606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611c0d91906137d7565b85608001516fffffffffffffffffffffffffffffffff1661239a565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611c5683610b3f565b611c98576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016108ce565b611ca3826000611d37565b67ffffffffffffffff83166000908152600760205260409020611cc690836123c4565b611cd1816000611d37565b67ffffffffffffffff83166000908152600760205260409020611cf790600201826123c4565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611d2a939291906137ea565b60405180910390a1505050565b815115611dfe5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611d8d575060408201516fffffffffffffffffffffffffffffffff16155b15611dc657816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016108ce919061386d565b80156116c3576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580611e37575060208201516fffffffffffffffffffffffffffffffff1615155b156116c357816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016108ce919061386d565b60006119148383612566565b600061191483836125b5565b3373ffffffffffffffffffffffffffffffffffffffff821603611f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108ce565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611f8681610b3f565b611fc8576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108ce565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206b919061378b565b611493576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108ce565b67ffffffffffffffff821660009081526007602052604090206116c390600201827f00000000000000000000000000000000000000000000000000000000000000006126a8565b60006119148373ffffffffffffffffffffffffffffffffffffffff84166125b5565b60006119148373ffffffffffffffffffffffffffffffffffffffff8416612566565b7f0000000000000000000000000000000000000000000000000000000000000000156114935761215f600282612a2b565b611493576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108ce565b6121b681610b3f565b6121f8576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108ce565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612271573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061229591906138a9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611493576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108ce565b67ffffffffffffffff821660009081526007602052604090206116c390827f00000000000000000000000000000000000000000000000000000000000000006126a8565b60608160000180548060200260200160405190810160405280929190818152602001828054801561069d57602002820191906000526020600020905b81548152602001906001019080831161237b5750505050509050919050565b60006123b9856123aa84866138c6565b6123b490876138dd565b612a5a565b90505b949350505050565b81546000906123ed90700100000000000000000000000000000000900463ffffffff16426137d7565b9050801561248f5760018301548354612435916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661239a565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546124b5916fffffffffffffffffffffffffffffffff9081169116612a5a565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611d2a90849061386d565b60008181526001830160205260408120546125ad575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f3565b5060006105f3565b6000818152600183016020526040812054801561269e5760006125d96001836137d7565b85549091506000906125ed906001906137d7565b905081811461265257600086600001828154811061260d5761260d6134b7565b9060005260206000200154905080876000018481548110612630576126306134b7565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612663576126636138f0565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105f3565b60009150506105f3565b825474010000000000000000000000000000000000000000900460ff1615806126cf575081155b156126d957505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061271f90700100000000000000000000000000000000900463ffffffff16426137d7565b905080156127df5781831115612761576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461279b9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661239a565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156128965773ffffffffffffffffffffffffffffffffffffffff841661283e576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016108ce565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016108ce565b848310156129a95760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906128da90826137d7565b6128e4878a6137d7565b6128ee91906138dd565b6128f8919061391f565b905073ffffffffffffffffffffffffffffffffffffffff8616612951576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016108ce565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016108ce565b6129b385846137d7565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611914565b6000818310612a695781611914565b5090919050565b508054612a7c90613054565b6000825580601f10612a8c575050565b601f01602090049060005260206000209081019061149391905b80821115612aba5760008155600101612aa6565b5090565b600060208284031215612ad057600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461191457600080fd5b803567ffffffffffffffff81168114612b1857600080fd5b919050565b600060208284031215612b2f57600080fd5b61191482612b00565b6000815180845260005b81811015612b5e57602081850181015186830182015201612b42565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006119146020830184612b38565b73ffffffffffffffffffffffffffffffffffffffff8116811461149357600080fd5b8035612b1881612baf565b600060208284031215612bee57600080fd5b813561191481612baf565b600060208284031215612c0b57600080fd5b813567ffffffffffffffff811115612c2257600080fd5b8201610100818503121561191457600080fd5b60008083601f840112612c4757600080fd5b50813567ffffffffffffffff811115612c5f57600080fd5b6020830191508360208260051b8501011115612c7a57600080fd5b9250929050565b60008060008060408587031215612c9757600080fd5b843567ffffffffffffffff80821115612caf57600080fd5b612cbb88838901612c35565b90965094506020870135915080821115612cd457600080fd5b50612ce187828801612c35565b95989497509550505050565b600080600060408486031215612d0257600080fd5b612d0b84612b00565b9250602084013567ffffffffffffffff80821115612d2857600080fd5b818601915086601f830112612d3c57600080fd5b813581811115612d4b57600080fd5b876020828501011115612d5d57600080fd5b6020830194508093505050509250925092565b600060208284031215612d8257600080fd5b813567ffffffffffffffff811115612d9957600080fd5b820160a0818503121561191457600080fd5b602081526000825160406020840152612dc76060840182612b38565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612e028282612b38565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e5957835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612e27565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e5957835167ffffffffffffffff1683529284019291840191600101612e81565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715612efa57612efa612ea7565b60405290565b60405160c0810167ffffffffffffffff81118282101715612efa57612efa612ea7565b801515811461149357600080fd5b8035612b1881612f23565b80356fffffffffffffffffffffffffffffffff81168114612b1857600080fd5b600060608284031215612f6e57600080fd5b6040516060810181811067ffffffffffffffff82111715612f9157612f91612ea7565b6040529050808235612fa281612f23565b8152612fb060208401612f3c565b6020820152612fc160408401612f3c565b60408201525092915050565b600080600060e08486031215612fe257600080fd5b612feb84612b00565b9250612ffa8560208601612f5c565b91506130098560808601612f5c565b90509250925092565b6000806020838503121561302557600080fd5b823567ffffffffffffffff81111561303c57600080fd5b61304885828601612c35565b90969095509350505050565b600181811c9082168061306857607f821691505b6020821081036130a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f8301126130b857600080fd5b813567ffffffffffffffff808211156130d3576130d3612ea7565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561311957613119612ea7565b8160405283815286602085880101111561313257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561316557600080fd5b61316d612ed6565b823567ffffffffffffffff8082111561318557600080fd5b613191368387016130a7565b835261319f60208601612b00565b60208401526131b060408601612bd1565b6040840152606085013560608401526131cb60808601612bd1565b608084015260a08501359150808211156131e457600080fd5b6131f0368387016130a7565b60a084015260c085013591508082111561320957600080fd5b613215368387016130a7565b60c084015260e085013591508082111561322e57600080fd5b5061323b368286016130a7565b60e08301525092915050565b601f821115610ff7576000816000526020600020601f850160051c810160208610156132705750805b601f850160051c820191505b8181101561328f5782815560010161327c565b505050505050565b67ffffffffffffffff8311156132af576132af612ea7565b6132c3836132bd8354613054565b83613247565b6000601f84116001811461331557600085156132df5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611b87565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156133645786850135825560209485019460019092019101613344565b508682101561339f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006133c46040830186612b38565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561342757600080fd5b60405160a0810167ffffffffffffffff828210818311171561344b5761344b612ea7565b81604052843591508082111561346057600080fd5b5061346d368286016130a7565b82525061347c60208401612b00565b6020820152604083013561348f81612baf565b60408201526060838101359082015260808301356134ac81612baf565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261351a57600080fd5b9190910192915050565b6000610140823603121561353757600080fd5b61353f612f00565b61354883612b00565b815261355660208401612f31565b6020820152604083013567ffffffffffffffff8082111561357657600080fd5b613582368387016130a7565b6040840152606085013591508082111561359b57600080fd5b506135a8368286016130a7565b6060830152506135bb3660808501612f5c565b60808201526135cd3660e08501612f5c565b60a082015292915050565b815167ffffffffffffffff8111156135f2576135f2612ea7565b613606816136008454613054565b84613247565b602080601f83116001811461365957600084156136235750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855561328f565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156136a657888601518255948401946001909101908401613687565b50858210156136e257878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff8716835280602084015261371681840187612b38565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506137549050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612e02565b60006020828403121561379d57600080fd5b815161191481612f23565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105f3576105f36137a8565b67ffffffffffffffff8416815260e0810161383660208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526123bc565b606081016105f382848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156138bb57600080fd5b815161191481612baf565b80820281158282048414176105f3576105f36137a8565b808201808211156105f3576105f36137a8565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082613955577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
}
var BurnFromMintTokenPoolABI = BurnFromMintTokenPoolMetaData.ABI
@@ -310,6 +310,28 @@ func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetCurrentOutb
return _BurnFromMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnFromMintTokenPool.CallOpts, remoteChainSelector)
}
+func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getRateLimitAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnFromMintTokenPool.Contract.GetRateLimitAdmin(&_BurnFromMintTokenPool.CallOpts)
+}
+
+func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnFromMintTokenPool.Contract.GetRateLimitAdmin(&_BurnFromMintTokenPool.CallOpts)
+}
+
func (_BurnFromMintTokenPool *BurnFromMintTokenPoolCaller) GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
var out []interface{}
err := _BurnFromMintTokenPool.contract.Call(opts, &out, "getRemotePool", remoteChainSelector)
@@ -624,6 +646,18 @@ func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) SetChainRa
return _BurnFromMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnFromMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig)
}
+func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnFromMintTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin)
+}
+
+func (_BurnFromMintTokenPool *BurnFromMintTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnFromMintTokenPool.Contract.SetRateLimitAdmin(&_BurnFromMintTokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnFromMintTokenPool.Contract.SetRateLimitAdmin(&_BurnFromMintTokenPool.TransactOpts, rateLimitAdmin)
+}
+
func (_BurnFromMintTokenPool *BurnFromMintTokenPoolTransactor) SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
return _BurnFromMintTokenPool.contract.Transact(opts, "setRemotePool", remoteChainSelector, remotePoolAddress)
}
@@ -2644,6 +2678,8 @@ type BurnFromMintTokenPoolInterface interface {
GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error)
+ GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error)
+
GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
@@ -2678,6 +2714,8 @@ type BurnFromMintTokenPoolInterface interface {
SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error)
+ SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error)
+
SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generated/burn_mint_token_pool/burn_mint_token_pool.go b/core/gethwrappers/ccip/generated/burn_mint_token_pool/burn_mint_token_pool.go
index 70e2f9393e..500b31ec51 100644
--- a/core/gethwrappers/ccip/generated/burn_mint_token_pool/burn_mint_token_pool.go
+++ b/core/gethwrappers/ccip/generated/burn_mint_token_pool/burn_mint_token_pool.go
@@ -82,8 +82,8 @@ type TokenPoolChainUpdate struct {
}
var BurnMintTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b5060405162003f8138038062003f8183398101604081905262000034916200054c565b8383838333806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000176565b5050506001600160a01b0384161580620000e357506001600160a01b038116155b80620000f657506001600160a01b038216155b1562000115576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c052620001685760408051600081526020810190915262000168908462000221565b5050505050505050620006aa565b336001600160a01b03821603620001d05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c05162000242576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002cd5760008382815181106200026657620002666200065c565b60209081029190910101519050620002806002826200037e565b15620002c3576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010162000245565b5060005b815181101562000379576000828281518110620002f257620002f26200065c565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200031e575062000370565b6200032b6002826200039e565b156200036e576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002d1565b505050565b600062000395836001600160a01b038416620003b5565b90505b92915050565b600062000395836001600160a01b038416620004b9565b60008181526001830160205260408120548015620004ae576000620003dc60018362000672565b8554909150600090620003f29060019062000672565b90508181146200045e5760008660000182815481106200041657620004166200065c565b90600052602060002001549050808760000184815481106200043c576200043c6200065c565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000472576200047262000694565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000398565b600091505062000398565b6000818152600183016020526040812054620005025750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000398565b50600062000398565b6001600160a01b03811681146200052157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000547816200050b565b919050565b600080600080608085870312156200056357600080fd5b845162000570816200050b565b602086810151919550906001600160401b03808211156200059057600080fd5b818801915088601f830112620005a557600080fd5b815181811115620005ba57620005ba62000524565b8060051b604051601f19603f83011681018181108582111715620005e257620005e262000524565b60405291825284820192508381018501918b8311156200060157600080fd5b938501935b828510156200062a576200061a856200053a565b8452938501939285019262000606565b80985050505050505062000641604086016200053a565b915062000651606086016200053a565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b818103818111156200039857634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05161385a62000727600039600081816104960152818161164501526120230152600081816104700152818161147601526118fb01526000818161022301528181610278015281816106ba015281816113960152818161181b01528181611a0d01528181611fb9015261220e015261385a6000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c8063a7cd63b7116100e3578063c75eea9c1161008c578063dc0bd97111610066578063dc0bd9711461046e578063e0351e1314610494578063f2fde38b146104ba57600080fd5b8063c75eea9c14610435578063cf7401f314610448578063db6327dc1461045b57600080fd5b8063b7946580116100bd578063b7946580146103fa578063c0d786551461040d578063c4bffe2b1461042057600080fd5b8063a7cd63b714610358578063af58d59f1461036d578063b0f479a1146103dc57600080fd5b806354c8a4f3116101455780638926f54f1161011f5780638926f54f146103075780638da5cb5b1461031a5780639a4575b91461033857600080fd5b806354c8a4f3146102d757806378a010b2146102ec57806379ba5097146102ff57600080fd5b806321df0da71161017657806321df0da714610221578063240028e81461026857806339077537146102b557600080fd5b806301ffc9a71461019d5780630a2fd493146101c5578063181f5a77146101e5575b600080fd5b6101b06101ab3660046129b1565b6104cd565b60405190151581526020015b60405180910390f35b6101d86101d3366004612a10565b6105b2565b6040516101bc9190612a8f565b6101d86040518060400160405280601b81526020017f4275726e4d696e74546f6b656e506f6f6c20312e352e302d646576000000000081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b6101b0610276366004612acf565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102c86102c3366004612aec565b610662565b604051905181526020016101bc565b6102ea6102e5366004612b74565b6107bd565b005b6102ea6102fa366004612be0565b610838565b6102ea6109ac565b6101b0610315366004612a10565b610aa9565b60005473ffffffffffffffffffffffffffffffffffffffff16610243565b61034b610346366004612c63565b610ac0565b6040516101bc9190612c9e565b610360610b67565b6040516101bc9190612cfe565b61038061037b366004612a10565b610b78565b6040516101bc919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610243565b6101d8610408366004612a10565b610c4d565b6102ea61041b366004612acf565b610c78565b610428610d53565b6040516101bc9190612d58565b610380610443366004612a10565b610e0b565b6102ea610456366004612ec0565b610edd565b6102ea610469366004612f05565b610ef5565b7f0000000000000000000000000000000000000000000000000000000000000000610243565b7f00000000000000000000000000000000000000000000000000000000000000006101b0565b6102ea6104c8366004612acf565b61137b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061056057507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105ac57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906105dd90612f47565b80601f016020809104026020016040519081016040528092919081815260200182805461060990612f47565b80156106565780601f1061062b57610100808354040283529160200191610656565b820191906000526020600020905b81548152906001019060200180831161063957829003601f168201915b50505050509050919050565b60408051602081019091526000815261068261067d83613045565b61138f565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b15801561071357600080fd5b505af1158015610727573d6000803e3d6000fd5b5061073c925050506060830160408401612acf565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0846060013560405161079e91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6107c56115c0565b6108328484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061164392505050565b50505050565b6108406115c0565b61084983610aa9565b610890576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546108b790612f47565b80601f01602080910402602001604051908101604052809291908181526020018280546108e390612f47565b80156109305780601f1061090557610100808354040283529160200191610930565b820191906000526020600020905b81548152906001019060200180831161091357829003601f168201915b5050505067ffffffffffffffff861660009081526007602052604090209192505060040161095f83858361318a565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf82858560405161099e939291906132a4565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610887565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006105ac600567ffffffffffffffff84166117f9565b6040805180820190915260608082526020820152610ae5610ae083613308565b611814565b610af282606001356119de565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610b4c8460200160208101906104089190612a10565b81526040805160208181019092526000815291015292915050565b6060610b736002611a81565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105ac90611a8e565b67ffffffffffffffff811660009081526007602052604090206005018054606091906105dd90612f47565b610c806115c0565b73ffffffffffffffffffffffffffffffffffffffff8116610ccd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610d616005611a81565b90506000815167ffffffffffffffff811115610d7f57610d7f612d9a565b604051908082528060200260200182016040528015610da8578160200160208202803683370190505b50905060005b8251811015610e0457828181518110610dc957610dc96133aa565b6020026020010151828281518110610de357610de36133aa565b67ffffffffffffffff90921660209283029190910190910152600101610dae565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105ac90611a8e565b610ee56115c0565b610ef0838383611b40565b505050565b610efd6115c0565b60005b81811015610ef0576000838383818110610f1c57610f1c6133aa565b9050602002810190610f2e91906133d9565b610f3790613417565b9050610f4c8160800151826020015115611c2a565b610f5f8160a00151826020015115611c2a565b80602001511561125b578051610f819060059067ffffffffffffffff16611d63565b610fc65780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610887565b6040810151511580610fdb5750606081015151155b15611012576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906111f390826134cb565b506060820151600582019061120890826134cb565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2955061124e94939291906135e5565b60405180910390a1611372565b80516112739060059067ffffffffffffffff16611d6f565b6112b85780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610887565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906113216004830182612963565b61132f600583016000612963565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101610f00565b6113836115c0565b61138c81611d7b565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146114245760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610887565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156114d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f6919061367e565b1561152d576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61153a8160200151611e70565b600061154982602001516105b2565b905080516000148061156d575080805190602001208260a001518051906020012014155b156115aa578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016108879190612a8f565b6115bc82602001518360600151611f96565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611641576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610887565b565b7f000000000000000000000000000000000000000000000000000000000000000061169a576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156117305760008382815181106116ba576116ba6133aa565b602002602001015190506116d8816002611fdd90919063ffffffff16565b156117275760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010161169d565b5060005b8151811015610ef0576000828281518110611751576117516133aa565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361179557506117f1565b6117a0600282611fff565b156117ef5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611734565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146118a95760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610887565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611957573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197b919061367e565b156119b2576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119bf8160400151612021565b6119cc81602001516120a0565b61138c816020015182606001516121ee565b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b158015611a6657600080fd5b505af1158015611a7a573d6000803e3d6000fd5b5050505050565b6060600061180d83612232565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611b1c82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611b0091906136ca565b85608001516fffffffffffffffffffffffffffffffff1661228d565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611b4983610aa9565b611b8b576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610887565b611b96826000611c2a565b67ffffffffffffffff83166000908152600760205260409020611bb990836122b7565b611bc4816000611c2a565b67ffffffffffffffff83166000908152600760205260409020611bea90600201826122b7565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611c1d939291906136dd565b60405180910390a1505050565b815115611cf15781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611c80575060408201516fffffffffffffffffffffffffffffffff16155b15611cb957816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016108879190613760565b80156115bc576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580611d2a575060208201516fffffffffffffffffffffffffffffffff1615155b156115bc57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016108879190613760565b600061180d8383612459565b600061180d83836124a8565b3373ffffffffffffffffffffffffffffffffffffffff821603611dfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610887565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611e7981610aa9565b611ebb576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610887565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015611f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5e919061367e565b61138c576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610887565b67ffffffffffffffff821660009081526007602052604090206115bc90600201827f000000000000000000000000000000000000000000000000000000000000000061259b565b600061180d8373ffffffffffffffffffffffffffffffffffffffff84166124a8565b600061180d8373ffffffffffffffffffffffffffffffffffffffff8416612459565b7f00000000000000000000000000000000000000000000000000000000000000001561138c5761205260028261291e565b61138c576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610887565b6120a981610aa9565b6120eb576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610887565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612164573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612188919061379c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461138c576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610887565b67ffffffffffffffff821660009081526007602052604090206115bc90827f000000000000000000000000000000000000000000000000000000000000000061259b565b60608160000180548060200260200160405190810160405280929190818152602001828054801561065657602002820191906000526020600020905b81548152602001906001019080831161226e5750505050509050919050565b60006122ac8561229d84866137b9565b6122a790876137d0565b61294d565b90505b949350505050565b81546000906122e090700100000000000000000000000000000000900463ffffffff16426136ca565b905080156123825760018301548354612328916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661228d565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546123a8916fffffffffffffffffffffffffffffffff908116911661294d565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611c1d908490613760565b60008181526001830160205260408120546124a0575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105ac565b5060006105ac565b600081815260018301602052604081205480156125915760006124cc6001836136ca565b85549091506000906124e0906001906136ca565b9050818114612545576000866000018281548110612500576125006133aa565b9060005260206000200154905080876000018481548110612523576125236133aa565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612556576125566137e3565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105ac565b60009150506105ac565b825474010000000000000000000000000000000000000000900460ff1615806125c2575081155b156125cc57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061261290700100000000000000000000000000000000900463ffffffff16426136ca565b905080156126d25781831115612654576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461268e9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661228d565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156127895773ffffffffffffffffffffffffffffffffffffffff8416612731576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610887565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610887565b8483101561289c5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906127cd90826136ca565b6127d7878a6136ca565b6127e191906137d0565b6127eb9190613812565b905073ffffffffffffffffffffffffffffffffffffffff8616612844576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610887565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610887565b6128a685846136ca565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600183016020526040812054151561180d565b600081831061295c578161180d565b5090919050565b50805461296f90612f47565b6000825580601f1061297f575050565b601f01602090049060005260206000209081019061138c91905b808211156129ad5760008155600101612999565b5090565b6000602082840312156129c357600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461180d57600080fd5b803567ffffffffffffffff81168114612a0b57600080fd5b919050565b600060208284031215612a2257600080fd5b61180d826129f3565b6000815180845260005b81811015612a5157602081850181015186830182015201612a35565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b60208152600061180d6020830184612a2b565b73ffffffffffffffffffffffffffffffffffffffff8116811461138c57600080fd5b8035612a0b81612aa2565b600060208284031215612ae157600080fd5b813561180d81612aa2565b600060208284031215612afe57600080fd5b813567ffffffffffffffff811115612b1557600080fd5b8201610100818503121561180d57600080fd5b60008083601f840112612b3a57600080fd5b50813567ffffffffffffffff811115612b5257600080fd5b6020830191508360208260051b8501011115612b6d57600080fd5b9250929050565b60008060008060408587031215612b8a57600080fd5b843567ffffffffffffffff80821115612ba257600080fd5b612bae88838901612b28565b90965094506020870135915080821115612bc757600080fd5b50612bd487828801612b28565b95989497509550505050565b600080600060408486031215612bf557600080fd5b612bfe846129f3565b9250602084013567ffffffffffffffff80821115612c1b57600080fd5b818601915086601f830112612c2f57600080fd5b813581811115612c3e57600080fd5b876020828501011115612c5057600080fd5b6020830194508093505050509250925092565b600060208284031215612c7557600080fd5b813567ffffffffffffffff811115612c8c57600080fd5b820160a0818503121561180d57600080fd5b602081526000825160406020840152612cba6060840182612a2b565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612cf58282612a2b565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d4c57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612d1a565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d4c57835167ffffffffffffffff1683529284019291840191600101612d74565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715612ded57612ded612d9a565b60405290565b60405160c0810167ffffffffffffffff81118282101715612ded57612ded612d9a565b801515811461138c57600080fd5b8035612a0b81612e16565b80356fffffffffffffffffffffffffffffffff81168114612a0b57600080fd5b600060608284031215612e6157600080fd5b6040516060810181811067ffffffffffffffff82111715612e8457612e84612d9a565b6040529050808235612e9581612e16565b8152612ea360208401612e2f565b6020820152612eb460408401612e2f565b60408201525092915050565b600080600060e08486031215612ed557600080fd5b612ede846129f3565b9250612eed8560208601612e4f565b9150612efc8560808601612e4f565b90509250925092565b60008060208385031215612f1857600080fd5b823567ffffffffffffffff811115612f2f57600080fd5b612f3b85828601612b28565b90969095509350505050565b600181811c90821680612f5b57607f821691505b602082108103612f94577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f830112612fab57600080fd5b813567ffffffffffffffff80821115612fc657612fc6612d9a565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561300c5761300c612d9a565b8160405283815286602085880101111561302557600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561305857600080fd5b613060612dc9565b823567ffffffffffffffff8082111561307857600080fd5b61308436838701612f9a565b8352613092602086016129f3565b60208401526130a360408601612ac4565b6040840152606085013560608401526130be60808601612ac4565b608084015260a08501359150808211156130d757600080fd5b6130e336838701612f9a565b60a084015260c08501359150808211156130fc57600080fd5b61310836838701612f9a565b60c084015260e085013591508082111561312157600080fd5b5061312e36828601612f9a565b60e08301525092915050565b601f821115610ef0576000816000526020600020601f850160051c810160208610156131635750805b601f850160051c820191505b818110156131825782815560010161316f565b505050505050565b67ffffffffffffffff8311156131a2576131a2612d9a565b6131b6836131b08354612f47565b8361313a565b6000601f84116001811461320857600085156131d25750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611a7a565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156132575786850135825560209485019460019092019101613237565b5086821015613292577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006132b76040830186612a2b565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561331a57600080fd5b60405160a0810167ffffffffffffffff828210818311171561333e5761333e612d9a565b81604052843591508082111561335357600080fd5b5061336036828601612f9a565b82525061336f602084016129f3565b6020820152604083013561338281612aa2565b604082015260608381013590820152608083013561339f81612aa2565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261340d57600080fd5b9190910192915050565b6000610140823603121561342a57600080fd5b613432612df3565b61343b836129f3565b815261344960208401612e24565b6020820152604083013567ffffffffffffffff8082111561346957600080fd5b61347536838701612f9a565b6040840152606085013591508082111561348e57600080fd5b5061349b36828601612f9a565b6060830152506134ae3660808501612e4f565b60808201526134c03660e08501612e4f565b60a082015292915050565b815167ffffffffffffffff8111156134e5576134e5612d9a565b6134f9816134f38454612f47565b8461313a565b602080601f83116001811461354c57600084156135165750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613182565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156135995788860151825594840194600190910190840161357a565b50858210156135d557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff8716835280602084015261360981840187612a2b565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506136479050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612cf5565b60006020828403121561369057600080fd5b815161180d81612e16565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105ac576105ac61369b565b67ffffffffffffffff8416815260e0810161372960208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526122af565b606081016105ac82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156137ae57600080fd5b815161180d81612aa2565b80820281158282048414176105ac576105ac61369b565b808201808211156105ac576105ac61369b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082613848577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60e06040523480156200001157600080fd5b50604051620040883803806200408883398101604081905262000034916200054c565b8383838333806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c28162000176565b5050506001600160a01b0384161580620000e357506001600160a01b038116155b80620000f657506001600160a01b038216155b1562000115576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c052620001685760408051600081526020810190915262000168908462000221565b5050505050505050620006aa565b336001600160a01b03821603620001d05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c05162000242576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002cd5760008382815181106200026657620002666200065c565b60209081029190910101519050620002806002826200037e565b15620002c3576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010162000245565b5060005b815181101562000379576000828281518110620002f257620002f26200065c565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200031e575062000370565b6200032b6002826200039e565b156200036e576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002d1565b505050565b600062000395836001600160a01b038416620003b5565b90505b92915050565b600062000395836001600160a01b038416620004b9565b60008181526001830160205260408120548015620004ae576000620003dc60018362000672565b8554909150600090620003f29060019062000672565b90508181146200045e5760008660000182815481106200041657620004166200065c565b90600052602060002001549050808760000184815481106200043c576200043c6200065c565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000472576200047262000694565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000398565b600091505062000398565b6000818152600183016020526040812054620005025750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000398565b50600062000398565b6001600160a01b03811681146200052157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000547816200050b565b919050565b600080600080608085870312156200056357600080fd5b845162000570816200050b565b602086810151919550906001600160401b03808211156200059057600080fd5b818801915088601f830112620005a557600080fd5b815181811115620005ba57620005ba62000524565b8060051b604051601f19603f83011681018181108582111715620005e257620005e262000524565b60405291825284820192508381018501918b8311156200060157600080fd5b938501935b828510156200062a576200061a856200053a565b8452938501939285019262000606565b80985050505050505062000641604086016200053a565b915062000651606086016200053a565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b818103818111156200039857634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05161396162000727600039600081816104dd0152818161174c015261212a0152600081816104b70152818161157d0152611a020152600081816102390152818161028e015281816107010152818161149d0152818161192201528181611b14015281816120c0015261231501526139616000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639a4575b9116100ee578063c4bffe2b11610097578063db6327dc11610071578063db6327dc146104a2578063dc0bd971146104b5578063e0351e13146104db578063f2fde38b1461050157600080fd5b8063c4bffe2b14610467578063c75eea9c1461047c578063cf7401f31461048f57600080fd5b8063b0f479a1116100c8578063b0f479a114610423578063b794658014610441578063c0d786551461045457600080fd5b80639a4575b91461037f578063a7cd63b71461039f578063af58d59f146103b457600080fd5b806354c8a4f31161015b57806379ba50971161013557806379ba5097146103335780637d54534e1461033b5780638926f54f1461034e5780638da5cb5b1461036157600080fd5b806354c8a4f3146102ed5780636d3d1a581461030257806378a010b21461032057600080fd5b806321df0da71161018c57806321df0da714610237578063240028e81461027e57806339077537146102cb57600080fd5b806301ffc9a7146101b35780630a2fd493146101db578063181f5a77146101fb575b600080fd5b6101c66101c1366004612ab8565b610514565b60405190151581526020015b60405180910390f35b6101ee6101e9366004612b17565b6105f9565b6040516101d29190612b96565b6101ee6040518060400160405280601b81526020017f4275726e4d696e74546f6b656e506f6f6c20312e352e302d646576000000000081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b6101c661028c366004612bd6565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102de6102d9366004612bf3565b6106a9565b604051905181526020016101d2565b6103006102fb366004612c7b565b610804565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610259565b61030061032e366004612ce7565b61087f565b6103006109f3565b610300610349366004612bd6565b610af0565b6101c661035c366004612b17565b610b3f565b60005473ffffffffffffffffffffffffffffffffffffffff16610259565b61039261038d366004612d6a565b610b56565b6040516101d29190612da5565b6103a7610bfd565b6040516101d29190612e05565b6103c76103c2366004612b17565b610c0e565b6040516101d2919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610259565b6101ee61044f366004612b17565b610ce3565b610300610462366004612bd6565b610d0e565b61046f610de9565b6040516101d29190612e5f565b6103c761048a366004612b17565b610ea1565b61030061049d366004612fc7565b610f73565b6103006104b036600461300c565b610ffc565b7f0000000000000000000000000000000000000000000000000000000000000000610259565b7f00000000000000000000000000000000000000000000000000000000000000006101c6565b61030061050f366004612bd6565b611482565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806105a757507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906106249061304e565b80601f01602080910402602001604051908101604052809291908181526020018280546106509061304e565b801561069d5780601f106106725761010080835404028352916020019161069d565b820191906000526020600020905b81548152906001019060200180831161068057829003601f168201915b50505050509050919050565b6040805160208101909152600081526106c96106c48361314c565b611496565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b15801561075a57600080fd5b505af115801561076e573d6000803e3d6000fd5b50610783925050506060830160408401612bd6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f084606001356040516107e591815260200190565b60405180910390a3506040805160208101909152606090910135815290565b61080c6116c7565b6108798484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061174a92505050565b50505050565b6108876116c7565b61089083610b3f565b6108d7576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546108fe9061304e565b80601f016020809104026020016040519081016040528092919081815260200182805461092a9061304e565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b5050505067ffffffffffffffff86166000908152600760205260409020919250506004016109a6838583613291565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf8285856040516109e5939291906133ab565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108ce565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610af86116c7565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006105f3600567ffffffffffffffff8416611900565b6040805180820190915260608082526020820152610b7b610b768361340f565b61191b565b610b888260600135611ae5565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610be284602001602081019061044f9190612b17565b81526040805160208181019092526000815291015292915050565b6060610c096002611b88565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105f390611b95565b67ffffffffffffffff811660009081526007602052604090206005018054606091906106249061304e565b610d166116c7565b73ffffffffffffffffffffffffffffffffffffffff8116610d63576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610df76005611b88565b90506000815167ffffffffffffffff811115610e1557610e15612ea1565b604051908082528060200260200182016040528015610e3e578160200160208202803683370190505b50905060005b8251811015610e9a57828181518110610e5f57610e5f6134b1565b6020026020010151828281518110610e7957610e796134b1565b67ffffffffffffffff90921660209283029190910190910152600101610e44565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105f390611b95565b60085473ffffffffffffffffffffffffffffffffffffffff163314801590610fb3575060005473ffffffffffffffffffffffffffffffffffffffff163314155b15610fec576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024016108ce565b610ff7838383611c47565b505050565b6110046116c7565b60005b81811015610ff7576000838383818110611023576110236134b1565b905060200281019061103591906134e0565b61103e9061351e565b90506110538160800151826020015115611d31565b6110668160a00151826020015115611d31565b8060200151156113625780516110889060059067ffffffffffffffff16611e6a565b6110cd5780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108ce565b60408101515115806110e25750606081015151155b15611119576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906112fa90826135d2565b506060820151600582019061130f90826135d2565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2955061135594939291906136ec565b60405180910390a1611479565b805161137a9060059067ffffffffffffffff16611e76565b6113bf5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108ce565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906114286004830182612a6a565b611436600583016000612a6a565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101611007565b61148a6116c7565b61149381611e82565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161461152b5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108ce565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156115d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fd9190613785565b15611634576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116418160200151611f77565b600061165082602001516105f9565b9050805160001480611674575080805190602001208260a001518051906020012014155b156116b1578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016108ce9190612b96565b6116c38260200151836060015161209d565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108ce565b565b7f00000000000000000000000000000000000000000000000000000000000000006117a1576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156118375760008382815181106117c1576117c16134b1565b602002602001015190506117df8160026120e490919063ffffffff16565b1561182e5760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016117a4565b5060005b8151811015610ff7576000828281518110611858576118586134b1565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361189c57506118f8565b6118a7600282612106565b156118f65760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010161183b565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146119b05760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108ce565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a829190613785565b15611ab9576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac68160400151612128565b611ad381602001516121a7565b611493816020015182606001516122f5565b6040517f42966c68000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b158015611b6d57600080fd5b505af1158015611b81573d6000803e3d6000fd5b5050505050565b6060600061191483612339565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c2382606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611c0791906137d1565b85608001516fffffffffffffffffffffffffffffffff16612394565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611c5083610b3f565b611c92576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016108ce565b611c9d826000611d31565b67ffffffffffffffff83166000908152600760205260409020611cc090836123be565b611ccb816000611d31565b67ffffffffffffffff83166000908152600760205260409020611cf190600201826123be565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611d24939291906137e4565b60405180910390a1505050565b815115611df85781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611d87575060408201516fffffffffffffffffffffffffffffffff16155b15611dc057816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016108ce9190613867565b80156116c3576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580611e31575060208201516fffffffffffffffffffffffffffffffff1615155b156116c357816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016108ce9190613867565b60006119148383612560565b600061191483836125af565b3373ffffffffffffffffffffffffffffffffffffffff821603611f01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108ce565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611f8081610b3f565b611fc2576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108ce565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612041573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120659190613785565b611493576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108ce565b67ffffffffffffffff821660009081526007602052604090206116c390600201827f00000000000000000000000000000000000000000000000000000000000000006126a2565b60006119148373ffffffffffffffffffffffffffffffffffffffff84166125af565b60006119148373ffffffffffffffffffffffffffffffffffffffff8416612560565b7f00000000000000000000000000000000000000000000000000000000000000001561149357612159600282612a25565b611493576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108ce565b6121b081610b3f565b6121f2576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108ce565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa15801561226b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228f91906138a3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611493576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108ce565b67ffffffffffffffff821660009081526007602052604090206116c390827f00000000000000000000000000000000000000000000000000000000000000006126a2565b60608160000180548060200260200160405190810160405280929190818152602001828054801561069d57602002820191906000526020600020905b8154815260200190600101908083116123755750505050509050919050565b60006123b3856123a484866138c0565b6123ae90876138d7565b612a54565b90505b949350505050565b81546000906123e790700100000000000000000000000000000000900463ffffffff16426137d1565b90508015612489576001830154835461242f916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612394565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546124af916fffffffffffffffffffffffffffffffff9081169116612a54565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611d24908490613867565b60008181526001830160205260408120546125a7575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105f3565b5060006105f3565b600081815260018301602052604081205480156126985760006125d36001836137d1565b85549091506000906125e7906001906137d1565b905081811461264c576000866000018281548110612607576126076134b1565b906000526020600020015490508087600001848154811061262a5761262a6134b1565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061265d5761265d6138ea565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105f3565b60009150506105f3565b825474010000000000000000000000000000000000000000900460ff1615806126c9575081155b156126d357505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061271990700100000000000000000000000000000000900463ffffffff16426137d1565b905080156127d9578183111561275b576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546127959083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612394565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156128905773ffffffffffffffffffffffffffffffffffffffff8416612838576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016108ce565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016108ce565b848310156129a35760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906128d490826137d1565b6128de878a6137d1565b6128e891906138d7565b6128f29190613919565b905073ffffffffffffffffffffffffffffffffffffffff861661294b576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016108ce565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016108ce565b6129ad85846137d1565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611914565b6000818310612a635781611914565b5090919050565b508054612a769061304e565b6000825580601f10612a86575050565b601f01602090049060005260206000209081019061149391905b80821115612ab45760008155600101612aa0565b5090565b600060208284031215612aca57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461191457600080fd5b803567ffffffffffffffff81168114612b1257600080fd5b919050565b600060208284031215612b2957600080fd5b61191482612afa565b6000815180845260005b81811015612b5857602081850181015186830182015201612b3c565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006119146020830184612b32565b73ffffffffffffffffffffffffffffffffffffffff8116811461149357600080fd5b8035612b1281612ba9565b600060208284031215612be857600080fd5b813561191481612ba9565b600060208284031215612c0557600080fd5b813567ffffffffffffffff811115612c1c57600080fd5b8201610100818503121561191457600080fd5b60008083601f840112612c4157600080fd5b50813567ffffffffffffffff811115612c5957600080fd5b6020830191508360208260051b8501011115612c7457600080fd5b9250929050565b60008060008060408587031215612c9157600080fd5b843567ffffffffffffffff80821115612ca957600080fd5b612cb588838901612c2f565b90965094506020870135915080821115612cce57600080fd5b50612cdb87828801612c2f565b95989497509550505050565b600080600060408486031215612cfc57600080fd5b612d0584612afa565b9250602084013567ffffffffffffffff80821115612d2257600080fd5b818601915086601f830112612d3657600080fd5b813581811115612d4557600080fd5b876020828501011115612d5757600080fd5b6020830194508093505050509250925092565b600060208284031215612d7c57600080fd5b813567ffffffffffffffff811115612d9357600080fd5b820160a0818503121561191457600080fd5b602081526000825160406020840152612dc16060840182612b32565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612dfc8282612b32565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e5357835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612e21565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e5357835167ffffffffffffffff1683529284019291840191600101612e7b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715612ef457612ef4612ea1565b60405290565b60405160c0810167ffffffffffffffff81118282101715612ef457612ef4612ea1565b801515811461149357600080fd5b8035612b1281612f1d565b80356fffffffffffffffffffffffffffffffff81168114612b1257600080fd5b600060608284031215612f6857600080fd5b6040516060810181811067ffffffffffffffff82111715612f8b57612f8b612ea1565b6040529050808235612f9c81612f1d565b8152612faa60208401612f36565b6020820152612fbb60408401612f36565b60408201525092915050565b600080600060e08486031215612fdc57600080fd5b612fe584612afa565b9250612ff48560208601612f56565b91506130038560808601612f56565b90509250925092565b6000806020838503121561301f57600080fd5b823567ffffffffffffffff81111561303657600080fd5b61304285828601612c2f565b90969095509350505050565b600181811c9082168061306257607f821691505b60208210810361309b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f8301126130b257600080fd5b813567ffffffffffffffff808211156130cd576130cd612ea1565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561311357613113612ea1565b8160405283815286602085880101111561312c57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561315f57600080fd5b613167612ed0565b823567ffffffffffffffff8082111561317f57600080fd5b61318b368387016130a1565b835261319960208601612afa565b60208401526131aa60408601612bcb565b6040840152606085013560608401526131c560808601612bcb565b608084015260a08501359150808211156131de57600080fd5b6131ea368387016130a1565b60a084015260c085013591508082111561320357600080fd5b61320f368387016130a1565b60c084015260e085013591508082111561322857600080fd5b50613235368286016130a1565b60e08301525092915050565b601f821115610ff7576000816000526020600020601f850160051c8101602086101561326a5750805b601f850160051c820191505b8181101561328957828155600101613276565b505050505050565b67ffffffffffffffff8311156132a9576132a9612ea1565b6132bd836132b7835461304e565b83613241565b6000601f84116001811461330f57600085156132d95750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611b81565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561335e578685013582556020948501946001909201910161333e565b5086821015613399577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006133be6040830186612b32565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561342157600080fd5b60405160a0810167ffffffffffffffff828210818311171561344557613445612ea1565b81604052843591508082111561345a57600080fd5b50613467368286016130a1565b82525061347660208401612afa565b6020820152604083013561348981612ba9565b60408201526060838101359082015260808301356134a681612ba9565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261351457600080fd5b9190910192915050565b6000610140823603121561353157600080fd5b613539612efa565b61354283612afa565b815261355060208401612f2b565b6020820152604083013567ffffffffffffffff8082111561357057600080fd5b61357c368387016130a1565b6040840152606085013591508082111561359557600080fd5b506135a2368286016130a1565b6060830152506135b53660808501612f56565b60808201526135c73660e08501612f56565b60a082015292915050565b815167ffffffffffffffff8111156135ec576135ec612ea1565b613600816135fa845461304e565b84613241565b602080601f831160018114613653576000841561361d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613289565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156136a057888601518255948401946001909101908401613681565b50858210156136dc57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff8716835280602084015261371081840187612b32565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff908116606087015290870151166080850152915061374e9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612dfc565b60006020828403121561379757600080fd5b815161191481612f1d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105f3576105f36137a2565b67ffffffffffffffff8416815260e0810161383060208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526123b6565b606081016105f382848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156138b557600080fd5b815161191481612ba9565b80820281158282048414176105f3576105f36137a2565b808201808211156105f3576105f36137a2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008261394f577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea164736f6c6343000818000a",
}
var BurnMintTokenPoolABI = BurnMintTokenPoolMetaData.ABI
@@ -310,6 +310,28 @@ func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetCurrentOutboundRate
return _BurnMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnMintTokenPool.CallOpts, remoteChainSelector)
}
+func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnMintTokenPool.contract.Call(opts, &out, "getRateLimitAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnMintTokenPool *BurnMintTokenPoolSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnMintTokenPool.Contract.GetRateLimitAdmin(&_BurnMintTokenPool.CallOpts)
+}
+
+func (_BurnMintTokenPool *BurnMintTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnMintTokenPool.Contract.GetRateLimitAdmin(&_BurnMintTokenPool.CallOpts)
+}
+
func (_BurnMintTokenPool *BurnMintTokenPoolCaller) GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
var out []interface{}
err := _BurnMintTokenPool.contract.Call(opts, &out, "getRemotePool", remoteChainSelector)
@@ -624,6 +646,18 @@ func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) SetChainRateLimite
return _BurnMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig)
}
+func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnMintTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin)
+}
+
+func (_BurnMintTokenPool *BurnMintTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnMintTokenPool.Contract.SetRateLimitAdmin(&_BurnMintTokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_BurnMintTokenPool *BurnMintTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnMintTokenPool.Contract.SetRateLimitAdmin(&_BurnMintTokenPool.TransactOpts, rateLimitAdmin)
+}
+
func (_BurnMintTokenPool *BurnMintTokenPoolTransactor) SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
return _BurnMintTokenPool.contract.Transact(opts, "setRemotePool", remoteChainSelector, remotePoolAddress)
}
@@ -2644,6 +2678,8 @@ type BurnMintTokenPoolInterface interface {
GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error)
+ GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error)
+
GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
@@ -2678,6 +2714,8 @@ type BurnMintTokenPoolInterface interface {
SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error)
+ SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error)
+
SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generated/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go b/core/gethwrappers/ccip/generated/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go
index b7ef316764..2c24ff0c6c 100644
--- a/core/gethwrappers/ccip/generated/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go
+++ b/core/gethwrappers/ccip/generated/burn_mint_token_pool_and_proxy/burn_mint_token_pool_and_proxy.go
@@ -82,8 +82,8 @@ type TokenPoolChainUpdate struct {
}
var BurnMintTokenPoolAndProxyMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"oldPool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"newPool\",\"type\":\"address\"}],\"name\":\"LegacyPoolChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRampAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"prevPool\",\"type\":\"address\"}],\"name\":\"setPreviousPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b506040516200481e3803806200481e833981016040819052620000349162000554565b83838383838383833380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200017e565b5050506001600160a01b0384161580620000e757506001600160a01b038116155b80620000fa57506001600160a01b038216155b1562000119576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016c576040805160008152602081019091526200016c908462000229565b505050505050505050505050620006b2565b336001600160a01b03821603620001d85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200024a576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002d55760008382815181106200026e576200026e62000664565b602090810291909101015190506200028860028262000386565b15620002cb576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200024d565b5060005b815181101562000381576000828281518110620002fa57620002fa62000664565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000326575062000378565b62000333600282620003a6565b1562000376576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002d9565b505050565b60006200039d836001600160a01b038416620003bd565b90505b92915050565b60006200039d836001600160a01b038416620004c1565b60008181526001830160205260408120548015620004b6576000620003e46001836200067a565b8554909150600090620003fa906001906200067a565b9050818114620004665760008660000182815481106200041e576200041e62000664565b906000526020600020015490508087600001848154811062000444576200044462000664565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200047a576200047a6200069c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620003a0565b6000915050620003a0565b60008181526001830160205260408120546200050a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003a0565b506000620003a0565b6001600160a01b03811681146200052957600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200054f8162000513565b919050565b600080600080608085870312156200056b57600080fd5b8451620005788162000513565b602086810151919550906001600160401b03808211156200059857600080fd5b818801915088601f830112620005ad57600080fd5b815181811115620005c257620005c26200052c565b8060051b604051601f19603f83011681018181108582111715620005ea57620005ea6200052c565b60405291825284820192508381018501918b8311156200060957600080fd5b938501935b828510156200063257620006228562000542565b845293850193928501926200060e565b809850505050505050620006496040860162000542565b9150620006596060860162000542565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003a057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c0516140e862000736600039600081816104bc0152818161197001526123c2015260008181610496015281816117080152611c23015260008181610210015281816102650152818161071901528181610d040152818161162801528181611b4301528181611d290152818161235801526125ad01526140e86000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80639a4575b9116100f9578063c4bffe2b11610097578063db6327dc11610071578063db6327dc14610481578063dc0bd97114610494578063e0351e13146104ba578063f2fde38b146104e057600080fd5b8063c4bffe2b14610446578063c75eea9c1461045b578063cf7401f31461046e57600080fd5b8063af58d59f116100d3578063af58d59f14610393578063b0f479a114610402578063b794658014610420578063c0d786551461043357600080fd5b80639a4575b91461034b578063a7cd63b71461036b578063a8d87a3b1461038057600080fd5b806354c8a4f31161016657806383826b2b1161014057806383826b2b146102f45780638926f54f146103075780638da5cb5b1461031a5780639766b9321461033857600080fd5b806354c8a4f3146102c457806378a010b2146102d957806379ba5097146102ec57600080fd5b806321df0da71161019757806321df0da71461020e578063240028e81461025557806339077537146102a257600080fd5b806301ffc9a7146101be5780630a2fd493146101e6578063181f5a7714610206575b600080fd5b6101d16101cc36600461305a565b6104f3565b60405190151581526020015b60405180910390f35b6101f96101f43660046130b9565b6105d8565b6040516101dd9190613142565b6101f9610688565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101dd565b6101d1610263366004613182565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102b56102b036600461319f565b6106a4565b604051905181526020016101dd565b6102d76102d2366004613227565b610831565b005b6102d76102e7366004613293565b6108ac565b6102d7610a20565b6101d1610302366004613316565b610b1d565b6101d16103153660046130b9565b610bea565b60005473ffffffffffffffffffffffffffffffffffffffff16610230565b6102d7610346366004613182565b610c01565b61035e61035936600461334d565b610c90565b6040516101dd9190613388565b610373610e00565b6040516101dd91906133e8565b61023061038e3660046130b9565b503090565b6103a66103a13660046130b9565b610e11565b6040516101dd919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610230565b6101f961042e3660046130b9565b610ee6565b6102d7610441366004613182565b610f11565b61044e610fe5565b6040516101dd9190613442565b6103a66104693660046130b9565b61109d565b6102d761047c3660046135f9565b61116f565b6102d761048f36600461363e565b611187565b7f0000000000000000000000000000000000000000000000000000000000000000610230565b7f00000000000000000000000000000000000000000000000000000000000000006101d1565b6102d76104ee366004613182565b61160d565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061058657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105d257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff8116600090815260076020526040902060040180546060919061060390613680565b80601f016020809104026020016040519081016040528092919081815260200182805461062f90613680565b801561067c5780601f106106515761010080835404028352916020019161067c565b820191906000526020600020905b81548152906001019060200180831161065f57829003601f168201915b50505050509050919050565b6040518060600160405280602381526020016140b96023913981565b6040805160208101909152600081526106c46106bf8361376f565b611621565b60085473ffffffffffffffffffffffffffffffffffffffff1661078f576040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b15801561077257600080fd5b505af1158015610786573d6000803e3d6000fd5b505050506107a0565b6107a061079b8361376f565b611852565b6107b06060830160408401613182565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0846060013560405161081291815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6108396118eb565b6108a68484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061196e92505050565b50505050565b6108b46118eb565b6108bd83610bea565b610904576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff83166000908152600760205260408120600401805461092b90613680565b80601f016020809104026020016040519081016040528092919081815260200182805461095790613680565b80156109a45780601f10610979576101008083540402835291602001916109a4565b820191906000526020600020905b81548152906001019060200180831161098757829003601f168201915b5050505067ffffffffffffffff86166000908152600760205260409020919250506004016109d38385836138b4565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610a12939291906139ce565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610aa1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108fb565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b600073ffffffffffffffffffffffffffffffffffffffff8216301480610be35750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169281019290925273ffffffffffffffffffffffffffffffffffffffff848116602484015216906383826b2b90604401602060405180830381865afa158015610bbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be39190613a32565b9392505050565b60006105d2600567ffffffffffffffff8416611b24565b610c096118eb565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f81accd0a7023865eaa51b3399dd0eafc488bf3ba238402911e1659cfe860f22891015b60405180910390a15050565b6040805180820190915260608082526020820152610cb5610cb083613a4f565b611b3c565b60085473ffffffffffffffffffffffffffffffffffffffff16610d7a576040517f42966c68000000000000000000000000000000000000000000000000000000008152606083013560048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b158015610d5d57600080fd5b505af1158015610d71573d6000803e3d6000fd5b50505050610d8b565b610d8b610d8683613a4f565b611d06565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610de584602001602081019061042e91906130b9565b81526040805160208181019092526000815291015292915050565b6060610e0c6002611e20565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105d290611e2d565b67ffffffffffffffff8116600090815260076020526040902060050180546060919061060390613680565b610f196118eb565b73ffffffffffffffffffffffffffffffffffffffff8116610f66576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849101610c84565b60606000610ff36005611e20565b90506000815167ffffffffffffffff81111561101157611011613484565b60405190808252806020026020018201604052801561103a578160200160208202803683370190505b50905060005b82518110156110965782818151811061105b5761105b613af1565b602002602001015182828151811061107557611075613af1565b67ffffffffffffffff90921660209283029190910190910152600101611040565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105d290611e2d565b6111776118eb565b611182838383611edf565b505050565b61118f6118eb565b60005b818110156111825760008383838181106111ae576111ae613af1565b90506020028101906111c09190613b20565b6111c990613b5e565b90506111de8160800151826020015115611fc9565b6111f18160a00151826020015115611fc9565b8060200151156114ed5780516112139060059067ffffffffffffffff16612102565b6112585780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108fb565b604081015151158061126d5750606081015151155b156112a4576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906114859082613c12565b506060820151600582019061149a9082613c12565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506114e09493929190613d2c565b60405180910390a1611604565b80516115059060059067ffffffffffffffff1661210e565b61154a5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108fb565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906115b3600483018261300c565b6115c160058301600061300c565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101611192565b6116156118eb565b61161e8161211a565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146116b65760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108fb565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611764573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117889190613a32565b156117bf576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117cc816020015161220f565b60006117db82602001516105d8565b90508051600014806117ff575080805190602001208260a001518051906020012014155b1561183c578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016108fb9190613142565b61184e82602001518360600151612335565b5050565b6008548151606083015160208401516040517f8627fad600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90941693638627fad6936118b69390923392600401613dc5565b600060405180830381600087803b1580156118d057600080fd5b505af11580156118e4573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461196c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108fb565b565b7f00000000000000000000000000000000000000000000000000000000000000006119c5576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611a5b5760008382815181106119e5576119e5613af1565b60200260200101519050611a0381600261237c90919063ffffffff16565b15611a525760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016119c8565b5060005b8151811015611182576000828281518110611a7c57611a7c613af1565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ac05750611b1c565b611acb60028261239e565b15611b1a5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611a5f565b60008181526001830160205260408120541515610be3565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611bd15760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108fb565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611c7f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca39190613a32565b15611cda576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ce781604001516123c0565b611cf4816020015161243f565b61161e8160200151826060015161258d565b6008546060820151611d539173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116929116906125d1565b60085460408083015183516060850151602086015193517f9687544500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90951694639687544594611dbb94939291600401613e26565b6000604051808303816000875af1158015611dda573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261184e9190810190613e86565b60606000610be38361265e565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611ebb82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611e9f9190613f23565b85608001516fffffffffffffffffffffffffffffffff166126b9565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611ee883610bea565b611f2a576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016108fb565b611f35826000611fc9565b67ffffffffffffffff83166000908152600760205260409020611f5890836126e3565b611f63816000611fc9565b67ffffffffffffffff83166000908152600760205260409020611f8990600201826126e3565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611fbc93929190613f36565b60405180910390a1505050565b8151156120905781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff1610158061201f575060408201516fffffffffffffffffffffffffffffffff16155b1561205857816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016108fb9190613fb9565b801561184e576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff161515806120c9575060208201516fffffffffffffffffffffffffffffffff1615155b1561184e57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016108fb9190613fb9565b6000610be38383612885565b6000610be383836128d4565b3373ffffffffffffffffffffffffffffffffffffffff821603612199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108fb565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61221881610bea565b61225a576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108fb565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa1580156122d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122fd9190613a32565b61161e576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108fb565b67ffffffffffffffff8216600090815260076020526040902061184e90600201827f00000000000000000000000000000000000000000000000000000000000000006129c7565b6000610be38373ffffffffffffffffffffffffffffffffffffffff84166128d4565b6000610be38373ffffffffffffffffffffffffffffffffffffffff8416612885565b7f00000000000000000000000000000000000000000000000000000000000000001561161e576123f1600282612d4a565b61161e576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108fb565b61244881610bea565b61248a576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108fb565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612503573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125279190613ff5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461161e576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108fb565b67ffffffffffffffff8216600090815260076020526040902061184e90827f00000000000000000000000000000000000000000000000000000000000000006129c7565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611182908490612d79565b60608160000180548060200260200160405190810160405280929190818152602001828054801561067c57602002820191906000526020600020905b81548152602001906001019080831161269a5750505050509050919050565b60006126d8856126c98486614012565b6126d39087614029565b612e85565b90505b949350505050565b815460009061270c90700100000000000000000000000000000000900463ffffffff1642613f23565b905080156127ae5760018301548354612754916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166126b9565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546127d4916fffffffffffffffffffffffffffffffff9081169116612e85565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611fbc908490613fb9565b60008181526001830160205260408120546128cc575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105d2565b5060006105d2565b600081815260018301602052604081205480156129bd5760006128f8600183613f23565b855490915060009061290c90600190613f23565b905081811461297157600086600001828154811061292c5761292c613af1565b906000526020600020015490508087600001848154811061294f5761294f613af1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806129825761298261403c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105d2565b60009150506105d2565b825474010000000000000000000000000000000000000000900460ff1615806129ee575081155b156129f857505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612a3e90700100000000000000000000000000000000900463ffffffff1642613f23565b90508015612afe5781831115612a80576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612aba9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166126b9565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612bb55773ffffffffffffffffffffffffffffffffffffffff8416612b5d576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016108fb565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016108fb565b84831015612cc85760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612bf99082613f23565b612c03878a613f23565b612c0d9190614029565b612c17919061406b565b905073ffffffffffffffffffffffffffffffffffffffff8616612c70576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016108fb565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016108fb565b612cd28584613f23565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610be3565b6000612ddb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612e9b9092919063ffffffff16565b8051909150156111825780806020019051810190612df99190613a32565b611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016108fb565b6000818310612e945781610be3565b5090919050565b60606126db8484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051612ecf91906140a6565b60006040518083038185875af1925050503d8060008114612f0c576040519150601f19603f3d011682016040523d82523d6000602084013e612f11565b606091505b5091509150612f2287838387612f2d565b979650505050505050565b60608315612fc3578251600003612fbc5773ffffffffffffffffffffffffffffffffffffffff85163b612fbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108fb565b50816126db565b6126db8383815115612fd85781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fb9190613142565b50805461301890613680565b6000825580601f10613028575050565b601f01602090049060005260206000209081019061161e91905b808211156130565760008155600101613042565b5090565b60006020828403121561306c57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610be357600080fd5b803567ffffffffffffffff811681146130b457600080fd5b919050565b6000602082840312156130cb57600080fd5b610be38261309c565b60005b838110156130ef5781810151838201526020016130d7565b50506000910152565b600081518084526131108160208601602086016130d4565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610be360208301846130f8565b73ffffffffffffffffffffffffffffffffffffffff8116811461161e57600080fd5b80356130b481613155565b60006020828403121561319457600080fd5b8135610be381613155565b6000602082840312156131b157600080fd5b813567ffffffffffffffff8111156131c857600080fd5b82016101008185031215610be357600080fd5b60008083601f8401126131ed57600080fd5b50813567ffffffffffffffff81111561320557600080fd5b6020830191508360208260051b850101111561322057600080fd5b9250929050565b6000806000806040858703121561323d57600080fd5b843567ffffffffffffffff8082111561325557600080fd5b613261888389016131db565b9096509450602087013591508082111561327a57600080fd5b50613287878288016131db565b95989497509550505050565b6000806000604084860312156132a857600080fd5b6132b18461309c565b9250602084013567ffffffffffffffff808211156132ce57600080fd5b818601915086601f8301126132e257600080fd5b8135818111156132f157600080fd5b87602082850101111561330357600080fd5b6020830194508093505050509250925092565b6000806040838503121561332957600080fd5b6133328361309c565b9150602083013561334281613155565b809150509250929050565b60006020828403121561335f57600080fd5b813567ffffffffffffffff81111561337657600080fd5b820160a08185031215610be357600080fd5b6020815260008251604060208401526133a460608401826130f8565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526133df82826130f8565b95945050505050565b6020808252825182820181905260009190848201906040850190845b8181101561343657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613404565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561343657835167ffffffffffffffff168352928401929184019160010161345e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff811182821017156134d7576134d7613484565b60405290565b60405160c0810167ffffffffffffffff811182821017156134d7576134d7613484565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561354757613547613484565b604052919050565b801515811461161e57600080fd5b80356130b48161354f565b80356fffffffffffffffffffffffffffffffff811681146130b457600080fd5b60006060828403121561359a57600080fd5b6040516060810181811067ffffffffffffffff821117156135bd576135bd613484565b60405290508082356135ce8161354f565b81526135dc60208401613568565b60208201526135ed60408401613568565b60408201525092915050565b600080600060e0848603121561360e57600080fd5b6136178461309c565b92506136268560208601613588565b91506136358560808601613588565b90509250925092565b6000806020838503121561365157600080fd5b823567ffffffffffffffff81111561366857600080fd5b613674858286016131db565b90969095509350505050565b600181811c9082168061369457607f821691505b6020821081036136cd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600067ffffffffffffffff8211156136ed576136ed613484565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261372a57600080fd5b813561373d613738826136d3565b613500565b81815284602083860101111561375257600080fd5b816020850160208301376000918101602001919091529392505050565b6000610100823603121561378257600080fd5b61378a6134b3565b823567ffffffffffffffff808211156137a257600080fd5b6137ae36838701613719565b83526137bc6020860161309c565b60208401526137cd60408601613177565b6040840152606085013560608401526137e860808601613177565b608084015260a085013591508082111561380157600080fd5b61380d36838701613719565b60a084015260c085013591508082111561382657600080fd5b61383236838701613719565b60c084015260e085013591508082111561384b57600080fd5b5061385836828601613719565b60e08301525092915050565b601f821115611182576000816000526020600020601f850160051c8101602086101561388d5750805b601f850160051c820191505b818110156138ac57828155600101613899565b505050505050565b67ffffffffffffffff8311156138cc576138cc613484565b6138e0836138da8354613680565b83613864565b6000601f84116001811461393257600085156138fc5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556118e4565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156139815786850135825560209485019460019092019101613961565b50868210156139bc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006139e160408301866130f8565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060208284031215613a4457600080fd5b8151610be38161354f565b600060a08236031215613a6157600080fd5b60405160a0810167ffffffffffffffff8282108183111715613a8557613a85613484565b816040528435915080821115613a9a57600080fd5b50613aa736828601613719565b825250613ab66020840161309c565b60208201526040830135613ac981613155565b6040820152606083810135908201526080830135613ae681613155565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1833603018112613b5457600080fd5b9190910192915050565b60006101408236031215613b7157600080fd5b613b796134dd565b613b828361309c565b8152613b906020840161355d565b6020820152604083013567ffffffffffffffff80821115613bb057600080fd5b613bbc36838701613719565b60408401526060850135915080821115613bd557600080fd5b50613be236828601613719565b606083015250613bf53660808501613588565b6080820152613c073660e08501613588565b60a082015292915050565b815167ffffffffffffffff811115613c2c57613c2c613484565b613c4081613c3a8454613680565b84613864565b602080601f831160018114613c935760008415613c5d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556138ac565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613ce057888601518255948401946001909101908401613cc1565b5085821015613d1c57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613d50818401876130f8565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613d8e9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e08301526133df565b60a081526000613dd860a08301876130f8565b73ffffffffffffffffffffffffffffffffffffffff8616602084015284604084015267ffffffffffffffff841660608401528281036080840152600081526020810191505095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8516815260a060208201526000613e5560a08301866130f8565b60408301949094525067ffffffffffffffff9190911660608201528082036080909101526000815260200192915050565b600060208284031215613e9857600080fd5b815167ffffffffffffffff811115613eaf57600080fd5b8201601f81018413613ec057600080fd5b8051613ece613738826136d3565b818152856020838501011115613ee357600080fd5b6133df8260208301602086016130d4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105d2576105d2613ef4565b67ffffffffffffffff8416815260e08101613f8260208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526126db565b606081016105d282848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561400757600080fd5b8151610be381613155565b80820281158282048414176105d2576105d2613ef4565b808201808211156105d2576105d2613ef4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826140a1577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008251613b548184602087016130d456fe4275726e4d696e74546f6b656e506f6f6c416e6450726f787920312e352e302d646576a164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"oldPool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"newPool\",\"type\":\"address\"}],\"name\":\"LegacyPoolChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRampAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"prevPool\",\"type\":\"address\"}],\"name\":\"setPreviousPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60e06040523480156200001157600080fd5b506040516200492538038062004925833981016040819052620000349162000554565b83838383838383833380600081620000935760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c657620000c6816200017e565b5050506001600160a01b0384161580620000e757506001600160a01b038116155b80620000fa57506001600160a01b038216155b1562000119576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016c576040805160008152602081019091526200016c908462000229565b505050505050505050505050620006b2565b336001600160a01b03821603620001d85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008a565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200024a576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002d55760008382815181106200026e576200026e62000664565b602090810291909101015190506200028860028262000386565b15620002cb576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200024d565b5060005b815181101562000381576000828281518110620002fa57620002fa62000664565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000326575062000378565b62000333600282620003a6565b1562000376576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002d9565b505050565b60006200039d836001600160a01b038416620003bd565b90505b92915050565b60006200039d836001600160a01b038416620004c1565b60008181526001830160205260408120548015620004b6576000620003e46001836200067a565b8554909150600090620003fa906001906200067a565b9050818114620004665760008660000182815481106200041e576200041e62000664565b906000526020600020015490508087600001848154811062000444576200044462000664565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200047a576200047a6200069c565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620003a0565b6000915050620003a0565b60008181526001830160205260408120546200050a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003a0565b506000620003a0565b6001600160a01b03811681146200052957600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200054f8162000513565b919050565b600080600080608085870312156200056b57600080fd5b8451620005788162000513565b602086810151919550906001600160401b03808211156200059857600080fd5b818801915088601f830112620005ad57600080fd5b815181811115620005c257620005c26200052c565b8060051b604051601f19603f83011681018181108582111715620005ea57620005ea6200052c565b60405291825284820192508381018501918b8311156200060957600080fd5b938501935b828510156200063257620006228562000542565b845293850193928501926200060e565b809850505050505050620006496040860162000542565b9150620006596060860162000542565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003a057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c0516141ef620007366000396000818161050301528181611a7701526124c90152600081816104dd0152818161180f0152611d2a0152600081816102260152818161027b0152818161076001528181610d9a0152818161172f01528181611c4a01528181611e300152818161245f01526126b401526141ef6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c80639766b93211610104578063c0d78655116100a2578063db6327dc11610071578063db6327dc146104c8578063dc0bd971146104db578063e0351e1314610501578063f2fde38b1461052757600080fd5b8063c0d786551461047a578063c4bffe2b1461048d578063c75eea9c146104a2578063cf7401f3146104b557600080fd5b8063a8d87a3b116100de578063a8d87a3b146103c7578063af58d59f146103da578063b0f479a114610449578063b79465801461046757600080fd5b80639766b9321461037f5780639a4575b914610392578063a7cd63b7146103b257600080fd5b80636d3d1a58116101715780637d54534e1161014b5780637d54534e1461032857806383826b2b1461033b5780638926f54f1461034e5780638da5cb5b1461036157600080fd5b80636d3d1a58146102ef57806378a010b21461030d57806379ba50971461032057600080fd5b806321df0da7116101ad57806321df0da714610224578063240028e81461026b57806339077537146102b857806354c8a4f3146102da57600080fd5b806301ffc9a7146101d45780630a2fd493146101fc578063181f5a771461021c575b600080fd5b6101e76101e2366004613161565b61053a565b60405190151581526020015b60405180910390f35b61020f61020a3660046131c0565b61061f565b6040516101f39190613249565b61020f6106cf565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101f3565b6101e7610279366004613289565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102cb6102c63660046132a6565b6106eb565b604051905181526020016101f3565b6102ed6102e836600461332e565b610878565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610246565b6102ed61031b36600461339a565b6108f3565b6102ed610a67565b6102ed610336366004613289565b610b64565b6101e761034936600461341d565b610bb3565b6101e761035c3660046131c0565b610c80565b60005473ffffffffffffffffffffffffffffffffffffffff16610246565b6102ed61038d366004613289565b610c97565b6103a56103a0366004613454565b610d26565b6040516101f3919061348f565b6103ba610e96565b6040516101f391906134ef565b6102466103d53660046131c0565b503090565b6103ed6103e83660046131c0565b610ea7565b6040516101f3919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610246565b61020f6104753660046131c0565b610f7c565b6102ed610488366004613289565b610fa7565b61049561107b565b6040516101f39190613549565b6103ed6104b03660046131c0565b611133565b6102ed6104c3366004613700565b611205565b6102ed6104d6366004613745565b61128e565b7f0000000000000000000000000000000000000000000000000000000000000000610246565b7f00000000000000000000000000000000000000000000000000000000000000006101e7565b6102ed610535366004613289565b611714565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806105cd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061061957507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff8116600090815260076020526040902060040180546060919061064a90613787565b80601f016020809104026020016040519081016040528092919081815260200182805461067690613787565b80156106c35780601f10610698576101008083540402835291602001916106c3565b820191906000526020600020905b8154815290600101906020018083116106a657829003601f168201915b50505050509050919050565b6040518060600160405280602381526020016141c06023913981565b60408051602081019091526000815261070b61070683613876565b611728565b60095473ffffffffffffffffffffffffffffffffffffffff166107d6576040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156107b957600080fd5b505af11580156107cd573d6000803e3d6000fd5b505050506107e7565b6107e76107e283613876565b611959565b6107f76060830160408401613289565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0846060013560405161085991815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6108806119f2565b6108ed84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611a7592505050565b50505050565b6108fb6119f2565b61090483610c80565b61094b576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff83166000908152600760205260408120600401805461097290613787565b80601f016020809104026020016040519081016040528092919081815260200182805461099e90613787565b80156109eb5780601f106109c0576101008083540402835291602001916109eb565b820191906000526020600020905b8154815290600101906020018083116109ce57829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610a1a8385836139bb565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610a5993929190613ad5565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610942565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b6c6119f2565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600073ffffffffffffffffffffffffffffffffffffffff8216301480610c795750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169281019290925273ffffffffffffffffffffffffffffffffffffffff848116602484015216906383826b2b90604401602060405180830381865afa158015610c55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c799190613b39565b9392505050565b6000610619600567ffffffffffffffff8416611c2b565b610c9f6119f2565b6009805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f81accd0a7023865eaa51b3399dd0eafc488bf3ba238402911e1659cfe860f22891015b60405180910390a15050565b6040805180820190915260608082526020820152610d4b610d4683613b56565b611c43565b60095473ffffffffffffffffffffffffffffffffffffffff16610e10576040517f42966c68000000000000000000000000000000000000000000000000000000008152606083013560048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906342966c6890602401600060405180830381600087803b158015610df357600080fd5b505af1158015610e07573d6000803e3d6000fd5b50505050610e21565b610e21610e1c83613b56565b611e0d565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610e7b84602001602081019061047591906131c0565b81526040805160208181019092526000815291015292915050565b6060610ea26002611f27565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261061990611f34565b67ffffffffffffffff8116600090815260076020526040902060050180546060919061064a90613787565b610faf6119f2565b73ffffffffffffffffffffffffffffffffffffffff8116610ffc576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849101610d1a565b606060006110896005611f27565b90506000815167ffffffffffffffff8111156110a7576110a761358b565b6040519080825280602002602001820160405280156110d0578160200160208202803683370190505b50905060005b825181101561112c578281815181106110f1576110f1613bf8565b602002602001015182828151811061110b5761110b613bf8565b67ffffffffffffffff909216602092830291909101909101526001016110d6565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261061990611f34565b60085473ffffffffffffffffffffffffffffffffffffffff163314801590611245575060005473ffffffffffffffffffffffffffffffffffffffff163314155b1561127e576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610942565b611289838383611fe6565b505050565b6112966119f2565b60005b818110156112895760008383838181106112b5576112b5613bf8565b90506020028101906112c79190613c27565b6112d090613c65565b90506112e581608001518260200151156120d0565b6112f88160a001518260200151156120d0565b8060200151156115f457805161131a9060059067ffffffffffffffff16612209565b61135f5780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610942565b60408101515115806113745750606081015151155b156113ab576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c1790911696151502959095179098559081015194015193811693169091029190911760038201559151909190600482019061158c9082613d19565b50606082015160058201906115a19082613d19565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506115e79493929190613e33565b60405180910390a161170b565b805161160c9060059067ffffffffffffffff16612215565b6116515780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610942565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906116ba6004830182613113565b6116c8600583016000613113565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101611299565b61171c6119f2565b61172581612221565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146117bd5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610942565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa15801561186b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061188f9190613b39565b156118c6576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d38160200151612316565b60006118e2826020015161061f565b9050805160001480611906575080805190602001208260a001518051906020012014155b15611943578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016109429190613249565b6119558260200151836060015161243c565b5050565b6009548151606083015160208401516040517f8627fad600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90941693638627fad6936119bd9390923392600401613ecc565b600060405180830381600087803b1580156119d757600080fd5b505af11580156119eb573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610942565b565b7f0000000000000000000000000000000000000000000000000000000000000000611acc576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611b62576000838281518110611aec57611aec613bf8565b60200260200101519050611b0a81600261248390919063ffffffff16565b15611b595760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611acf565b5060005b8151811015611289576000828281518110611b8357611b83613bf8565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611bc75750611c23565b611bd26002826124a5565b15611c215760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611b66565b60008181526001830160205260408120541515610c79565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611cd85760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610942565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611d86573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611daa9190613b39565b15611de1576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611dee81604001516124c7565b611dfb8160200151612546565b61172581602001518260600151612694565b6009546060820151611e5a9173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116929116906126d8565b60095460408083015183516060850151602086015193517f9687544500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90951694639687544594611ec294939291600401613f2d565b6000604051808303816000875af1158015611ee1573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526119559190810190613f8d565b60606000610c7983612765565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611fc282606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611fa6919061402a565b85608001516fffffffffffffffffffffffffffffffff166127c0565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611fef83610c80565b612031576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610942565b61203c8260006120d0565b67ffffffffffffffff8316600090815260076020526040902061205f90836127ea565b61206a8160006120d0565b67ffffffffffffffff8316600090815260076020526040902061209090600201826127ea565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516120c39392919061403d565b60405180910390a1505050565b8151156121975781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580612126575060408201516fffffffffffffffffffffffffffffffff16155b1561215f57816040517f8020d12400000000000000000000000000000000000000000000000000000000815260040161094291906140c0565b8015611955576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff161515806121d0575060208201516fffffffffffffffffffffffffffffffff1615155b1561195557816040517fd68af9cc00000000000000000000000000000000000000000000000000000000815260040161094291906140c0565b6000610c79838361298c565b6000610c7983836129db565b3373ffffffffffffffffffffffffffffffffffffffff8216036122a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610942565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61231f81610c80565b612361576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610942565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa1580156123e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124049190613b39565b611725576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610942565b67ffffffffffffffff8216600090815260076020526040902061195590600201827f0000000000000000000000000000000000000000000000000000000000000000612ace565b6000610c798373ffffffffffffffffffffffffffffffffffffffff84166129db565b6000610c798373ffffffffffffffffffffffffffffffffffffffff841661298c565b7f000000000000000000000000000000000000000000000000000000000000000015611725576124f8600282612e51565b611725576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610942565b61254f81610c80565b612591576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610942565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa15801561260a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061262e91906140fc565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611725576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610942565b67ffffffffffffffff8216600090815260076020526040902061195590827f0000000000000000000000000000000000000000000000000000000000000000612ace565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611289908490612e80565b6060816000018054806020026020016040519081016040528092919081815260200182805480156106c357602002820191906000526020600020905b8154815260200190600101908083116127a15750505050509050919050565b60006127df856127d08486614119565b6127da9087614130565b612f8c565b90505b949350505050565b815460009061281390700100000000000000000000000000000000900463ffffffff164261402a565b905080156128b5576001830154835461285b916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166127c0565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546128db916fffffffffffffffffffffffffffffffff9081169116612f8c565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906120c39084906140c0565b60008181526001830160205260408120546129d357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610619565b506000610619565b60008181526001830160205260408120548015612ac45760006129ff60018361402a565b8554909150600090612a139060019061402a565b9050818114612a78576000866000018281548110612a3357612a33613bf8565b9060005260206000200154905080876000018481548110612a5657612a56613bf8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612a8957612a89614143565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610619565b6000915050610619565b825474010000000000000000000000000000000000000000900460ff161580612af5575081155b15612aff57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612b4590700100000000000000000000000000000000900463ffffffff164261402a565b90508015612c055781831115612b87576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612bc19083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166127c0565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612cbc5773ffffffffffffffffffffffffffffffffffffffff8416612c64576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610942565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610942565b84831015612dcf5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612d00908261402a565b612d0a878a61402a565b612d149190614130565b612d1e9190614172565b905073ffffffffffffffffffffffffffffffffffffffff8616612d77576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610942565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610942565b612dd9858461402a565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610c79565b6000612ee2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612fa29092919063ffffffff16565b8051909150156112895780806020019051810190612f009190613b39565b611289576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610942565b6000818310612f9b5781610c79565b5090919050565b60606127e28484600085856000808673ffffffffffffffffffffffffffffffffffffffff168587604051612fd691906141ad565b60006040518083038185875af1925050503d8060008114613013576040519150601f19603f3d011682016040523d82523d6000602084013e613018565b606091505b509150915061302987838387613034565b979650505050505050565b606083156130ca5782516000036130c35773ffffffffffffffffffffffffffffffffffffffff85163b6130c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610942565b50816127e2565b6127e283838151156130df5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109429190613249565b50805461311f90613787565b6000825580601f1061312f575050565b601f01602090049060005260206000209081019061172591905b8082111561315d5760008155600101613149565b5090565b60006020828403121561317357600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610c7957600080fd5b803567ffffffffffffffff811681146131bb57600080fd5b919050565b6000602082840312156131d257600080fd5b610c79826131a3565b60005b838110156131f65781810151838201526020016131de565b50506000910152565b600081518084526132178160208601602086016131db565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610c7960208301846131ff565b73ffffffffffffffffffffffffffffffffffffffff8116811461172557600080fd5b80356131bb8161325c565b60006020828403121561329b57600080fd5b8135610c798161325c565b6000602082840312156132b857600080fd5b813567ffffffffffffffff8111156132cf57600080fd5b82016101008185031215610c7957600080fd5b60008083601f8401126132f457600080fd5b50813567ffffffffffffffff81111561330c57600080fd5b6020830191508360208260051b850101111561332757600080fd5b9250929050565b6000806000806040858703121561334457600080fd5b843567ffffffffffffffff8082111561335c57600080fd5b613368888389016132e2565b9096509450602087013591508082111561338157600080fd5b5061338e878288016132e2565b95989497509550505050565b6000806000604084860312156133af57600080fd5b6133b8846131a3565b9250602084013567ffffffffffffffff808211156133d557600080fd5b818601915086601f8301126133e957600080fd5b8135818111156133f857600080fd5b87602082850101111561340a57600080fd5b6020830194508093505050509250925092565b6000806040838503121561343057600080fd5b613439836131a3565b915060208301356134498161325c565b809150509250929050565b60006020828403121561346657600080fd5b813567ffffffffffffffff81111561347d57600080fd5b820160a08185031215610c7957600080fd5b6020815260008251604060208401526134ab60608401826131ff565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526134e682826131ff565b95945050505050565b6020808252825182820181905260009190848201906040850190845b8181101561353d57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161350b565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561353d57835167ffffffffffffffff1683529284019291840191600101613565565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff811182821017156135de576135de61358b565b60405290565b60405160c0810167ffffffffffffffff811182821017156135de576135de61358b565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff8111828210171561364e5761364e61358b565b604052919050565b801515811461172557600080fd5b80356131bb81613656565b80356fffffffffffffffffffffffffffffffff811681146131bb57600080fd5b6000606082840312156136a157600080fd5b6040516060810181811067ffffffffffffffff821117156136c4576136c461358b565b60405290508082356136d581613656565b81526136e36020840161366f565b60208201526136f46040840161366f565b60408201525092915050565b600080600060e0848603121561371557600080fd5b61371e846131a3565b925061372d856020860161368f565b915061373c856080860161368f565b90509250925092565b6000806020838503121561375857600080fd5b823567ffffffffffffffff81111561376f57600080fd5b61377b858286016132e2565b90969095509350505050565b600181811c9082168061379b57607f821691505b6020821081036137d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600067ffffffffffffffff8211156137f4576137f461358b565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f83011261383157600080fd5b813561384461383f826137da565b613607565b81815284602083860101111561385957600080fd5b816020850160208301376000918101602001919091529392505050565b6000610100823603121561388957600080fd5b6138916135ba565b823567ffffffffffffffff808211156138a957600080fd5b6138b536838701613820565b83526138c3602086016131a3565b60208401526138d46040860161327e565b6040840152606085013560608401526138ef6080860161327e565b608084015260a085013591508082111561390857600080fd5b61391436838701613820565b60a084015260c085013591508082111561392d57600080fd5b61393936838701613820565b60c084015260e085013591508082111561395257600080fd5b5061395f36828601613820565b60e08301525092915050565b601f821115611289576000816000526020600020601f850160051c810160208610156139945750805b601f850160051c820191505b818110156139b3578281556001016139a0565b505050505050565b67ffffffffffffffff8311156139d3576139d361358b565b6139e7836139e18354613787565b8361396b565b6000601f841160018114613a395760008515613a035750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556119eb565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613a885786850135825560209485019460019092019101613a68565b5086821015613ac3577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b604081526000613ae860408301866131ff565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060208284031215613b4b57600080fd5b8151610c7981613656565b600060a08236031215613b6857600080fd5b60405160a0810167ffffffffffffffff8282108183111715613b8c57613b8c61358b565b816040528435915080821115613ba157600080fd5b50613bae36828601613820565b825250613bbd602084016131a3565b60208201526040830135613bd08161325c565b6040820152606083810135908201526080830135613bed8161325c565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1833603018112613c5b57600080fd5b9190910192915050565b60006101408236031215613c7857600080fd5b613c806135e4565b613c89836131a3565b8152613c9760208401613664565b6020820152604083013567ffffffffffffffff80821115613cb757600080fd5b613cc336838701613820565b60408401526060850135915080821115613cdc57600080fd5b50613ce936828601613820565b606083015250613cfc366080850161368f565b6080820152613d0e3660e0850161368f565b60a082015292915050565b815167ffffffffffffffff811115613d3357613d3361358b565b613d4781613d418454613787565b8461396b565b602080601f831160018114613d9a5760008415613d645750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556139b3565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613de757888601518255948401946001909101908401613dc8565b5085821015613e2357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613e57818401876131ff565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613e959050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e08301526134e6565b60a081526000613edf60a08301876131ff565b73ffffffffffffffffffffffffffffffffffffffff8616602084015284604084015267ffffffffffffffff841660608401528281036080840152600081526020810191505095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8516815260a060208201526000613f5c60a08301866131ff565b60408301949094525067ffffffffffffffff9190911660608201528082036080909101526000815260200192915050565b600060208284031215613f9f57600080fd5b815167ffffffffffffffff811115613fb657600080fd5b8201601f81018413613fc757600080fd5b8051613fd561383f826137da565b818152856020838501011115613fea57600080fd5b6134e68260208301602086016131db565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561061957610619613ffb565b67ffffffffffffffff8416815260e0810161408960208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526127e2565b6060810161061982848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561410e57600080fd5b8151610c798161325c565b808202811582820484141761061957610619613ffb565b8082018082111561061957610619613ffb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826141a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008251613c5b8184602087016131db56fe4275726e4d696e74546f6b656e506f6f6c416e6450726f787920312e352e302d646576a164736f6c6343000818000a",
}
var BurnMintTokenPoolAndProxyABI = BurnMintTokenPoolAndProxyMetaData.ABI
@@ -332,6 +332,28 @@ func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxyCallerSession) GetOnR
return _BurnMintTokenPoolAndProxy.Contract.GetOnRamp(&_BurnMintTokenPoolAndProxy.CallOpts, arg0)
}
+func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxyCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnMintTokenPoolAndProxy.contract.Call(opts, &out, "getRateLimitAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxySession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnMintTokenPoolAndProxy.Contract.GetRateLimitAdmin(&_BurnMintTokenPoolAndProxy.CallOpts)
+}
+
+func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxyCallerSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnMintTokenPoolAndProxy.Contract.GetRateLimitAdmin(&_BurnMintTokenPoolAndProxy.CallOpts)
+}
+
func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxyCaller) GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
var out []interface{}
err := _BurnMintTokenPoolAndProxy.contract.Call(opts, &out, "getRemotePool", remoteChainSelector)
@@ -680,6 +702,18 @@ func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxyTransactorSession) Se
return _BurnMintTokenPoolAndProxy.Contract.SetPreviousPool(&_BurnMintTokenPoolAndProxy.TransactOpts, prevPool)
}
+func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxyTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnMintTokenPoolAndProxy.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin)
+}
+
+func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxySession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnMintTokenPoolAndProxy.Contract.SetRateLimitAdmin(&_BurnMintTokenPoolAndProxy.TransactOpts, rateLimitAdmin)
+}
+
+func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxyTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnMintTokenPoolAndProxy.Contract.SetRateLimitAdmin(&_BurnMintTokenPoolAndProxy.TransactOpts, rateLimitAdmin)
+}
+
func (_BurnMintTokenPoolAndProxy *BurnMintTokenPoolAndProxyTransactor) SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
return _BurnMintTokenPoolAndProxy.contract.Transact(opts, "setRemotePool", remoteChainSelector, remotePoolAddress)
}
@@ -2826,6 +2860,8 @@ type BurnMintTokenPoolAndProxyInterface interface {
GetOnRamp(opts *bind.CallOpts, arg0 uint64) (common.Address, error)
+ GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error)
+
GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
@@ -2864,6 +2900,8 @@ type BurnMintTokenPoolAndProxyInterface interface {
SetPreviousPool(opts *bind.TransactOpts, prevPool common.Address) (*types.Transaction, error)
+ SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error)
+
SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go b/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go
index 07489bbb01..6631733928 100644
--- a/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go
+++ b/core/gethwrappers/ccip/generated/burn_with_from_mint_token_pool/burn_with_from_mint_token_pool.go
@@ -82,8 +82,8 @@ type TokenPoolChainUpdate struct {
}
var BurnWithFromMintTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b50604051620043e4380380620043e48339810160408190526200003491620008c0565b8383838333806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200018f565b5050506001600160a01b0384161580620000e357506001600160a01b038116155b80620000f657506001600160a01b038216155b1562000115576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c05262000168576040805160008152602081019091526200016890846200023a565b5062000185925050506001600160a01b0385163060001962000397565b5050505062000afc565b336001600160a01b03821603620001e95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200025b576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002e65760008382815181106200027f576200027f620009d0565b60209081029190910101519050620002996002826200047d565b15620002dc576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200025e565b5060005b8151811015620003925760008282815181106200030b576200030b620009d0565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000337575062000389565b620003446002826200049d565b1562000387576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002ea565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040f9190620009e6565b6200041b919062000a16565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200047791869190620004b416565b50505050565b600062000494836001600160a01b03841662000585565b90505b92915050565b600062000494836001600160a01b03841662000689565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000503906001600160a01b038516908490620006db565b80519091501562000392578080602001905181019062000524919062000a2c565b620003925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b600081815260018301602052604081205480156200067e576000620005ac60018362000a57565b8554909150600090620005c29060019062000a57565b90508181146200062e576000866000018281548110620005e657620005e6620009d0565b90600052602060002001549050808760000184815481106200060c576200060c620009d0565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000642576200064262000a6d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000497565b600091505062000497565b6000818152600183016020526040812054620006d25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000497565b50600062000497565b6060620006ec8484600085620006f4565b949350505050565b606082471015620007575760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b0316858760405162000775919062000aa9565b60006040518083038185875af1925050503d8060008114620007b4576040519150601f19603f3d011682016040523d82523d6000602084013e620007b9565b606091505b509092509050620007cd87838387620007d8565b979650505050505050565b606083156200084c57825160000362000844576001600160a01b0385163b620008445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620006ec565b620006ec8383815115620008635781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000ac7565b6001600160a01b03811681146200089557600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008bb816200087f565b919050565b60008060008060808587031215620008d757600080fd5b8451620008e4816200087f565b602086810151919550906001600160401b03808211156200090457600080fd5b818801915088601f8301126200091957600080fd5b8151818111156200092e576200092e62000898565b8060051b604051601f19603f8301168101818110858211171562000956576200095662000898565b60405291825284820192508381018501918b8311156200097557600080fd5b938501935b828510156200099e576200098e85620008ae565b845293850193928501926200097a565b809850505050505050620009b560408601620008ae565b9150620009c560608601620008ae565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009f957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000497576200049762000a00565b60006020828403121562000a3f57600080fd5b8151801515811462000a5057600080fd5b9392505050565b8181038181111562000497576200049762000a00565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aa057818101518382015260200162000a86565b50506000910152565b6000825162000abd81846020870162000a83565b9190910192915050565b602081526000825180602084015262000ae881604085016020870162000a83565b601f01601f19169190910160400192915050565b60805160a05160c05161386b62000b79600039600081816104620152818161162d015261201101526000818161043c0152818161145e01526118e30152600081816101ef01528181610244015281816106a20152818161137e01528181611803015281816119fb01528181611fa701526121fc015261386b6000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c8063a7cd63b7116100e3578063c75eea9c1161008c578063dc0bd97111610066578063dc0bd9711461043a578063e0351e1314610460578063f2fde38b1461048657600080fd5b8063c75eea9c14610401578063cf7401f314610414578063db6327dc1461042757600080fd5b8063b7946580116100bd578063b7946580146103c6578063c0d78655146103d9578063c4bffe2b146103ec57600080fd5b8063a7cd63b714610324578063af58d59f14610339578063b0f479a1146103a857600080fd5b806354c8a4f3116101455780638926f54f1161011f5780638926f54f146102d35780638da5cb5b146102e65780639a4575b91461030457600080fd5b806354c8a4f3146102a357806378a010b2146102b857806379ba5097146102cb57600080fd5b806321df0da71161017657806321df0da7146101ed578063240028e814610234578063390775371461028157600080fd5b806301ffc9a71461019d5780630a2fd493146101c5578063181f5a77146101e5575b600080fd5b6101b06101ab36600461299f565b610499565b60405190151581526020015b60405180910390f35b6101d86101d33660046129fe565b61057e565b6040516101bc9190612a7d565b6101d861062e565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101bc565b6101b0610242366004612abd565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b61029461028f366004612ada565b61064a565b604051905181526020016101bc565b6102b66102b1366004612b62565b6107a5565b005b6102b66102c6366004612bce565b610820565b6102b6610994565b6101b06102e13660046129fe565b610a91565b60005473ffffffffffffffffffffffffffffffffffffffff1661020f565b610317610312366004612c51565b610aa8565b6040516101bc9190612c8c565b61032c610b4f565b6040516101bc9190612cec565b61034c6103473660046129fe565b610b60565b6040516101bc919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff1661020f565b6101d86103d43660046129fe565b610c35565b6102b66103e7366004612abd565b610c60565b6103f4610d3b565b6040516101bc9190612d46565b61034c61040f3660046129fe565b610df3565b6102b6610422366004612eae565b610ec5565b6102b6610435366004612ef3565b610edd565b7f000000000000000000000000000000000000000000000000000000000000000061020f565b7f00000000000000000000000000000000000000000000000000000000000000006101b0565b6102b6610494366004612abd565b611363565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061052c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061057857507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906105a990612f35565b80601f01602080910402602001604051908101604052809291908181526020018280546105d590612f35565b80156106225780601f106105f757610100808354040283529160200191610622565b820191906000526020600020905b81548152906001019060200180831161060557829003601f168201915b50505050509050919050565b60405180606001604052806023815260200161383c6023913981565b60408051602081019091526000815261066a61066583613033565b611377565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b1580156106fb57600080fd5b505af115801561070f573d6000803e3d6000fd5b50610724925050506060830160408401612abd565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f0846060013560405161078691815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6107ad6115a8565b61081a8484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061162b92505050565b50505050565b6108286115a8565b61083183610a91565b610878576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff83166000908152600760205260408120600401805461089f90612f35565b80601f01602080910402602001604051908101604052809291908181526020018280546108cb90612f35565b80156109185780601f106108ed57610100808354040283529160200191610918565b820191906000526020600020905b8154815290600101906020018083116108fb57829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610947838583613178565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf82858560405161098693929190613292565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161086f565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6000610578600567ffffffffffffffff84166117e1565b6040805180820190915260608082526020820152610acd610ac8836132f6565b6117fc565b610ada82606001356119c6565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610b348460200160208101906103d491906129fe565b81526040805160208181019092526000815291015292915050565b6060610b5b6002611a6f565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261057890611a7c565b67ffffffffffffffff811660009081526007602052604090206005018054606091906105a990612f35565b610c686115a8565b73ffffffffffffffffffffffffffffffffffffffff8116610cb5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610d496005611a6f565b90506000815167ffffffffffffffff811115610d6757610d67612d88565b604051908082528060200260200182016040528015610d90578160200160208202803683370190505b50905060005b8251811015610dec57828181518110610db157610db1613398565b6020026020010151828281518110610dcb57610dcb613398565b67ffffffffffffffff90921660209283029190910190910152600101610d96565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261057890611a7c565b610ecd6115a8565b610ed8838383611b2e565b505050565b610ee56115a8565b60005b81811015610ed8576000838383818110610f0457610f04613398565b9050602002810190610f1691906133c7565b610f1f90613405565b9050610f348160800151826020015115611c18565b610f478160a00151826020015115611c18565b806020015115611243578051610f699060059067ffffffffffffffff16611d51565b610fae5780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161086f565b6040810151511580610fc35750606081015151155b15610ffa576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906111db90826134b9565b50606082015160058201906111f090826134b9565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2955061123694939291906135d3565b60405180910390a161135a565b805161125b9060059067ffffffffffffffff16611d5d565b6112a05780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161086f565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906113096004830182612951565b611317600583016000612951565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101610ee8565b61136b6115a8565b61137481611d69565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161461140c5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161086f565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114de919061366c565b15611515576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115228160200151611e5e565b6000611531826020015161057e565b9050805160001480611555575080805190602001208260a001518051906020012014155b15611592578160a001516040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161086f9190612a7d565b6115a482602001518360600151611f84565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611629576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161086f565b565b7f0000000000000000000000000000000000000000000000000000000000000000611682576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156117185760008382815181106116a2576116a2613398565b602002602001015190506116c0816002611fcb90919063ffffffff16565b1561170f5760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611685565b5060005b8151811015610ed857600082828151811061173957611739613398565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361177d57506117d9565b611788600282611fed565b156117d75760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010161171c565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146118915760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240161086f565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa15801561193f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611963919061366c565b1561199a576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6119a7816040015161200f565b6119b4816020015161208e565b611374816020015182606001516121dc565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639dc29fac90604401600060405180830381600087803b158015611a5457600080fd5b505af1158015611a68573d6000803e3d6000fd5b5050505050565b606060006117f583612220565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611b0a82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611aee91906136b8565b85608001516fffffffffffffffffffffffffffffffff1661227b565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611b3783610a91565b611b79576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161086f565b611b84826000611c18565b67ffffffffffffffff83166000908152600760205260409020611ba790836122a5565b611bb2816000611c18565b67ffffffffffffffff83166000908152600760205260409020611bd890600201826122a5565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611c0b939291906136cb565b60405180910390a1505050565b815115611cdf5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611c6e575060408201516fffffffffffffffffffffffffffffffff16155b15611ca757816040517f8020d12400000000000000000000000000000000000000000000000000000000815260040161086f919061374e565b80156115a4576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580611d18575060208201516fffffffffffffffffffffffffffffffff1615155b156115a457816040517fd68af9cc00000000000000000000000000000000000000000000000000000000815260040161086f919061374e565b60006117f58383612447565b60006117f58383612496565b3373ffffffffffffffffffffffffffffffffffffffff821603611de8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161086f565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611e6781610a91565b611ea9576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161086f565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015611f28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4c919061366c565b611374576040517f728fe07b00000000000000000000000000000000000000000000000000000000815233600482015260240161086f565b67ffffffffffffffff821660009081526007602052604090206115a490600201827f0000000000000000000000000000000000000000000000000000000000000000612589565b60006117f58373ffffffffffffffffffffffffffffffffffffffff8416612496565b60006117f58373ffffffffffffffffffffffffffffffffffffffff8416612447565b7f0000000000000000000000000000000000000000000000000000000000000000156113745761204060028261290c565b611374576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260240161086f565b61209781610a91565b6120d9576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161086f565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612152573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612176919061378a565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611374576040517f728fe07b00000000000000000000000000000000000000000000000000000000815233600482015260240161086f565b67ffffffffffffffff821660009081526007602052604090206115a490827f0000000000000000000000000000000000000000000000000000000000000000612589565b60608160000180548060200260200160405190810160405280929190818152602001828054801561062257602002820191906000526020600020905b81548152602001906001019080831161225c5750505050509050919050565b600061229a8561228b84866137a7565b61229590876137be565b61293b565b90505b949350505050565b81546000906122ce90700100000000000000000000000000000000900463ffffffff16426136b8565b905080156123705760018301548354612316916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661227b565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612396916fffffffffffffffffffffffffffffffff908116911661293b565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611c0b90849061374e565b600081815260018301602052604081205461248e57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610578565b506000610578565b6000818152600183016020526040812054801561257f5760006124ba6001836136b8565b85549091506000906124ce906001906136b8565b90508181146125335760008660000182815481106124ee576124ee613398565b906000526020600020015490508087600001848154811061251157612511613398565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612544576125446137d1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610578565b6000915050610578565b825474010000000000000000000000000000000000000000900460ff1615806125b0575081155b156125ba57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061260090700100000000000000000000000000000000900463ffffffff16426136b8565b905080156126c05781831115612642576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461267c9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661227b565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156127775773ffffffffffffffffffffffffffffffffffffffff841661271f576040517ff94ebcd1000000000000000000000000000000000000000000000000000000008152600481018390526024810186905260440161086f565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff8516604482015260640161086f565b8483101561288a5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906127bb90826136b8565b6127c5878a6136b8565b6127cf91906137be565b6127d99190613800565b905073ffffffffffffffffffffffffffffffffffffffff8616612832576040517f15279c08000000000000000000000000000000000000000000000000000000008152600481018290526024810186905260440161086f565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff8716604482015260640161086f565b61289485846136b8565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156117f5565b600081831061294a57816117f5565b5090919050565b50805461295d90612f35565b6000825580601f1061296d575050565b601f01602090049060005260206000209081019061137491905b8082111561299b5760008155600101612987565b5090565b6000602082840312156129b157600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146117f557600080fd5b803567ffffffffffffffff811681146129f957600080fd5b919050565b600060208284031215612a1057600080fd5b6117f5826129e1565b6000815180845260005b81811015612a3f57602081850181015186830182015201612a23565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006117f56020830184612a19565b73ffffffffffffffffffffffffffffffffffffffff8116811461137457600080fd5b80356129f981612a90565b600060208284031215612acf57600080fd5b81356117f581612a90565b600060208284031215612aec57600080fd5b813567ffffffffffffffff811115612b0357600080fd5b820161010081850312156117f557600080fd5b60008083601f840112612b2857600080fd5b50813567ffffffffffffffff811115612b4057600080fd5b6020830191508360208260051b8501011115612b5b57600080fd5b9250929050565b60008060008060408587031215612b7857600080fd5b843567ffffffffffffffff80821115612b9057600080fd5b612b9c88838901612b16565b90965094506020870135915080821115612bb557600080fd5b50612bc287828801612b16565b95989497509550505050565b600080600060408486031215612be357600080fd5b612bec846129e1565b9250602084013567ffffffffffffffff80821115612c0957600080fd5b818601915086601f830112612c1d57600080fd5b813581811115612c2c57600080fd5b876020828501011115612c3e57600080fd5b6020830194508093505050509250925092565b600060208284031215612c6357600080fd5b813567ffffffffffffffff811115612c7a57600080fd5b820160a081850312156117f557600080fd5b602081526000825160406020840152612ca86060840182612a19565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612ce38282612a19565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d3a57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612d08565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612d3a57835167ffffffffffffffff1683529284019291840191600101612d62565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715612ddb57612ddb612d88565b60405290565b60405160c0810167ffffffffffffffff81118282101715612ddb57612ddb612d88565b801515811461137457600080fd5b80356129f981612e04565b80356fffffffffffffffffffffffffffffffff811681146129f957600080fd5b600060608284031215612e4f57600080fd5b6040516060810181811067ffffffffffffffff82111715612e7257612e72612d88565b6040529050808235612e8381612e04565b8152612e9160208401612e1d565b6020820152612ea260408401612e1d565b60408201525092915050565b600080600060e08486031215612ec357600080fd5b612ecc846129e1565b9250612edb8560208601612e3d565b9150612eea8560808601612e3d565b90509250925092565b60008060208385031215612f0657600080fd5b823567ffffffffffffffff811115612f1d57600080fd5b612f2985828601612b16565b90969095509350505050565b600181811c90821680612f4957607f821691505b602082108103612f82577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f830112612f9957600080fd5b813567ffffffffffffffff80821115612fb457612fb4612d88565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612ffa57612ffa612d88565b8160405283815286602085880101111561301357600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561304657600080fd5b61304e612db7565b823567ffffffffffffffff8082111561306657600080fd5b61307236838701612f88565b8352613080602086016129e1565b602084015261309160408601612ab2565b6040840152606085013560608401526130ac60808601612ab2565b608084015260a08501359150808211156130c557600080fd5b6130d136838701612f88565b60a084015260c08501359150808211156130ea57600080fd5b6130f636838701612f88565b60c084015260e085013591508082111561310f57600080fd5b5061311c36828601612f88565b60e08301525092915050565b601f821115610ed8576000816000526020600020601f850160051c810160208610156131515750805b601f850160051c820191505b818110156131705782815560010161315d565b505050505050565b67ffffffffffffffff83111561319057613190612d88565b6131a48361319e8354612f35565b83613128565b6000601f8411600181146131f657600085156131c05750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611a68565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156132455786850135825560209485019460019092019101613225565b5086821015613280577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006132a56040830186612a19565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561330857600080fd5b60405160a0810167ffffffffffffffff828210818311171561332c5761332c612d88565b81604052843591508082111561334157600080fd5b5061334e36828601612f88565b82525061335d602084016129e1565b6020820152604083013561337081612a90565b604082015260608381013590820152608083013561338d81612a90565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec18336030181126133fb57600080fd5b9190910192915050565b6000610140823603121561341857600080fd5b613420612de1565b613429836129e1565b815261343760208401612e12565b6020820152604083013567ffffffffffffffff8082111561345757600080fd5b61346336838701612f88565b6040840152606085013591508082111561347c57600080fd5b5061348936828601612f88565b60608301525061349c3660808501612e3d565b60808201526134ae3660e08501612e3d565b60a082015292915050565b815167ffffffffffffffff8111156134d3576134d3612d88565b6134e7816134e18454612f35565b84613128565b602080601f83116001811461353a57600084156135045750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613170565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561358757888601518255948401946001909101908401613568565b50858210156135c357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff871683528060208401526135f781840187612a19565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506136359050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612ce3565b60006020828403121561367e57600080fd5b81516117f581612e04565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561057857610578613689565b67ffffffffffffffff8416815260e0810161371760208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c083015261229d565b6060810161057882848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561379c57600080fd5b81516117f581612a90565b808202811582820484141761057857610578613689565b8082018082111561057857610578613689565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082613836577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fe4275726e5769746846726f6d4d696e74546f6b656e506f6f6c20312e352e302d646576a164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractIBurnMintERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60e06040523480156200001157600080fd5b50604051620044eb380380620044eb8339810160408190526200003491620008c0565b8383838333806000816200008f5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c257620000c2816200018f565b5050506001600160a01b0384161580620000e357506001600160a01b038116155b80620000f657506001600160a01b038216155b1562000115576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c05262000168576040805160008152602081019091526200016890846200023a565b5062000185925050506001600160a01b0385163060001962000397565b5050505062000afc565b336001600160a01b03821603620001e95760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000086565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200025b576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002e65760008382815181106200027f576200027f620009d0565b60209081029190910101519050620002996002826200047d565b15620002dc576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200025e565b5060005b8151811015620003925760008282815181106200030b576200030b620009d0565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000337575062000389565b620003446002826200049d565b1562000387576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002ea565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015620003e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200040f9190620009e6565b6200041b919062000a16565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091529192506200047791869190620004b416565b50505050565b600062000494836001600160a01b03841662000585565b90505b92915050565b600062000494836001600160a01b03841662000689565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062000503906001600160a01b038516908490620006db565b80519091501562000392578080602001905181019062000524919062000a2c565b620003925760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000086565b600081815260018301602052604081205480156200067e576000620005ac60018362000a57565b8554909150600090620005c29060019062000a57565b90508181146200062e576000866000018281548110620005e657620005e6620009d0565b90600052602060002001549050808760000184815481106200060c576200060c620009d0565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000642576200064262000a6d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000497565b600091505062000497565b6000818152600183016020526040812054620006d25750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000497565b50600062000497565b6060620006ec8484600085620006f4565b949350505050565b606082471015620007575760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000086565b600080866001600160a01b0316858760405162000775919062000aa9565b60006040518083038185875af1925050503d8060008114620007b4576040519150601f19603f3d011682016040523d82523d6000602084013e620007b9565b606091505b509092509050620007cd87838387620007d8565b979650505050505050565b606083156200084c57825160000362000844576001600160a01b0385163b620008445760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000086565b5081620006ec565b620006ec8383815115620008635781518083602001fd5b8060405162461bcd60e51b815260040162000086919062000ac7565b6001600160a01b03811681146200089557600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b8051620008bb816200087f565b919050565b60008060008060808587031215620008d757600080fd5b8451620008e4816200087f565b602086810151919550906001600160401b03808211156200090457600080fd5b818801915088601f8301126200091957600080fd5b8151818111156200092e576200092e62000898565b8060051b604051601f19603f8301168101818110858211171562000956576200095662000898565b60405291825284820192508381018501918b8311156200097557600080fd5b938501935b828510156200099e576200098e85620008ae565b845293850193928501926200097a565b809850505050505050620009b560408601620008ae565b9150620009c560608601620008ae565b905092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215620009f957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000497576200049762000a00565b60006020828403121562000a3f57600080fd5b8151801515811462000a5057600080fd5b9392505050565b8181038181111562000497576200049762000a00565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000aa057818101518382015260200162000a86565b50506000910152565b6000825162000abd81846020870162000a83565b9190910192915050565b602081526000825180602084015262000ae881604085016020870162000a83565b601f01601f19169190910160400192915050565b60805160a05160c05161397262000b79600039600081816104a90152818161173401526121180152600081816104830152818161156501526119ea0152600081816102050152818161025a015281816106e9015281816114850152818161190a01528181611b02015281816120ae015261230301526139726000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80639a4575b9116100ee578063c4bffe2b11610097578063db6327dc11610071578063db6327dc1461046e578063dc0bd97114610481578063e0351e13146104a7578063f2fde38b146104cd57600080fd5b8063c4bffe2b14610433578063c75eea9c14610448578063cf7401f31461045b57600080fd5b8063b0f479a1116100c8578063b0f479a1146103ef578063b79465801461040d578063c0d786551461042057600080fd5b80639a4575b91461034b578063a7cd63b71461036b578063af58d59f1461038057600080fd5b806354c8a4f31161015b57806379ba50971161013557806379ba5097146102ff5780637d54534e146103075780638926f54f1461031a5780638da5cb5b1461032d57600080fd5b806354c8a4f3146102b95780636d3d1a58146102ce57806378a010b2146102ec57600080fd5b806321df0da71161018c57806321df0da714610203578063240028e81461024a578063390775371461029757600080fd5b806301ffc9a7146101b35780630a2fd493146101db578063181f5a77146101fb575b600080fd5b6101c66101c1366004612aa6565b6104e0565b60405190151581526020015b60405180910390f35b6101ee6101e9366004612b05565b6105c5565b6040516101d29190612b84565b6101ee610675565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101d2565b6101c6610258366004612bc4565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b6102aa6102a5366004612be1565b610691565b604051905181526020016101d2565b6102cc6102c7366004612c69565b6107ec565b005b60085473ffffffffffffffffffffffffffffffffffffffff16610225565b6102cc6102fa366004612cd5565b610867565b6102cc6109db565b6102cc610315366004612bc4565b610ad8565b6101c6610328366004612b05565b610b27565b60005473ffffffffffffffffffffffffffffffffffffffff16610225565b61035e610359366004612d58565b610b3e565b6040516101d29190612d93565b610373610be5565b6040516101d29190612df3565b61039361038e366004612b05565b610bf6565b6040516101d2919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610225565b6101ee61041b366004612b05565b610ccb565b6102cc61042e366004612bc4565b610cf6565b61043b610dd1565b6040516101d29190612e4d565b610393610456366004612b05565b610e89565b6102cc610469366004612fb5565b610f5b565b6102cc61047c366004612ffa565b610fe4565b7f0000000000000000000000000000000000000000000000000000000000000000610225565b7f00000000000000000000000000000000000000000000000000000000000000006101c6565b6102cc6104db366004612bc4565b61146a565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061057357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806105bf57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906105f09061303c565b80601f016020809104026020016040519081016040528092919081815260200182805461061c9061303c565b80156106695780601f1061063e57610100808354040283529160200191610669565b820191906000526020600020905b81548152906001019060200180831161064c57829003601f168201915b50505050509050919050565b6040518060600160405280602381526020016139436023913981565b6040805160208101909152600081526106b16106ac8361313a565b61147e565b6040517f40c10f19000000000000000000000000000000000000000000000000000000008152336004820152606083013560248201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906340c10f1990604401600060405180830381600087803b15801561074257600080fd5b505af1158015610756573d6000803e3d6000fd5b5061076b925050506060830160408401612bc4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f084606001356040516107cd91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6107f46116af565b6108618484808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152505060408051602080880282810182019093528782529093508792508691829185019084908082843760009201919091525061173292505050565b50505050565b61086f6116af565b61087883610b27565b6108bf576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b67ffffffffffffffff8316600090815260076020526040812060040180546108e69061303c565b80601f01602080910402602001604051908101604052809291908181526020018280546109129061303c565b801561095f5780601f106109345761010080835404028352916020019161095f565b820191906000526020600020905b81548152906001019060200180831161094257829003601f168201915b5050505067ffffffffffffffff861660009081526007602052604090209192505060040161098e83858361327f565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf8285856040516109cd93929190613399565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016108b6565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610ae06116af565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60006105bf600567ffffffffffffffff84166118e8565b6040805180820190915260608082526020820152610b63610b5e836133fd565b611903565b610b708260600135611acd565b6040516060830135815233907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a26040518060400160405280610bca84602001602081019061041b9190612b05565b81526040805160208181019092526000815291015292915050565b6060610bf16002611b76565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526105bf90611b83565b67ffffffffffffffff811660009081526007602052604090206005018054606091906105f09061303c565b610cfe6116af565b73ffffffffffffffffffffffffffffffffffffffff8116610d4b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610ddf6005611b76565b90506000815167ffffffffffffffff811115610dfd57610dfd612e8f565b604051908082528060200260200182016040528015610e26578160200160208202803683370190505b50905060005b8251811015610e8257828181518110610e4757610e4761349f565b6020026020010151828281518110610e6157610e6161349f565b67ffffffffffffffff90921660209283029190910190910152600101610e2c565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526105bf90611b83565b60085473ffffffffffffffffffffffffffffffffffffffff163314801590610f9b575060005473ffffffffffffffffffffffffffffffffffffffff163314155b15610fd4576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024016108b6565b610fdf838383611c35565b505050565b610fec6116af565b60005b81811015610fdf57600083838381811061100b5761100b61349f565b905060200281019061101d91906134ce565b6110269061350c565b905061103b8160800151826020015115611d1f565b61104e8160a00151826020015115611d1f565b80602001511561134a5780516110709060059067ffffffffffffffff16611e58565b6110b55780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108b6565b60408101515115806110ca5750606081015151155b15611101576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906112e290826135c0565b50606082015160058201906112f790826135c0565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2955061133d94939291906136da565b60405180910390a1611461565b80516113629060059067ffffffffffffffff16611e64565b6113a75780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016108b6565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906114106004830182612a58565b61141e600583016000612a58565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101610fef565b6114726116af565b61147b81611e70565b50565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146115135760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108b6565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156115c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115e59190613773565b1561161c576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116298160200151611f65565b600061163882602001516105c5565b905080516000148061165c575080805190602001208260a001518051906020012014155b15611699578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016108b69190612b84565b6116ab8260200151836060015161208b565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611730576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016108b6565b565b7f0000000000000000000000000000000000000000000000000000000000000000611789576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561181f5760008382815181106117a9576117a961349f565b602002602001015190506117c78160026120d290919063ffffffff16565b156118165760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010161178c565b5060005b8151811015610fdf5760008282815181106118405761184061349f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361188457506118e0565b61188f6002826120f4565b156118de5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611823565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146119985760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016108b6565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611a46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6a9190613773565b15611aa1576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611aae8160400151612116565b611abb8160200151612195565b61147b816020015182606001516122e3565b6040517f9dc29fac000000000000000000000000000000000000000000000000000000008152306004820152602481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639dc29fac90604401600060405180830381600087803b158015611b5b57600080fd5b505af1158015611b6f573d6000803e3d6000fd5b5050505050565b606060006118fc83612327565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c1182606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611bf591906137bf565b85608001516fffffffffffffffffffffffffffffffff16612382565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b611c3e83610b27565b611c80576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024016108b6565b611c8b826000611d1f565b67ffffffffffffffff83166000908152600760205260409020611cae90836123ac565b611cb9816000611d1f565b67ffffffffffffffff83166000908152600760205260409020611cdf90600201826123ac565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b838383604051611d12939291906137d2565b60405180910390a1505050565b815115611de65781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580611d75575060408201516fffffffffffffffffffffffffffffffff16155b15611dae57816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016108b69190613855565b80156116ab576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580611e1f575060208201516fffffffffffffffffffffffffffffffff1615155b156116ab57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016108b69190613855565b60006118fc838361254e565b60006118fc838361259d565b3373ffffffffffffffffffffffffffffffffffffffff821603611eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016108b6565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b611f6e81610b27565b611fb0576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108b6565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa15801561202f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120539190613773565b61147b576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108b6565b67ffffffffffffffff821660009081526007602052604090206116ab90600201827f0000000000000000000000000000000000000000000000000000000000000000612690565b60006118fc8373ffffffffffffffffffffffffffffffffffffffff841661259d565b60006118fc8373ffffffffffffffffffffffffffffffffffffffff841661254e565b7f00000000000000000000000000000000000000000000000000000000000000001561147b57612147600282612a13565b61147b576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024016108b6565b61219e81610b27565b6121e0576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff821660048201526024016108b6565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612259573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227d9190613891565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147b576040517f728fe07b0000000000000000000000000000000000000000000000000000000081523360048201526024016108b6565b67ffffffffffffffff821660009081526007602052604090206116ab90827f0000000000000000000000000000000000000000000000000000000000000000612690565b60608160000180548060200260200160405190810160405280929190818152602001828054801561066957602002820191906000526020600020905b8154815260200190600101908083116123635750505050509050919050565b60006123a18561239284866138ae565b61239c90876138c5565b612a42565b90505b949350505050565b81546000906123d590700100000000000000000000000000000000900463ffffffff16426137bf565b90508015612477576001830154835461241d916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612382565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461249d916fffffffffffffffffffffffffffffffff9081169116612a42565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990611d12908490613855565b6000818152600183016020526040812054612595575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105bf565b5060006105bf565b600081815260018301602052604081205480156126865760006125c16001836137bf565b85549091506000906125d5906001906137bf565b905081811461263a5760008660000182815481106125f5576125f561349f565b90600052602060002001549050808760000184815481106126185761261861349f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061264b5761264b6138d8565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105bf565b60009150506105bf565b825474010000000000000000000000000000000000000000900460ff1615806126b7575081155b156126c157505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061270790700100000000000000000000000000000000900463ffffffff16426137bf565b905080156127c75781831115612749576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546127839083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612382565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b8482101561287e5773ffffffffffffffffffffffffffffffffffffffff8416612826576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016108b6565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016108b6565b848310156129915760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906128c290826137bf565b6128cc878a6137bf565b6128d691906138c5565b6128e09190613907565b905073ffffffffffffffffffffffffffffffffffffffff8616612939576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016108b6565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016108b6565b61299b85846137bf565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156118fc565b6000818310612a5157816118fc565b5090919050565b508054612a649061303c565b6000825580601f10612a74575050565b601f01602090049060005260206000209081019061147b91905b80821115612aa25760008155600101612a8e565b5090565b600060208284031215612ab857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146118fc57600080fd5b803567ffffffffffffffff81168114612b0057600080fd5b919050565b600060208284031215612b1757600080fd5b6118fc82612ae8565b6000815180845260005b81811015612b4657602081850181015186830182015201612b2a565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006118fc6020830184612b20565b73ffffffffffffffffffffffffffffffffffffffff8116811461147b57600080fd5b8035612b0081612b97565b600060208284031215612bd657600080fd5b81356118fc81612b97565b600060208284031215612bf357600080fd5b813567ffffffffffffffff811115612c0a57600080fd5b820161010081850312156118fc57600080fd5b60008083601f840112612c2f57600080fd5b50813567ffffffffffffffff811115612c4757600080fd5b6020830191508360208260051b8501011115612c6257600080fd5b9250929050565b60008060008060408587031215612c7f57600080fd5b843567ffffffffffffffff80821115612c9757600080fd5b612ca388838901612c1d565b90965094506020870135915080821115612cbc57600080fd5b50612cc987828801612c1d565b95989497509550505050565b600080600060408486031215612cea57600080fd5b612cf384612ae8565b9250602084013567ffffffffffffffff80821115612d1057600080fd5b818601915086601f830112612d2457600080fd5b813581811115612d3357600080fd5b876020828501011115612d4557600080fd5b6020830194508093505050509250925092565b600060208284031215612d6a57600080fd5b813567ffffffffffffffff811115612d8157600080fd5b820160a081850312156118fc57600080fd5b602081526000825160406020840152612daf6060840182612b20565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152612dea8282612b20565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e4157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612e0f565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612e4157835167ffffffffffffffff1683529284019291840191600101612e69565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715612ee257612ee2612e8f565b60405290565b60405160c0810167ffffffffffffffff81118282101715612ee257612ee2612e8f565b801515811461147b57600080fd5b8035612b0081612f0b565b80356fffffffffffffffffffffffffffffffff81168114612b0057600080fd5b600060608284031215612f5657600080fd5b6040516060810181811067ffffffffffffffff82111715612f7957612f79612e8f565b6040529050808235612f8a81612f0b565b8152612f9860208401612f24565b6020820152612fa960408401612f24565b60408201525092915050565b600080600060e08486031215612fca57600080fd5b612fd384612ae8565b9250612fe28560208601612f44565b9150612ff18560808601612f44565b90509250925092565b6000806020838503121561300d57600080fd5b823567ffffffffffffffff81111561302457600080fd5b61303085828601612c1d565b90969095509350505050565b600181811c9082168061305057607f821691505b602082108103613089577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f8301126130a057600080fd5b813567ffffffffffffffff808211156130bb576130bb612e8f565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561310157613101612e8f565b8160405283815286602085880101111561311a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000610100823603121561314d57600080fd5b613155612ebe565b823567ffffffffffffffff8082111561316d57600080fd5b6131793683870161308f565b835261318760208601612ae8565b602084015261319860408601612bb9565b6040840152606085013560608401526131b360808601612bb9565b608084015260a08501359150808211156131cc57600080fd5b6131d83683870161308f565b60a084015260c08501359150808211156131f157600080fd5b6131fd3683870161308f565b60c084015260e085013591508082111561321657600080fd5b506132233682860161308f565b60e08301525092915050565b601f821115610fdf576000816000526020600020601f850160051c810160208610156132585750805b601f850160051c820191505b8181101561327757828155600101613264565b505050505050565b67ffffffffffffffff83111561329757613297612e8f565b6132ab836132a5835461303c565b8361322f565b6000601f8411600181146132fd57600085156132c75750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611b6f565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561334c578685013582556020948501946001909201910161332c565b5086821015613387577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040815260006133ac6040830186612b20565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561340f57600080fd5b60405160a0810167ffffffffffffffff828210818311171561343357613433612e8f565b81604052843591508082111561344857600080fd5b506134553682860161308f565b82525061346460208401612ae8565b6020820152604083013561347781612b97565b604082015260608381013590820152608083013561349481612b97565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261350257600080fd5b9190910192915050565b6000610140823603121561351f57600080fd5b613527612ee8565b61353083612ae8565b815261353e60208401612f19565b6020820152604083013567ffffffffffffffff8082111561355e57600080fd5b61356a3683870161308f565b6040840152606085013591508082111561358357600080fd5b506135903682860161308f565b6060830152506135a33660808501612f44565b60808201526135b53660e08501612f44565b60a082015292915050565b815167ffffffffffffffff8111156135da576135da612e8f565b6135ee816135e8845461303c565b8461322f565b602080601f831160018114613641576000841561360b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613277565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561368e5788860151825594840194600190910190840161366f565b50858210156136ca57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff871683528060208401526136fe81840187612b20565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff908116606087015290870151166080850152915061373c9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152612dea565b60006020828403121561378557600080fd5b81516118fc81612f0b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156105bf576105bf613790565b67ffffffffffffffff8416815260e0810161381e60208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526123a4565b606081016105bf82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156138a357600080fd5b81516118fc81612b97565b80820281158282048414176105bf576105bf613790565b808201808211156105bf576105bf613790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008261393d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fe4275726e5769746846726f6d4d696e74546f6b656e506f6f6c20312e352e302d646576a164736f6c6343000818000a",
}
var BurnWithFromMintTokenPoolABI = BurnWithFromMintTokenPoolMetaData.ABI
@@ -310,6 +310,28 @@ func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetCur
return _BurnWithFromMintTokenPool.Contract.GetCurrentOutboundRateLimiterState(&_BurnWithFromMintTokenPool.CallOpts, remoteChainSelector)
}
+func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getRateLimitAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnWithFromMintTokenPool.Contract.GetRateLimitAdmin(&_BurnWithFromMintTokenPool.CallOpts)
+}
+
+func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) {
+ return _BurnWithFromMintTokenPool.Contract.GetRateLimitAdmin(&_BurnWithFromMintTokenPool.CallOpts)
+}
+
func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolCaller) GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
var out []interface{}
err := _BurnWithFromMintTokenPool.contract.Call(opts, &out, "getRemotePool", remoteChainSelector)
@@ -624,6 +646,18 @@ func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) Se
return _BurnWithFromMintTokenPool.Contract.SetChainRateLimiterConfig(&_BurnWithFromMintTokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig)
}
+func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin)
+}
+
+func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintTokenPool.Contract.SetRateLimitAdmin(&_BurnWithFromMintTokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _BurnWithFromMintTokenPool.Contract.SetRateLimitAdmin(&_BurnWithFromMintTokenPool.TransactOpts, rateLimitAdmin)
+}
+
func (_BurnWithFromMintTokenPool *BurnWithFromMintTokenPoolTransactor) SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
return _BurnWithFromMintTokenPool.contract.Transact(opts, "setRemotePool", remoteChainSelector, remotePoolAddress)
}
@@ -2644,6 +2678,8 @@ type BurnWithFromMintTokenPoolInterface interface {
GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error)
+ GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error)
+
GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
@@ -2678,6 +2714,8 @@ type BurnWithFromMintTokenPoolInterface interface {
SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error)
+ SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error)
+
SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
index 31b51f977f..2a4605bfd2 100644
--- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
+++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
@@ -49,8 +49,6 @@ type EVM2EVMOffRampDynamicConfig struct {
MaxNumberOfTokensPerMsg uint16
Router common.Address
PriceRegistry common.Address
- MaxPoolReleaseOrMintGas uint32
- MaxTokenTransferGas uint32
}
type EVM2EVMOffRampRateLimitToken struct {
@@ -106,8 +104,8 @@ type RateLimiterTokenBucket struct {
}
var EVM2EVMOffRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"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\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"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\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"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\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101a06040523480156200001257600080fd5b5060405162005f9938038062005f998339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e05161010051610120516101405161016051610180516158d0620006c9600039600081816102ec01528181611b12015261315f0152600081816102bd01528181611aeb0152611d9d01526000818161028e01528181610ed201528181610f3701528181611ac40152818161234501526123af01526000611f3c01526000818161025f0152611a9a0152600081816101ff0152611a4801526000818161022f01528181611a7201528181611d5a01528181612dc1015261326e0152600081816101d001528181611a1a015261201c015260008181611cb40152611d0001526158d06000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063f077b59211610066578063f077b59214610646578063f2fde38b1461065c578063f52121a51461066f57600080fd5b8063afcb95d714610600578063b1dc65a414610620578063c92b28321461063357600080fd5b8063856c8247116100bd578063856c8247146105b0578063873504d7146105dc5780638da5cb5b146105ef57600080fd5b806381ff70481461057257806385572ffb146105a257600080fd5b8063599f64311161013a578063740f415011610114578063740f4150146104615780637437ff9f1461047457806379ba50971461056a57600080fd5b8063599f643114610414578063666cab8d14610439578063704b6c021461044e57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b578063546719cd146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103299190613fbd565b60405180910390f35b610345610340366004614053565b610682565b60405161032991906140b3565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b6040516103299190614111565b6103ae6103a9366004614380565b6106fd565b005b6103b8610af1565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610441610ba6565b6040516103299190614492565b6103ae61045c3660046144a5565b610c08565b6103ae61046f366004614905565b610cd1565b61055d6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506040805160e081018252600a5463ffffffff808216835264010000000082048116602084015261ffff68010000000000000000830416938301939093526001600160a01b036a010000000000000000000090910481166060830152600b549081166080830152740100000000000000000000000000000000000000008104831660a08301527801000000000000000000000000000000000000000000000000900490911660c082015290565b60405161032991906149c0565b6103ae610dc3565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae610182366004614a2e565b6105c36105be3660046144a5565b610ea6565b60405167ffffffffffffffff9091168152602001610329565b6103ae6105ea366004614afa565b610fa9565b6000546001600160a01b0316610421565b604080516001815260006020820181905291810191909152606001610329565b6103ae61062e366004614ba3565b611177565b6103ae610641366004614ca8565b611382565b61064e6113ed565b604051610329929190614cf8565b6103ae61066a3660046144a5565b611513565b6103ae61067d366004614d1d565b611524565b600061069060016004614da6565b600261069d608085614de8565b67ffffffffffffffff166106b19190614e0f565b601060006106c0608087614e26565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106f7576106f7614070565b92915050565b84518460ff16601f82111561074a5760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190614e4d565b60405180910390fd5b806000036107875760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190614e4d565b61078f6117c4565b6107988561183a565b60095460005b8181101561080f5760086000600983815481106107bd576107bd614e67565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161079e565b5050865160005b818110156109b257600089828151811061083257610832614e67565b602002602001015190506000600281111561084f5761084f614070565b6001600160a01b038216600090815260086020526040902054610100900460ff16600281111561088157610881614070565b146108bb5760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016107419190614e4d565b6001600160a01b0381166108fb576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561099e5761099e614070565b021790555090505050806001019050610816565b5087516109c69060099060208b0190613f2b565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a161717905560078054610a4c914691309190600090610a1e9063ffffffff16614e96565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611b72565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610add9487949293918316921691909117908f908f908f908f908f908f90614eb9565b60405180910390a150505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610ba190611bff565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610bfe57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610be0575b5050505050905090565b6000546001600160a01b03163314801590610c2e57506002546001600160a01b03163314155b15610c65576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b610cd9611cb1565b81515181518114610d16576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610db3576000838281518110610d3557610d35614e67565b6020026020010151905080600014610daa578451805183908110610d5b57610d5b614e67565b602002602001015160800151811015610daa576040517f085e39cf0000000000000000000000000000000000000000000000000000000081526004810183905260248101829052604401610741565b50600101610d19565b50610dbe8383611d32565b505050565b6001546001600160a01b03163314610e37576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610741565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106f7577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106f7576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015610f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa29190614f4f565b9392505050565b610fb16117c4565b60005b825181101561108457610fee838281518110610fd257610fd2614e67565b602002602001015160200151600c6127b590919063ffffffff16565b1561107c577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d5878283828151811061102657611026614e67565b60200260200101516000015184838151811061104457611044614e67565b6020026020010151602001516040516110739291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101610fb4565b5060005b8151811015610dbe576110e18282815181106110a6576110a6614e67565b6020026020010151602001518383815181106110c4576110c4614e67565b602002602001015160000151600c6127ca9092919063ffffffff16565b1561116f577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a82828151811061111957611119614e67565b60200260200101516000015183838151811061113757611137614e67565b6020026020010151602001516040516111669291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611088565b61118187876127e8565b6005548835908082146111ca576040517f93df584c0000000000000000000000000000000000000000000000000000000081526004810182905260248101839052604401610741565b6111d2611cb1565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561125a5761125a614070565b600281111561126b5761126b614070565b905250905060028160200151600281111561128857611288614070565b1480156112c257506009816000015160ff16815481106112aa576112aa614e67565b6000918252602090912001546001600160a01b031633145b6112f8576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000611306856020614e0f565b611311886020614e0f565b61131d8b610144614f6c565b6113279190614f6c565b6113319190614f6c565b9050368114611375576040517f8e1192e100000000000000000000000000000000000000000000000000000000815260048101829052366024820152604401610741565b5050505050505050505050565b6000546001600160a01b031633148015906113a857506002546001600160a01b03163314155b156113df576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113ea60038261280f565b50565b60608060006113fc600c6129f4565b90508067ffffffffffffffff81111561141757611417614124565b604051908082528060200260200182016040528015611440578160200160208202803683370190505b5092508067ffffffffffffffff81111561145c5761145c614124565b604051908082528060200260200182016040528015611485578160200160208202803683370190505b50915060005b8181101561150d576000806114a1600c846129ff565b91509150808684815181106114b8576114b8614e67565b60200260200101906001600160a01b031690816001600160a01b031681525050818584815181106114eb576114eb614e67565b6001600160a01b0390921660209283029190910190910152505060010161148b565b50509091565b61151b6117c4565b6113ea81612a1d565b33301461155d576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516000808252602082019092528161159a565b60408051808201909152600080825260208201528152602001906001900390816115735790505b5061014084015151909150156115fa576115f783610140015184602001516040516020016115d791906001600160a01b0391909116815260200190565b604051602081830303815290604052856040015186610160015186612af8565b90505b6101208301515115801561161057506080830151155b80611627575060408301516001600160a01b03163b155b8061166757506040830151611665906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612c29565b155b1561167157505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808861018001518152602001886000015167ffffffffffffffff16815260200188602001516040516020016116e991906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001886101200151815260200186815250611388886080015189604001516040518563ffffffff1660e01b81526004016117389493929190614fc4565b6000604051808303816000875af1158015611757573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261177f91908101906150ce565b5091509150816117bd57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016107419190614111565b5050505050565b6000546001600160a01b03163314611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610741565b565b6000818060200190518101906118509190615147565b60608101519091506001600160a01b0316611897576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a80546020808501516040808701516060808901516001600160a01b039081166a0100000000000000000000027fffff0000000000000000000000000000000000000000ffffffffffffffffffff61ffff9094166801000000000000000002939093167fffff00000000000000000000000000000000000000000000ffffffffffffffff63ffffffff968716640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009099169a87169a909a1797909717989098169590951717909455608080870151600b805460a0808b015160c0808d015188167801000000000000000000000000000000000000000000000000027fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff9290981674010000000000000000000000000000000000000000027fffffffffffffffff000000000000000000000000000000000000000000000000909416958c16959095179290921791909116949094179055855160e0810187527f00000000000000000000000000000000000000000000000000000000000000008816815267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116958201959095527f0000000000000000000000000000000000000000000000000000000000000000909416848701527f00000000000000000000000000000000000000000000000000000000000000008716948401949094527f00000000000000000000000000000000000000000000000000000000000000008616908301527f00000000000000000000000000000000000000000000000000000000000000008516908201527f000000000000000000000000000000000000000000000000000000000000000090931690830152517ff02fcc22535d64d92d17b995475893d63edd51da163fed74a6ee9b4bc4895cc491611b669184906151e2565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611b96999897969594939291906152be565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611c8d82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611c719190614da6565b85608001516fffffffffffffffffffffffffffffffff16612c45565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b467f000000000000000000000000000000000000000000000000000000000000000014611838576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152466024820152604401610741565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611dec573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e109190615346565b15611e47576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611e84576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611ec2576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611edd57611edd614124565b604051908082528060200260200182016040528015611f06578160200160208202803683370190505b50905060005b82811015611fde57600085600001518281518110611f2c57611f2c614e67565b60200260200101519050611f60817f0000000000000000000000000000000000000000000000000000000000000000612c64565b838381518110611f7257611f72614e67565b602002602001018181525050806101800151838381518110611f9657611f96614e67565b602002602001015114611fd5576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611f0c565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263320488759261205292879291600401615394565b602060405180830381865afa15801561206f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209391906153ca565b9050806000036120cf576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156127ac576000876000015182815181106120f6576120f6614e67565b60200260200101519050600061210f8260600151610682565b9050600281600381111561212557612125614070565b0361216c57816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a250506127a4565b600081600381111561218057612180614070565b148061219d5750600381600381111561219b5761219b614070565b145b6121e55760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b83156122a257600a5460009063ffffffff166122018742614da6565b11905080806122215750600382600381111561221f5761221f614070565b145b612257576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061226957612269614e67565b602002602001015160001461229c5788848151811061228a5761228a614e67565b60200260200101518360800181815250505b506122ff565b60008160038111156122b6576122b6614070565b146122ff5760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b60c082015167ffffffffffffffff161561257e576020808301516001600160a01b03166000908152600f909152604081205467ffffffffffffffff16908190036124e9577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156124e95760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156123f8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061241c9190614f4f565b60c084015190915067ffffffffffffffff166124398260016153e3565b67ffffffffffffffff16146124995782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a35050506127a4565b6020838101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b60008260038111156124fd576124fd614070565b0361257c5760c083015167ffffffffffffffff1661251c8260016153e3565b67ffffffffffffffff161461257c5782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a35050506127a4565b505b60008960200151848151811061259657612596614e67565b602002602001015190506125c28360600151846000015185610140015151866101200151518551612dbf565b6125d183606001516001612f39565b6000806125de8584612fe3565b915091506125f0856060015183612f39565b861561265c57600382600381111561260a5761260a614070565b0361265c57600084600381111561262357612623614070565b1461265c57806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016107419190614111565b600282600381111561267057612670614070565b146126c857600382600381111561268957612689614070565b146126c8578460600151826040517f9e261603000000000000000000000000000000000000000000000000000000008152600401610741929190615404565b60c085015167ffffffffffffffff16156127505760008460038111156126f0576126f0614070565b03612750576020808601516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff169161272883615422565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef65848460405161279692919061543f565b60405180910390a350505050505b6001016120d6565b50505050505050565b6000610fa2836001600160a01b0384166130ac565b60006127e0846001600160a01b038516846130b8565b949350505050565b61280b6127f78284018461545f565b604080516000815260208101909152611d32565b5050565b815460009061283890700100000000000000000000000000000000900463ffffffff1642614da6565b905080156128da5760018301548354612880916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612c45565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612900916fffffffffffffffffffffffffffffffff90811691166130ce565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906129e79084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106f7826130e4565b6000808080612a0e86866130ef565b909450925050505b9250929050565b336001600160a01b03821603612a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610741565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612c0e57612b75888281518110612b1b57612b1b614e67565b6020026020010151602001518888888581518110612b3b57612b3b614e67565b6020026020010151806020019051810190612b569190615494565b888681518110612b6857612b68614e67565b60200260200101516130fe565b838281518110612b8757612b87614e67565b6020026020010181905250612bc3838281518110612ba757612ba7614e67565b602002602001015160000151600c61352190919063ffffffff16565b15612c0657612bf9838281518110612bdd57612bdd614e67565b6020908102919091010151600b546001600160a01b0316613536565b612c039083614f6c565b91505b600101612afd565b508015612c1e57612c1e81613657565b505b95945050505050565b6000612c3483613664565b8015610fa25750610fa283836136c8565b6000612c2085612c558486614e0f565b612c5f9087614f6c565b6130ce565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612cfa9897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612d339190615549565b60405160208183030381529060405280519060200120876101600151604051602001612d5f91906155b6565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612e38576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610741565b600a5468010000000000000000900461ffff16831115612e90576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610741565b808314612ed5576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610741565b600a54640100000000900463ffffffff168211156117bd57600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff16600482015260248101839052604401610741565b60006002612f48608085614de8565b67ffffffffffffffff16612f5c9190614e0f565b90506000601081612f6e608087614e26565b67ffffffffffffffff168152602081019190915260400160002054905081612f9860016004614da6565b901b191681836003811115612faf57612faf614070565b901b178060106000612fc2608088614e26565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a59061302790879087906004016155c9565b600060405180830381600087803b15801561304157600080fd5b505af1925050508015613052575060015b613091573d808015613080576040519150601f19603f3d011682016040523d82523d6000602084013e613085565b606091505b50600392509050612a16565b50506040805160208101909152600081526002909250929050565b6000610fa28383613797565b60006127e084846001600160a01b0385166137b4565b60008183106130dd5781610fa2565b5090919050565b60006106f7826137d1565b6000808080612a0e86866137dc565b604080518082019091526000808252602082015260006131218460200151613807565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa1580156131a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131ca919061572c565b90506001600160a01b038116158061321257506132106001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612c29565b155b15613254576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b0382166004820152602401610741565b60008061336e6040518061010001604052808b81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018a6001600160a01b031681526020018c8152602001866001600160a01b031681526020018960000151815260200189604001518152602001888152506040516024016132e89190615749565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3907753700000000000000000000000000000000000000000000000000000000179052600b54859063ffffffff740100000000000000000000000000000000000000009091041661138860846138ad565b5091509150816133ac57806040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107419190614111565b80516020146133f45780516040517f78ef8024000000000000000000000000000000000000000000000000000000008152602060048201526024810191909152604401610741565b60008180602001905181019061340a91906153ca565b6040516001600160a01b038b166024820152604481018290529091506134b79060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052600b54879063ffffffff78010000000000000000000000000000000000000000000000009091041661138860846138ad565b509093509150826134f657816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016107419190614111565b604080518082019091526001600160a01b039095168552602085015250919250505095945050505050565b6000610fa2836001600160a01b0384166139d3565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa15801561359c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135c09190615820565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036136295783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610741565b60208401516127e0907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906139df565b6113ea6003826000613a1c565b6000613690827f01ffc9a7000000000000000000000000000000000000000000000000000000006136c8565b80156106f757506136c1827fffffffff000000000000000000000000000000000000000000000000000000006136c8565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613780575060208210155b801561378c5750600081115b979650505050505050565b60008181526002830160205260408120819055610fa28383613d6b565b600082815260028401602052604081208290556127e08484613d77565b60006106f782613d83565b600080806137ea8585613d8d565b600081815260029690960160205260409095205494959350505050565b6000815160201461384657816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016107419190614111565b60008280602001905181019061385c91906153ca565b90506001600160a01b03811180613874575061040081105b156106f757826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016107419190614111565b6000606060008361ffff1667ffffffffffffffff8111156138d0576138d0614124565b6040519080825280601f01601f1916602001820160405280156138fa576020820181803683370190505b509150863b61392d577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613960577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613999577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156139bc5750835b808352806000602085013e50955095509592505050565b6000610fa28383613d99565b6000670de0b6b3a7640000613a12837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616614e0f565b610fa29190615880565b825474010000000000000000000000000000000000000000900460ff161580613a43575081155b15613a4d57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090613a9390700100000000000000000000000000000000900463ffffffff1642614da6565b90508015613b535781831115613ad5576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613b0f9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612c45565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613bf0576001600160a01b038416613ba5576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610741565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610741565b84831015613ce95760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613c349082614da6565b613c3e878a614da6565b613c489190614f6c565b613c529190615880565b90506001600160a01b038616613c9e576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610741565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610741565b613cf38584614da6565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610fa28383613db8565b6000610fa28383613eb2565b60006106f7825490565b6000610fa28383613f01565b6000610fa2838360008181526001830160205260408120541515610fa2565b60008181526001830160205260408120548015613ea1576000613ddc600183614da6565b8554909150600090613df090600190614da6565b9050818114613e55576000866000018281548110613e1057613e10614e67565b9060005260206000200154905080876000018481548110613e3357613e33614e67565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613e6657613e66615894565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106f7565b60009150506106f7565b5092915050565b6000818152600183016020526040812054613ef9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106f7565b5060006106f7565b6000826000018281548110613f1857613f18614e67565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215613f98579160200282015b82811115613f9857825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613f4b565b50613fa4929150613fa8565b5090565b5b80821115613fa45760008155600101613fa9565b60e081016106f782846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff811681146113ea57600080fd5b803561404e8161402d565b919050565b60006020828403121561406557600080fd5b8135610fa28161402d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600481106140af576140af614070565b9052565b602081016106f7828461409f565b60005b838110156140dc5781810151838201526020016140c4565b50506000910152565b600081518084526140fd8160208601602086016140c1565b601f01601f19169290920160200192915050565b602081526000610fa260208301846140e5565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561417657614176614124565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561417657614176614124565b6040516080810167ffffffffffffffff8111828210171561417657614176614124565b6040516060810167ffffffffffffffff8111828210171561417657614176614124565b60405160e0810167ffffffffffffffff8111828210171561417657614176614124565b604051601f8201601f1916810167ffffffffffffffff8111828210171561423257614232614124565b604052919050565b600067ffffffffffffffff82111561425457614254614124565b5060051b60200190565b6001600160a01b03811681146113ea57600080fd5b803561404e8161425e565b600082601f83011261428f57600080fd5b813560206142a461429f8361423a565b614209565b8083825260208201915060208460051b8701019350868411156142c657600080fd5b602086015b848110156142eb5780356142de8161425e565b83529183019183016142cb565b509695505050505050565b803560ff8116811461404e57600080fd5b600067ffffffffffffffff82111561432157614321614124565b50601f01601f191660200190565b600082601f83011261434057600080fd5b813561434e61429f82614307565b81815284602083860101111561436357600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561439957600080fd5b863567ffffffffffffffff808211156143b157600080fd5b6143bd8a838b0161427e565b975060208901359150808211156143d357600080fd5b6143df8a838b0161427e565b96506143ed60408a016142f6565b9550606089013591508082111561440357600080fd5b61440f8a838b0161432f565b945061441d60808a01614043565b935060a089013591508082111561443357600080fd5b5061444089828a0161432f565b9150509295509295509295565b60008151808452602080850194506020840160005b838110156144875781516001600160a01b031687529582019590820190600101614462565b509495945050505050565b602081526000610fa2602083018461444d565b6000602082840312156144b757600080fd5b8135610fa28161425e565b80151581146113ea57600080fd5b803561404e816144c2565b600082601f8301126144ec57600080fd5b813560206144fc61429f8361423a565b82815260069290921b8401810191818101908684111561451b57600080fd5b8286015b848110156142eb57604081890312156145385760008081fd5b614540614153565b813561454b8161425e565b8152818501358582015283529183019160400161451f565b600082601f83011261457457600080fd5b8135602061458461429f8361423a565b82815260059290921b840181019181810190868411156145a357600080fd5b8286015b848110156142eb57803567ffffffffffffffff8111156145c75760008081fd5b6145d58986838b010161432f565b8452509183019183016145a7565b60006101a082840312156145f657600080fd5b6145fe61417c565b905061460982614043565b815261461760208301614273565b602082015261462860408301614273565b604082015261463960608301614043565b60608201526080820135608082015261465460a083016144d0565b60a082015261466560c08301614043565b60c082015261467660e08301614273565b60e082015261010082810135908201526101208083013567ffffffffffffffff808211156146a357600080fd5b6146af8683870161432f565b838501526101409250828501359150808211156146cb57600080fd5b6146d7868387016144db565b838501526101609250828501359150808211156146f357600080fd5b5061470085828601614563565b82840152505061018080830135818301525092915050565b600082601f83011261472957600080fd5b8135602061473961429f8361423a565b82815260059290921b8401810191818101908684111561475857600080fd5b8286015b848110156142eb57803567ffffffffffffffff81111561477c5760008081fd5b61478a8986838b0101614563565b84525091830191830161475c565b600082601f8301126147a957600080fd5b813560206147b961429f8361423a565b8083825260208201915060208460051b8701019350868411156147db57600080fd5b602086015b848110156142eb57803583529183019183016147e0565b60006080828403121561480957600080fd5b6148116141a0565b9050813567ffffffffffffffff8082111561482b57600080fd5b818401915084601f83011261483f57600080fd5b8135602061484f61429f8361423a565b82815260059290921b8401810191818101908884111561486e57600080fd5b8286015b848110156148a65780358681111561488a5760008081fd5b6148988b86838b01016145e3565b845250918301918301614872565b50865250858101359350828411156148bd57600080fd5b6148c987858801614718565b908501525060408401359150808211156148e257600080fd5b506148ef84828501614798565b6040830152506060820135606082015292915050565b6000806040838503121561491857600080fd5b823567ffffffffffffffff8082111561493057600080fd5b61493c868387016147f7565b935060209150818501358181111561495357600080fd5b85019050601f8101861361496657600080fd5b803561497461429f8261423a565b81815260059190911b8201830190838101908883111561499357600080fd5b928401925b828410156149b157833582529284019290840190614998565b80955050505050509250929050565b60e081016106f7828463ffffffff80825116835280602083015116602084015261ffff604083015116604084015260608201516001600160a01b03808216606086015280608085015116608086015250508060a08301511660a08401528060c08301511660c0840152505050565b600060208284031215614a4057600080fd5b813567ffffffffffffffff811115614a5757600080fd5b820160a08185031215610fa257600080fd5b600082601f830112614a7a57600080fd5b81356020614a8a61429f8361423a565b82815260069290921b84018101918181019086841115614aa957600080fd5b8286015b848110156142eb5760408189031215614ac65760008081fd5b614ace614153565b8135614ad98161425e565b815281850135614ae88161425e565b81860152835291830191604001614aad565b60008060408385031215614b0d57600080fd5b823567ffffffffffffffff80821115614b2557600080fd5b614b3186838701614a69565b93506020850135915080821115614b4757600080fd5b50614b5485828601614a69565b9150509250929050565b60008083601f840112614b7057600080fd5b50813567ffffffffffffffff811115614b8857600080fd5b6020830191508360208260051b8501011115612a1657600080fd5b60008060008060008060008060e0898b031215614bbf57600080fd5b606089018a811115614bd057600080fd5b8998503567ffffffffffffffff80821115614bea57600080fd5b818b0191508b601f830112614bfe57600080fd5b813581811115614c0d57600080fd5b8c6020828501011115614c1f57600080fd5b6020830199508098505060808b0135915080821115614c3d57600080fd5b614c498c838d01614b5e565b909750955060a08b0135915080821115614c6257600080fd5b50614c6f8b828c01614b5e565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff8116811461404e57600080fd5b600060608284031215614cba57600080fd5b614cc26141c3565b8235614ccd816144c2565b8152614cdb60208401614c88565b6020820152614cec60408401614c88565b60408201529392505050565b604081526000614d0b604083018561444d565b8281036020840152612c20818561444d565b60008060408385031215614d3057600080fd5b823567ffffffffffffffff80821115614d4857600080fd5b614d54868387016145e3565b93506020850135915080821115614d6a57600080fd5b50614b5485828601614563565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106f7576106f7614d77565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614e0357614e03614db9565b92169190910692915050565b80820281158282048414176106f7576106f7614d77565b600067ffffffffffffffff80841680614e4157614e41614db9565b92169190910492915050565b6020810160038310614e6157614e61614070565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818103614eaf57614eaf614d77565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614ee98184018a61444d565b90508281036080840152614efd818961444d565b905060ff871660a084015282810360c0840152614f1a81876140e5565b905067ffffffffffffffff851660e0840152828103610100840152614f3f81856140e5565b9c9b505050505050505050505050565b600060208284031215614f6157600080fd5b8151610fa28161402d565b808201808211156106f7576106f7614d77565b60008151808452602080850194506020840160005b8381101561448757815180516001600160a01b031688528301518388015260409096019590820190600101614f94565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614fff6101208401826140e5565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e086015261503b83836140e5565b92506080890151915080858403016101008601525061505a8282614f7f565b9250505061506e602083018661ffff169052565b836040830152612c2060608301846001600160a01b03169052565b600082601f83011261509a57600080fd5b81516150a861429f82614307565b8181528460208386010111156150bd57600080fd5b6127e08260208301602087016140c1565b6000806000606084860312156150e357600080fd5b83516150ee816144c2565b602085015190935067ffffffffffffffff81111561510b57600080fd5b61511786828701615089565b925050604084015190509250925092565b805163ffffffff8116811461404e57600080fd5b805161404e8161425e565b600060e0828403121561515957600080fd5b6151616141e6565b61516a83615128565b815261517860208401615128565b6020820152604083015161ffff8116811461519257600080fd5b60408201526151a36060840161513c565b60608201526151b46080840161513c565b60808201526151c560a08401615128565b60a08201526151d660c08401615128565b60c08201529392505050565b6101c0810161525382856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e084015260208401518116610100840152604084015161ffff1661012084015260608401516001600160a01b0390811661014085015260808501511661016084015260a0840151811661018084015260c0840151166101a0830152610fa2565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526152f88285018b61444d565b9150838203608085015261530c828a61444d565b915060ff881660a085015283820360c085015261532982886140e5565b90861660e08501528381036101008501529050614f3f81856140e5565b60006020828403121561535857600080fd5b8151610fa2816144c2565b60008151808452602080850194506020840160005b8381101561448757815187529582019590820190600101615378565b6060815260006153a76060830186615363565b82810360208401526153b98186615363565b915050826040830152949350505050565b6000602082840312156153dc57600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115613eab57613eab614d77565b67ffffffffffffffff8316815260408101610fa2602083018461409f565b600067ffffffffffffffff808316818103614eaf57614eaf614d77565b615449818461409f565b6040602082015260006127e060408301846140e5565b60006020828403121561547157600080fd5b813567ffffffffffffffff81111561548857600080fd5b6127e0848285016147f7565b6000602082840312156154a657600080fd5b815167ffffffffffffffff808211156154be57600080fd5b90830190606082860312156154d257600080fd5b6154da6141c3565b8251828111156154e957600080fd5b6154f587828601615089565b82525060208301518281111561550a57600080fd5b61551687828601615089565b60208301525060408301518281111561552e57600080fd5b61553a87828601615089565b60408301525095945050505050565b602081526000610fa26020830184614f7f565b60008282518085526020808601955060208260051b8401016020860160005b848110156155a957601f198684030189526155978383516140e5565b9884019892509083019060010161557b565b5090979650505050505050565b602081526000610fa2602083018461555c565b604081526155e460408201845167ffffffffffffffff169052565b6000602084015161560060608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006156618185018367ffffffffffffffff169052565b60e0860151915061012061567f818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a061016081818701526156af6101e08701856140e5565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526156ee8686614f7f565b9550828a01519450818887030184890152615709868661555c565b9550808a01516101c089015250505050508281036020840152612c20818561555c565b60006020828403121561573e57600080fd5b8151610fa28161425e565b60208152600082516101008060208501526157686101208501836140e5565b91506020850151615785604086018267ffffffffffffffff169052565b5060408501516001600160a01b0381166060860152506060850151608085015260808501516157bf60a08601826001600160a01b03169052565b5060a0850151601f19808685030160c08701526157dc84836140e5565b935060c08701519150808685030160e08701526157f984836140e5565b935060e087015191508086850301838701525061581683826140e5565b9695505050505050565b60006040828403121561583257600080fd5b61583a614153565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461586657600080fd5b815261587460208401615128565b60208201529392505050565b60008261588f5761588f614db9565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"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\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"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\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"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\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101a06040523480156200001257600080fd5b5060405162005e6138038062005e618339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051615798620006c9600039600081816102ec01528181611a52015261309e0152600081816102bd01528181611a2a0152611cdc01526000818161028e01528181610e7f01528181610ee401528181611a000152818161228401526122ee01526000611e7b01526000818161025f01526119d60152600081816101ff015261197a01526000818161022f015281816119ae01528181611c9901528181612d0001526131af0152600081816101d0015281816119550152611f5b015260008181611bf30152611c3f01526157986000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063f077b59211610066578063f077b592146105f3578063f2fde38b14610609578063f52121a51461061c57600080fd5b8063afcb95d7146105ad578063b1dc65a4146105cd578063c92b2832146105e057600080fd5b8063856c8247116100bd578063856c82471461055d578063873504d7146105895780638da5cb5b1461059c57600080fd5b806381ff70481461051f57806385572ffb1461054f57600080fd5b8063599f64311161013a578063740f415011610114578063740f4150146104615780637437ff9f1461047457806379ba50971461051757600080fd5b8063599f643114610414578063666cab8d14610439578063704b6c021461044e57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b578063546719cd146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103299190613ed9565b60405180910390f35b610345610340366004613f6f565b61062f565b6040516103299190613fcf565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b604051610329919061402d565b6103ae6103a9366004614256565b6106aa565b005b6103b8610a9e565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610441610b53565b6040516103299190614368565b6103ae61045c36600461437b565b610bb5565b6103ae61046f3660046147db565b610c7e565b61050a6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff8082168352640100000000820416602083015268010000000000000000810461ffff16928201929092526a01000000000000000000009091046001600160a01b039081166060830152600b5416608082015290565b6040516103299190614896565b6103ae610d70565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae6101823660046148ec565b61057061056b36600461437b565b610e53565b60405167ffffffffffffffff9091168152602001610329565b6103ae6105973660046149b8565b610f56565b6000546001600160a01b0316610421565b604080516001815260006020820181905291810191909152606001610329565b6103ae6105db366004614a61565b611124565b6103ae6105ee366004614b66565b61132f565b6105fb61139a565b604051610329929190614bd4565b6103ae61061736600461437b565b6114c0565b6103ae61062a366004614bf9565b6114d1565b600061063d60016004614c82565b600261064a608085614cc4565b67ffffffffffffffff1661065e9190614ceb565b6010600061066d608087614d02565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106a4576106a4613f8c565b92915050565b84518460ff16601f8211156106f75760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614d29565b60405180910390fd5b806000036107345760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614d29565b61073c611771565b610745856117e7565b60095460005b818110156107bc57600860006009838154811061076a5761076a614d43565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161074b565b5050865160005b8181101561095f5760008982815181106107df576107df614d43565b60200260200101519050600060028111156107fc576107fc613f8c565b6001600160a01b038216600090815260086020526040902054610100900460ff16600281111561082e5761082e613f8c565b146108685760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614d29565b6001600160a01b0381166108a8576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561094b5761094b613f8c565b0217905550905050508060010190506107c3565b5087516109739060099060208b0190613e47565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a1617179055600780546109f99146913091906000906109cb9063ffffffff16614d72565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611ab1565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610a8a9487949293918316921691909117908f908f908f908f908f908f90614d95565b60405180910390a150505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610b4e90611b3e565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610bab57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b8d575b5050505050905090565b6000546001600160a01b03163314801590610bdb57506002546001600160a01b03163314155b15610c12576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b610c86611bf0565b81515181518114610cc3576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d60576000838281518110610ce257610ce2614d43565b6020026020010151905080600014610d57578451805183908110610d0857610d08614d43565b602002602001015160800151811015610d57576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106ee565b50600101610cc6565b50610d6b8383611c71565b505050565b6001546001600160a01b03163314610de4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106ee565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106a4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106a4576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190614e2b565b9392505050565b610f5e611771565b60005b825181101561103157610f9b838281518110610f7f57610f7f614d43565b602002602001015160200151600c6126f490919063ffffffff16565b15611029577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d58782838281518110610fd357610fd3614d43565b602002602001015160000151848381518110610ff157610ff1614d43565b6020026020010151602001516040516110209291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101610f61565b5060005b8151811015610d6b5761108e82828151811061105357611053614d43565b60200260200101516020015183838151811061107157611071614d43565b602002602001015160000151600c6127099092919063ffffffff16565b1561111c577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a8282815181106110c6576110c6614d43565b6020026020010151600001518383815181106110e4576110e4614d43565b6020026020010151602001516040516111139291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611035565b61112e8787612727565b600554883590808214611177576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016106ee565b61117f611bf0565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561120757611207613f8c565b600281111561121857611218613f8c565b905250905060028160200151600281111561123557611235613f8c565b14801561126f57506009816000015160ff168154811061125757611257614d43565b6000918252602090912001546001600160a01b031633145b6112a5576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006112b3856020614ceb565b6112be886020614ceb565b6112ca8b610144614e48565b6112d49190614e48565b6112de9190614e48565b9050368114611322576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106ee565b5050505050505050505050565b6000546001600160a01b0316331480159061135557506002546001600160a01b03163314155b1561138c576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139760038261274e565b50565b60608060006113a9600c612933565b90508067ffffffffffffffff8111156113c4576113c4614040565b6040519080825280602002602001820160405280156113ed578160200160208202803683370190505b5092508067ffffffffffffffff81111561140957611409614040565b604051908082528060200260200182016040528015611432578160200160208202803683370190505b50915060005b818110156114ba5760008061144e600c8461293e565b915091508086848151811061146557611465614d43565b60200260200101906001600160a01b031690816001600160a01b0316815250508185848151811061149857611498614d43565b6001600160a01b03909216602092830291909101909101525050600101611438565b50509091565b6114c8611771565b6113978161295c565b33301461150a576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611547565b60408051808201909152600080825260208201528152602001906001900390816115205790505b5061014084015151909150156115a7576115a4836101400151846020015160405160200161158491906001600160a01b0391909116815260200190565b604051602081830303815290604052856040015186610160015186612a37565b90505b610120830151511580156115bd57506080830151155b806115d4575060408301516001600160a01b03163b155b8061161457506040830151611612906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612b68565b155b1561161e57505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808861018001518152602001886000015167ffffffffffffffff168152602001886020015160405160200161169691906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001886101200151815260200186815250611388886080015189604001516040518563ffffffff1660e01b81526004016116e59493929190614ea0565b6000604051808303816000875af1158015611704573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261172c9190810190614faa565b50915091508161176a57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b5050505050565b6000546001600160a01b031633146117e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106ee565b565b6000818060200190518101906117fd9190615018565b60608101519091506001600160a01b0316611844576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015160408087015160608089015163ffffffff9889167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909716969096176401000000009890941697909702929092177fffff00000000000000000000000000000000000000000000ffffffffffffffff166801000000000000000061ffff909316929092027fffff0000000000000000000000000000000000000000ffffffffffffffffffff16919091176a01000000000000000000006001600160a01b039485160217909355608080860151600b80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918516919091179055835160e0810185527f0000000000000000000000000000000000000000000000000000000000000000841681527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff908116938201939093527f0000000000000000000000000000000000000000000000000000000000000000909216828501527f00000000000000000000000000000000000000000000000000000000000000008316948201949094527f00000000000000000000000000000000000000000000000000000000000000008216938101939093527f0000000000000000000000000000000000000000000000000000000000000000811660a08401527f00000000000000000000000000000000000000000000000000000000000000001660c0830152517f7879e20bb60a503429de4a2c912b5904f08a39f2af054c10fb46434b5d61126091611aa59184906150b3565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611ad599989796959493929190615175565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611bcc82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611bb09190614c82565b85608001516fffffffffffffffffffffffffffffffff16612b84565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b467f0000000000000000000000000000000000000000000000000000000000000000146117e5576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106ee565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4f91906151fd565b15611d86576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611dc3576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611e01576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611e1c57611e1c614040565b604051908082528060200260200182016040528015611e45578160200160208202803683370190505b50905060005b82811015611f1d57600085600001518281518110611e6b57611e6b614d43565b60200260200101519050611e9f817f0000000000000000000000000000000000000000000000000000000000000000612ba3565b838381518110611eb157611eb1614d43565b602002602001018181525050806101800151838381518110611ed557611ed5614d43565b602002602001015114611f14576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611e4b565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592611f919287929160040161524b565b602060405180830381865afa158015611fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd29190615281565b90508060000361200e576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156126eb5760008760000151828151811061203557612035614d43565b60200260200101519050600061204e826060015161062f565b9050600281600381111561206457612064613f8c565b036120ab57816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a250506126e3565b60008160038111156120bf576120bf613f8c565b14806120dc575060038160038111156120da576120da613f8c565b145b6121245760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106ee565b83156121e157600a5460009063ffffffff166121408742614c82565b11905080806121605750600382600381111561215e5761215e613f8c565b145b612196576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8884815181106121a8576121a8614d43565b60200260200101516000146121db578884815181106121c9576121c9614d43565b60200260200101518360800181815250505b5061223e565b60008160038111156121f5576121f5613f8c565b1461223e5760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106ee565b60c082015167ffffffffffffffff16156124bd576020808301516001600160a01b03166000908152600f909152604081205467ffffffffffffffff1690819003612428577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156124285760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b9190614e2b565b60c084015190915067ffffffffffffffff1661237882600161529a565b67ffffffffffffffff16146123d85782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a35050506126e3565b6020838101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561243c5761243c613f8c565b036124bb5760c083015167ffffffffffffffff1661245b82600161529a565b67ffffffffffffffff16146124bb5782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a35050506126e3565b505b6000896020015184815181106124d5576124d5614d43565b602002602001015190506125018360600151846000015185610140015151866101200151518551612cfe565b61251083606001516001612e78565b60008061251d8584612f22565b9150915061252f856060015183612e78565b861561259b57600382600381111561254957612549613f8c565b0361259b57600084600381111561256257612562613f8c565b1461259b57806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b60028260038111156125af576125af613f8c565b146126075760038260038111156125c8576125c8613f8c565b14612607578460600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016106ee9291906152bb565b60c085015167ffffffffffffffff161561268f57600084600381111561262f5761262f613f8c565b0361268f576020808601516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff1691612667836152d9565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef6584846040516126d59291906152f6565b60405180910390a350505050505b600101612015565b50505050505050565b6000610f4f836001600160a01b038416612feb565b600061271f846001600160a01b03851684612ff7565b949350505050565b61274a61273682840184615316565b604080516000815260208101909152611c71565b5050565b815460009061277790700100000000000000000000000000000000900463ffffffff1642614c82565b9050801561281957600183015483546127bf916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612b84565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461283f916fffffffffffffffffffffffffffffffff908116911661300d565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906129269084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106a482613023565b600080808061294d868661302e565b909450925050505b9250929050565b336001600160a01b038216036129ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106ee565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612b4d57612ab4888281518110612a5a57612a5a614d43565b6020026020010151602001518888888581518110612a7a57612a7a614d43565b6020026020010151806020019051810190612a95919061534b565b888681518110612aa757612aa7614d43565b602002602001015161303d565b838281518110612ac657612ac6614d43565b6020026020010181905250612b02838281518110612ae657612ae6614d43565b602002602001015160000151600c61343d90919063ffffffff16565b15612b4557612b38838281518110612b1c57612b1c614d43565b6020908102919091010151600b546001600160a01b0316613452565b612b429083614e48565b91505b600101612a3c565b508015612b5d57612b5d81613573565b505b95945050505050565b6000612b7383613580565b8015610f4f5750610f4f83836135e4565b6000612b5f85612b948486614ceb565b612b9e9087614e48565b61300d565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612c399897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612c729190615411565b60405160208183030381529060405280519060200120876101600151604051602001612c9e919061547e565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612d77576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106ee565b600a5468010000000000000000900461ffff16831115612dcf576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b808314612e14576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b600a54640100000000900463ffffffff1682111561176a57600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff166004820152602481018390526044016106ee565b60006002612e87608085614cc4565b67ffffffffffffffff16612e9b9190614ceb565b90506000601081612ead608087614d02565b67ffffffffffffffff168152602081019190915260400160002054905081612ed760016004614c82565b901b191681836003811115612eee57612eee613f8c565b901b178060106000612f01608088614d02565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590612f669087908790600401615491565b600060405180830381600087803b158015612f8057600080fd5b505af1925050508015612f91575060015b612fd0573d808015612fbf576040519150601f19603f3d011682016040523d82523d6000602084013e612fc4565b606091505b50600392509050612955565b50506040805160208101909152600081526002909250929050565b6000610f4f83836136b3565b600061271f84846001600160a01b0385166136d0565b600081831061301c5781610f4f565b5090919050565b60006106a4826136ed565b600080808061294d86866136f8565b604080518082019091526000808252602082015260006130608460200151613723565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa1580156130e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310991906155f4565b90506001600160a01b0381161580613151575061314f6001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612b68565b155b15613193576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106ee565b60008060006132986040518061010001604052808c81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018b6001600160a01b031681526020018d8152602001876001600160a01b031681526020018a6000015181526020018a604001518152602001898152506040516024016132299190615611565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f390775370000000000000000000000000000000000000000000000000000000017905260608a0151869063ffffffff1661138860846137c9565b925092509250826132d757816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b815160201461331f5781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106ee565b6000828060200190518101906133359190615281565b6040516001600160a01b038c166024820152604481018290529091506133d29060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260608b015188906133c890869063ffffffff16614c82565b61138860846137c9565b5090945092508361341157826040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b604080518082019091526001600160a01b03909616865260208601525092935050505095945050505050565b6000610f4f836001600160a01b0384166138ef565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa1580156134b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134dc91906156e8565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036135455783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016106ee565b602084015161271f907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906138fb565b6113976003826000613938565b60006135ac827f01ffc9a7000000000000000000000000000000000000000000000000000000006135e4565b80156106a457506135dd827fffffffff000000000000000000000000000000000000000000000000000000006135e4565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561369c575060208210155b80156136a85750600081115b979650505050505050565b60008181526002830160205260408120819055610f4f8383613c87565b6000828152600284016020526040812082905561271f8484613c93565b60006106a482613c9f565b600080806137068585613ca9565b600081815260029690960160205260409095205494959350505050565b6000815160201461376257816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b6000828060200190518101906137789190615281565b90506001600160a01b03811180613790575061040081105b156106a457826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b6000606060008361ffff1667ffffffffffffffff8111156137ec576137ec614040565b6040519080825280601f01601f191660200182016040528015613816576020820181803683370190505b509150863b613849577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a8581101561387c577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106138b5577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156138d85750835b808352806000602085013e50955095509592505050565b6000610f4f8383613cb5565b6000670de0b6b3a764000061392e837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616614ceb565b610f4f9190615748565b825474010000000000000000000000000000000000000000900460ff16158061395f575081155b1561396957505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906139af90700100000000000000000000000000000000900463ffffffff1642614c82565b90508015613a6f57818311156139f1576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613a2b9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612b84565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613b0c576001600160a01b038416613ac1576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016106ee565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b03851660448201526064016106ee565b84831015613c055760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613b509082614c82565b613b5a878a614c82565b613b649190614e48565b613b6e9190615748565b90506001600160a01b038616613bba576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016106ee565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b03871660448201526064016106ee565b613c0f8584614c82565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610f4f8383613cd4565b6000610f4f8383613dce565b60006106a4825490565b6000610f4f8383613e1d565b6000610f4f838360008181526001830160205260408120541515610f4f565b60008181526001830160205260408120548015613dbd576000613cf8600183614c82565b8554909150600090613d0c90600190614c82565b9050818114613d71576000866000018281548110613d2c57613d2c614d43565b9060005260206000200154905080876000018481548110613d4f57613d4f614d43565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613d8257613d8261575c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106a4565b60009150506106a4565b5092915050565b6000818152600183016020526040812054613e15575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106a4565b5060006106a4565b6000826000018281548110613e3457613e34614d43565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215613eb4579160200282015b82811115613eb457825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613e67565b50613ec0929150613ec4565b5090565b5b80821115613ec05760008155600101613ec5565b60e081016106a482846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff8116811461139757600080fd5b8035613f6a81613f49565b919050565b600060208284031215613f8157600080fd5b8135610f4f81613f49565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613fcb57613fcb613f8c565b9052565b602081016106a48284613fbb565b60005b83811015613ff8578181015183820152602001613fe0565b50506000910152565b60008151808452614019816020860160208601613fdd565b601f01601f19169290920160200192915050565b602081526000610f4f6020830184614001565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561409257614092614040565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561409257614092614040565b6040516080810167ffffffffffffffff8111828210171561409257614092614040565b604051601f8201601f1916810167ffffffffffffffff8111828210171561410857614108614040565b604052919050565b600067ffffffffffffffff82111561412a5761412a614040565b5060051b60200190565b6001600160a01b038116811461139757600080fd5b8035613f6a81614134565b600082601f83011261416557600080fd5b8135602061417a61417583614110565b6140df565b8083825260208201915060208460051b87010193508684111561419c57600080fd5b602086015b848110156141c15780356141b481614134565b83529183019183016141a1565b509695505050505050565b803560ff81168114613f6a57600080fd5b600067ffffffffffffffff8211156141f7576141f7614040565b50601f01601f191660200190565b600082601f83011261421657600080fd5b8135614224614175826141dd565b81815284602083860101111561423957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561426f57600080fd5b863567ffffffffffffffff8082111561428757600080fd5b6142938a838b01614154565b975060208901359150808211156142a957600080fd5b6142b58a838b01614154565b96506142c360408a016141cc565b955060608901359150808211156142d957600080fd5b6142e58a838b01614205565b94506142f360808a01613f5f565b935060a089013591508082111561430957600080fd5b5061431689828a01614205565b9150509295509295509295565b60008151808452602080850194506020840160005b8381101561435d5781516001600160a01b031687529582019590820190600101614338565b509495945050505050565b602081526000610f4f6020830184614323565b60006020828403121561438d57600080fd5b8135610f4f81614134565b801515811461139757600080fd5b8035613f6a81614398565b600082601f8301126143c257600080fd5b813560206143d261417583614110565b82815260069290921b840181019181810190868411156143f157600080fd5b8286015b848110156141c1576040818903121561440e5760008081fd5b61441661406f565b813561442181614134565b815281850135858201528352918301916040016143f5565b600082601f83011261444a57600080fd5b8135602061445a61417583614110565b82815260059290921b8401810191818101908684111561447957600080fd5b8286015b848110156141c157803567ffffffffffffffff81111561449d5760008081fd5b6144ab8986838b0101614205565b84525091830191830161447d565b60006101a082840312156144cc57600080fd5b6144d4614098565b90506144df82613f5f565b81526144ed60208301614149565b60208201526144fe60408301614149565b604082015261450f60608301613f5f565b60608201526080820135608082015261452a60a083016143a6565b60a082015261453b60c08301613f5f565b60c082015261454c60e08301614149565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561457957600080fd5b61458586838701614205565b838501526101409250828501359150808211156145a157600080fd5b6145ad868387016143b1565b838501526101609250828501359150808211156145c957600080fd5b506145d685828601614439565b82840152505061018080830135818301525092915050565b600082601f8301126145ff57600080fd5b8135602061460f61417583614110565b82815260059290921b8401810191818101908684111561462e57600080fd5b8286015b848110156141c157803567ffffffffffffffff8111156146525760008081fd5b6146608986838b0101614439565b845250918301918301614632565b600082601f83011261467f57600080fd5b8135602061468f61417583614110565b8083825260208201915060208460051b8701019350868411156146b157600080fd5b602086015b848110156141c157803583529183019183016146b6565b6000608082840312156146df57600080fd5b6146e76140bc565b9050813567ffffffffffffffff8082111561470157600080fd5b818401915084601f83011261471557600080fd5b8135602061472561417583614110565b82815260059290921b8401810191818101908884111561474457600080fd5b8286015b8481101561477c578035868111156147605760008081fd5b61476e8b86838b01016144b9565b845250918301918301614748565b508652508581013593508284111561479357600080fd5b61479f878588016145ee565b908501525060408401359150808211156147b857600080fd5b506147c58482850161466e565b6040830152506060820135606082015292915050565b600080604083850312156147ee57600080fd5b823567ffffffffffffffff8082111561480657600080fd5b614812868387016146cd565b935060209150818501358181111561482957600080fd5b85019050601f8101861361483c57600080fd5b803561484a61417582614110565b81815260059190911b8201830190838101908883111561486957600080fd5b928401925b828410156148875783358252928401929084019061486e565b80955050505050509250929050565b60a081016106a4828463ffffffff8082511683528060208301511660208401525061ffff604082015116604083015260608101516001600160a01b03808216606085015280608084015116608085015250505050565b6000602082840312156148fe57600080fd5b813567ffffffffffffffff81111561491557600080fd5b820160a08185031215610f4f57600080fd5b600082601f83011261493857600080fd5b8135602061494861417583614110565b82815260069290921b8401810191818101908684111561496757600080fd5b8286015b848110156141c157604081890312156149845760008081fd5b61498c61406f565b813561499781614134565b8152818501356149a681614134565b8186015283529183019160400161496b565b600080604083850312156149cb57600080fd5b823567ffffffffffffffff808211156149e357600080fd5b6149ef86838701614927565b93506020850135915080821115614a0557600080fd5b50614a1285828601614927565b9150509250929050565b60008083601f840112614a2e57600080fd5b50813567ffffffffffffffff811115614a4657600080fd5b6020830191508360208260051b850101111561295557600080fd5b60008060008060008060008060e0898b031215614a7d57600080fd5b606089018a811115614a8e57600080fd5b8998503567ffffffffffffffff80821115614aa857600080fd5b818b0191508b601f830112614abc57600080fd5b813581811115614acb57600080fd5b8c6020828501011115614add57600080fd5b6020830199508098505060808b0135915080821115614afb57600080fd5b614b078c838d01614a1c565b909750955060a08b0135915080821115614b2057600080fd5b50614b2d8b828c01614a1c565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff81168114613f6a57600080fd5b600060608284031215614b7857600080fd5b6040516060810181811067ffffffffffffffff82111715614b9b57614b9b614040565b6040528235614ba981614398565b8152614bb760208401614b46565b6020820152614bc860408401614b46565b60408201529392505050565b604081526000614be76040830185614323565b8281036020840152612b5f8185614323565b60008060408385031215614c0c57600080fd5b823567ffffffffffffffff80821115614c2457600080fd5b614c30868387016144b9565b93506020850135915080821115614c4657600080fd5b50614a1285828601614439565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106a4576106a4614c53565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614cdf57614cdf614c95565b92169190910692915050565b80820281158282048414176106a4576106a4614c53565b600067ffffffffffffffff80841680614d1d57614d1d614c95565b92169190910492915050565b6020810160038310614d3d57614d3d613f8c565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818103614d8b57614d8b614c53565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614dc58184018a614323565b90508281036080840152614dd98189614323565b905060ff871660a084015282810360c0840152614df68187614001565b905067ffffffffffffffff851660e0840152828103610100840152614e1b8185614001565b9c9b505050505050505050505050565b600060208284031215614e3d57600080fd5b8151610f4f81613f49565b808201808211156106a4576106a4614c53565b60008151808452602080850194506020840160005b8381101561435d57815180516001600160a01b031688528301518388015260409096019590820190600101614e70565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614edb610120840182614001565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152614f178383614001565b925060808901519150808584030161010086015250614f368282614e5b565b92505050614f4a602083018661ffff169052565b836040830152612b5f60608301846001600160a01b03169052565b600082601f830112614f7657600080fd5b8151614f84614175826141dd565b818152846020838601011115614f9957600080fd5b61271f826020830160208701613fdd565b600080600060608486031215614fbf57600080fd5b8351614fca81614398565b602085015190935067ffffffffffffffff811115614fe757600080fd5b614ff386828701614f65565b925050604084015190509250925092565b805163ffffffff81168114613f6a57600080fd5b600060a0828403121561502a57600080fd5b60405160a0810181811067ffffffffffffffff8211171561504d5761504d614040565b60405261505983615004565b815261506760208401615004565b6020820152604083015161ffff8116811461508157600080fd5b6040820152606083015161509481614134565b606082015260808301516150a781614134565b60808201529392505050565b610180810161512482856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e0840152602084015116610100830152604083015161ffff1661012083015260608301516001600160a01b03908116610140840152608084015116610160830152610f4f565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526151af8285018b614323565b915083820360808501526151c3828a614323565b915060ff881660a085015283820360c08501526151e08288614001565b90861660e08501528381036101008501529050614e1b8185614001565b60006020828403121561520f57600080fd5b8151610f4f81614398565b60008151808452602080850194506020840160005b8381101561435d5781518752958201959082019060010161522f565b60608152600061525e606083018661521a565b8281036020840152615270818661521a565b915050826040830152949350505050565b60006020828403121561529357600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115613dc757613dc7614c53565b67ffffffffffffffff8316815260408101610f4f6020830184613fbb565b600067ffffffffffffffff808316818103614d8b57614d8b614c53565b6153008184613fbb565b60406020820152600061271f6040830184614001565b60006020828403121561532857600080fd5b813567ffffffffffffffff81111561533f57600080fd5b61271f848285016146cd565b60006020828403121561535d57600080fd5b815167ffffffffffffffff8082111561537557600080fd5b908301906080828603121561538957600080fd5b6153916140bc565b8251828111156153a057600080fd5b6153ac87828601614f65565b8252506020830151828111156153c157600080fd5b6153cd87828601614f65565b6020830152506040830151828111156153e557600080fd5b6153f187828601614f65565b60408301525061540360608401615004565b606082015295945050505050565b602081526000610f4f6020830184614e5b565b60008282518085526020808601955060208260051b8401016020860160005b8481101561547157601f1986840301895261545f838351614001565b98840198925090830190600101615443565b5090979650505050505050565b602081526000610f4f6020830184615424565b604081526154ac60408201845167ffffffffffffffff169052565b600060208401516154c860608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006155298185018367ffffffffffffffff169052565b60e08601519150610120615547818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a061016081818701526155776101e0870185614001565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526155b68686614e5b565b9550828a015194508188870301848901526155d18686615424565b9550808a01516101c089015250505050508281036020840152612b5f8185615424565b60006020828403121561560657600080fd5b8151610f4f81614134565b6020815260008251610100806020850152615630610120850183614001565b9150602085015161564d604086018267ffffffffffffffff169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161568760a08601826001600160a01b03169052565b5060a0850151601f19808685030160c08701526156a48483614001565b935060c08701519150808685030160e08701526156c18483614001565b935060e08701519150808685030183870152506156de8382614001565b9695505050505050565b6000604082840312156156fa57600080fd5b61570261406f565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461572e57600080fd5b815261573c60208401615004565b60208201529392505050565b60008261575757615757614c95565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI
@@ -2481,7 +2479,7 @@ func (EVM2EVMOffRampConfigChanged) Topic() common.Hash {
}
func (EVM2EVMOffRampConfigSet) Topic() common.Hash {
- return common.HexToHash("0xf02fcc22535d64d92d17b995475893d63edd51da163fed74a6ee9b4bc4895cc4")
+ return common.HexToHash("0x7879e20bb60a503429de4a2c912b5904f08a39f2af054c10fb46434b5d611260")
}
func (EVM2EVMOffRampConfigSet0) Topic() common.Hash {
diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go
index be9c2395a0..d186229b59 100644
--- a/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go
+++ b/core/gethwrappers/ccip/generated/evm_2_evm_onramp/evm_2_evm_onramp.go
@@ -56,7 +56,6 @@ type EVM2EVMOnRampDynamicConfig struct {
MaxPerMsgGasLimit uint32
DefaultTokenFeeUSDCents uint16
DefaultTokenDestGasOverhead uint32
- DefaultTokenDestBytesOverhead uint32
EnforceOutOfOrder bool
}
@@ -142,8 +141,8 @@ type RateLimiterTokenBucket struct {
}
var EVM2EVMOnRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChainSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"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\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPoolV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"internalType\":\"address[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"address[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101a06040523480156200001257600080fd5b50604051620082d4380380620082d4833981016040819052620000359162001b0e565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c0816200030b565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555085516001600160a01b0316158062000169575060208601516001600160401b0316155b8062000180575060408601516001600160401b0316155b8062000197575060608601516001600160401b0316155b80620001ae575060c08601516001600160a01b0316155b80620001c5575060e08601516001600160a01b0316155b15620001e4576040516306b7c75960e31b815260040160405180910390fd5b60208087015160408089015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815288516001600160a01b0390811660e0908152938a01516001600160401b0390811661010052928a015183166101205260608a015190921660a0908152908901516001600160601b031660c090815290890151821661014052880151811661016052908701511661018052620002cd85620003b6565b620002d8836200071a565b604080516000815260208101909152620002f49083906200084a565b620002ff8162000aea565b50505050505062002212565b336001600160a01b03821603620003655760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003e2576040516306b7c75960e31b815260040160405180910390fd5b602081610180015163ffffffff16101562000427576101808101516040516312766e0160e11b81526000600482015263ffffffff909116602482015260440162000084565b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160006101000a81548161ffff021916908361ffff1602179055506101608201518160020160026101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160020160066101000a81548163ffffffff021916908363ffffffff1602179055506101a082015181600201600a6101000a81548160ff0219169083151502179055509050507fe375c8cb6ea9807cd0371503b632b93da5ee0f1f64205db8b5b28b95d6b588b060405180610100016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b03168152602001610180516001600160a01b0316815250826040516200070f92919062001da4565b60405180910390a150565b60005b8151811015620008185760008282815181106200073e576200073e62001e69565b60209081029190910181015160408051608080820183528385015163ffffffff9081168352838501516001600160401b03908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600b90985294909620925183549451925195511515600160a01b0260ff60a01b199688166c010000000000000000000000000296909616600160601b600160a81b031993909716640100000000026001600160601b0319909516911617929092179190911692909217179055506001016200071d565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e816040516200070f919062001e7f565b60005b825181101562000a095760008382815181106200086e576200086e62001e69565b6020026020010151905060208160a0015163ffffffff161015620008c457805160a08201516040516312766e0160e11b81526001600160a01b03909216600483015263ffffffff16602482015260440162000084565b6040805160e08101825260208381015163ffffffff908116835284840151811682840190815260608087015161ffff9081168688019081526080808a0151861693880193845260a0808b0151871691890191825260c0808c01511515918a019182526001908a018181529b516001600160a01b03166000908152600c9099529990972097518854955192519451915197519a519087166001600160401b031990961695909517640100000000928716929092029190911765ffffffffffff60401b191668010000000000000000939092169290920263ffffffff60501b1916176a0100000000000000000000918416919091021764ffffffffff60701b1916600160701b939092169290920260ff60901b191617600160901b941515949094029390931760ff60981b1916600160981b9315159390930292909217909155016200084d565b507ff5791bc457b3bb990493cf5f655db46c25ccf5764c9b99b8969b4c72ea7df9d08260405162000a3b919062001f0e565b60405180910390a160005b815181101562000aa357600c600083838151811062000a695762000a6962001e69565b6020908102919091018101516001600160a01b0316825281019190915260400160002080546001600160a01b031916905560010162000a46565b5080511562000ae6577ffb95a0042158e60a33e7b5bec100f3d95407b1a71bee6633bd54b8887449750b8160405162000add919062001fa3565b60405180910390a15b5050565b8051604081111562000b0f57604051635ad0867d60e11b815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff161562000b6257600e5463ffffffff6c010000000000000000000000008204166001600160601b039091161062000b625762000b6262000d05565b600062000b70600862000ef1565b90505b801562000bbc57600062000b9662000b8d60018462002008565b60089062000f04565b50905062000ba660088262000f22565b50508062000bb4906200201e565b905062000b73565b506000805b8281101562000c9c57600084828151811062000be15762000be162001e69565b6020026020010151600001519050600085838151811062000c065762000c0662001e69565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000c3e57506001600160a01b038216155b1562000c6957604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000c7b60088361ffff841662000f40565b5062000c8c61ffff82168562002038565b9350505080600101905062000bc1565b50600e805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000cf8908390869062002058565b60405180910390a1505050565b6000546001600160a01b0316331462000d56576002546001600160a01b0316331462000d565762000d3860083362000f60565b62000d565760405163032bb72b60e31b815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff16600081900362000d925760405163990e30bf60e01b815260040160405180910390fd5b600e546001600160601b03168181101562000dc0576040516311a1ee3b60e31b815260040160405180910390fd5b600062000dcc62000f77565b121562000dec57604051631e9acf1760e31b815260040160405180910390fd5b80600062000dfb600862000ef1565b905060005b8181101562000ecb5760008062000e1960088462000f04565b909250905060008762000e36836001600160601b038a16620020c8565b62000e429190620020e2565b905062000e50818762002105565b60e05190965062000e75906001600160a01b0316846001600160601b03841662001005565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a250505080600101905062000e00565b5050600e80546001600160601b0319166001600160601b03929092169190911790555050565b600062000efe8262001062565b92915050565b600080808062000f1586866200106f565b9097909650945050505050565b600062000f39836001600160a01b0384166200109c565b9392505050565b600062000f58846001600160a01b03851684620010bb565b949350505050565b600062000f39836001600160a01b038416620010da565b600e5460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa15801562000fce573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000ff4919062002128565b62001000919062002142565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b179091526200105d918591620010e816565b505050565b600062000efe82620011b9565b600080806200107f8585620011c4565b600081815260029690960160205260409095205494959350505050565b6000818152600283016020526040812081905562000f398383620011d2565b6000828152600284016020526040812082905562000f588484620011e0565b600062000f398383620011ee565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65649082015260009062001137906001600160a01b03851690849062001207565b8051909150156200105d578080602001905181019062001158919062002165565b6200105d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b600062000efe825490565b600062000f39838362001218565b600062000f39838362001245565b600062000f39838362001350565b6000818152600183016020526040812054151562000f39565b606062000f588484600085620013a2565b600082600001828154811062001232576200123262001e69565b9060005260206000200154905092915050565b600081815260018301602052604081205480156200133e5760006200126c60018362002008565b8554909150600090620012829060019062002008565b9050818114620012ee576000866000018281548110620012a657620012a662001e69565b9060005260206000200154905080876000018481548110620012cc57620012cc62001e69565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062001302576200130262002183565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000efe565b600091505062000efe565b5092915050565b6000818152600183016020526040812054620013995750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000efe565b50600062000efe565b606082471015620014055760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620014239190620021bf565b60006040518083038185875af1925050503d806000811462001462576040519150601f19603f3d011682016040523d82523d6000602084013e62001467565b606091505b5090925090506200147b8783838762001486565b979650505050505050565b60608315620014fa578251600003620014f2576001600160a01b0385163b620014f25760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162000f58565b62000f588383815115620015115781518083602001fd5b8060405162461bcd60e51b8152600401620000849190620021dd565b634e487b7160e01b600052604160045260246000fd5b6040516101c081016001600160401b03811182821017156200156957620015696200152d565b60405290565b60405160a081016001600160401b03811182821017156200156957620015696200152d565b60405160e081016001600160401b03811182821017156200156957620015696200152d565b604080519081016001600160401b03811182821017156200156957620015696200152d565b60405161010081016001600160401b03811182821017156200156957620015696200152d565b604051601f8201601f191681016001600160401b03811182821017156200162f576200162f6200152d565b604052919050565b80516001600160a01b03811681146200164f57600080fd5b919050565b80516001600160401b03811681146200164f57600080fd5b805161ffff811681146200164f57600080fd5b805163ffffffff811681146200164f57600080fd5b805180151581146200164f57600080fd5b60006101c08284031215620016b957600080fd5b620016c362001543565b9050620016d08262001637565b8152620016e0602083016200166c565b6020820152620016f3604083016200167f565b604082015262001706606083016200166c565b606082015262001719608083016200167f565b60808201526200172c60a083016200166c565b60a08201526200173f60c083016200166c565b60c08201526200175260e0830162001637565b60e0820152610100620017678184016200167f565b908201526101206200177b8382016200167f565b908201526101406200178f8382016200166c565b90820152610160620017a38382016200167f565b90820152610180620017b78382016200167f565b908201526101a0620017cb83820162001694565b9082015292915050565b80516001600160801b03811681146200164f57600080fd5b6000606082840312156200180057600080fd5b604051606081016001600160401b03811182821017156200182557620018256200152d565b604052905080620018368362001694565b81526200184660208401620017d5565b60208201526200185960408401620017d5565b60408201525092915050565b60006001600160401b038211156200188157620018816200152d565b5060051b60200190565b600082601f8301126200189d57600080fd5b81516020620018b6620018b08362001865565b62001604565b82815260a09283028501820192828201919087851115620018d657600080fd5b8387015b85811015620019635781818a031215620018f45760008081fd5b620018fe6200156f565b620019098262001637565b8152620019188683016200167f565b8682015260406200192b81840162001654565b9082015260606200193e83820162001654565b9082015260806200195183820162001694565b908201528452928401928101620018da565b5090979650505050505050565b600082601f8301126200198257600080fd5b8151602062001995620018b08362001865565b82815260e09283028501820192828201919087851115620019b557600080fd5b8387015b85811015620019635781818a031215620019d35760008081fd5b620019dd62001594565b620019e88262001637565b8152620019f78683016200167f565b86820152604062001a0a8184016200167f565b90820152606062001a1d8382016200166c565b90820152608062001a308382016200167f565b9082015260a062001a438382016200167f565b9082015260c062001a5683820162001694565b908201528452928401928101620019b9565b600082601f83011262001a7a57600080fd5b8151602062001a8d620018b08362001865565b82815260069290921b8401810191818101908684111562001aad57600080fd5b8286015b8481101562001b03576040818903121562001acc5760008081fd5b62001ad6620015b9565b62001ae18262001637565b815262001af08583016200166c565b8186015283529183019160400162001ab1565b509695505050505050565b60008060008060008086880361038081121562001b2a57600080fd5b6101008082121562001b3b57600080fd5b62001b45620015de565b915062001b528962001637565b825262001b6260208a0162001654565b602083015262001b7560408a0162001654565b604083015262001b8860608a0162001654565b606083015260808901516001600160601b038116811462001ba857600080fd5b608083015262001bbb60a08a0162001637565b60a083015262001bce60c08a0162001637565b60c083015262001be160e08a0162001637565b60e083015281975062001bf78a828b01620016a5565b9650505062001c0b886102c08901620017ed565b6103208801519094506001600160401b038082111562001c2a57600080fd5b62001c388a838b016200188b565b945061034089015191508082111562001c5057600080fd5b62001c5e8a838b0162001970565b935061036089015191508082111562001c7657600080fd5b5062001c8589828a0162001a68565b9150509295509295509295565b80516001600160a01b03168252602081015162001cb5602084018261ffff169052565b50604081015162001cce604084018263ffffffff169052565b50606081015162001ce5606084018261ffff169052565b50608081015162001cfe608084018263ffffffff169052565b5060a081015162001d1560a084018261ffff169052565b5060c081015162001d2c60c084018261ffff169052565b5060e081015162001d4860e08401826001600160a01b03169052565b506101008181015163ffffffff90811691840191909152610120808301518216908401526101408083015161ffff16908401526101608083015182169084015261018080830151909116908301526101a0908101511515910152565b82516001600160a01b031681526020808401516001600160401b0390811691830191909152604080850151821690830152606080850151918216908301526102c082019050608084015162001e0460808401826001600160601b03169052565b5060a084015162001e2060a08401826001600160a01b03169052565b5060c084015162001e3c60c08401826001600160a01b03169052565b5060e084015162001e5860e08401826001600160a01b03169052565b5062000f3961010083018462001c92565b634e487b7160e01b600052603260045260246000fd5b602080825282518282018190526000919060409081850190868401855b8281101562001f0157815180516001600160a01b031685528681015163ffffffff1687860152858101516001600160401b03908116878701526060808301519091169086015260809081015115159085015260a0909301929085019060010162001e9c565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b8281101562001f0157815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a0808301519091169086015260c09081015115159085015260e0909301929085019060010162001f2b565b6020808252825182820181905260009190848201906040850190845b8181101562001fe65783516001600160a01b03168352928401929184019160010162001fbf565b50909695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111562000efe5762000efe62001ff2565b60008162002030576200203062001ff2565b506000190190565b63ffffffff81811683821601908082111562001349576200134962001ff2565b6000604080830163ffffffff8616845260206040602086015281865180845260608701915060208801935060005b81811015620020ba57845180516001600160a01b0316845284015161ffff1684840152938301939185019160010162002086565b509098975050505050505050565b808202811582820484141762000efe5762000efe62001ff2565b6000826200210057634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b0382811682821603908082111562001349576200134962001ff2565b6000602082840312156200213b57600080fd5b5051919050565b818103600083128015838313168383128216171562001349576200134962001ff2565b6000602082840312156200217857600080fd5b62000f398262001694565b634e487b7160e01b600052603160045260246000fd5b60005b83811015620021b65781810151838201526020016200219c565b50506000910152565b60008251620021d381846020870162002199565b9190910192915050565b6020815260008251806020840152620021fe81604085016020870162002199565b601f01601f19169190910160400192915050565b60805160a05160c05160e0516101005161012051610140516101605161018051615f94620023406000396000818161036101528181610f1801526137a3015260008181610332015281816117160152613774015260008181610303015281816113cc0152818161143101528181611c8901528181611d17015261374501526000818161026f01528181610a4e0152818161183e0152818161223701528181612acf01526136b101526000818161023f01528181611de80152613681015260008181610210015281816110c30152818161164201528181611a5f01528181611b6001528181612666015281816136520152613a410152600081816102cf01528181611c2c015261371101526000818161029f015281816127c101526136e10152600061243f0152615f946000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80637437ff9f116100f9578063c92b283211610097578063eff7cc4811610071578063eff7cc48146109fc578063f25561fd14610a04578063f2fde38b14610a17578063fbca3b7414610a2a57600080fd5b8063c92b2832146109ce578063d09dc339146109e1578063df0aa9e9146109e957600080fd5b8063856c8247116100d3578063856c8247146108a05780638da5cb5b146108b35780639a113c36146108c4578063b06d41bc146109b857600080fd5b80637437ff9f146106c057806376f6ae761461088557806379ba50971461089857600080fd5b806348a98aa411610166578063549e946f11610140578063549e946f1461066957806354b714681461067c578063599f64311461069c578063704b6c02146106ad57600080fd5b806348a98aa4146105c7578063528d4a92146105f2578063546719cd1461060557600080fd5b806320487ded1161019757806320487ded146105705780634120fccd146105915780634816f4f7146105b257600080fd5b806306285c69146101be5780631772047e146103a7578063181f5a7714610527575b600080fd5b6103916040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091526040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161039e9190614ba3565b60405180910390f35b6104bb6103b5366004614bd7565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506001600160a01b03166000908152600c6020908152604091829020825160e081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e0100000000000000000000000000008304909116608082015260ff720100000000000000000000000000000000000083048116151560a0830152730100000000000000000000000000000000000000909204909116151560c082015290565b60405161039e9190600060e08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015260c0830151151560c083015292915050565b6105636040518060400160405280601781526020017f45564d3245564d4f6e52616d7020312e352e302d64657600000000000000000081525081565b60405161039e9190614c44565b61058361057e366004614c85565b610a4a565b60405190815260200161039e565b610599610ea0565b60405167ffffffffffffffff909116815260200161039e565b6105c56105c0366004614e93565b610ec7565b005b6105da6105d5366004614fd0565b610edd565b6040516001600160a01b03909116815260200161039e565b6105c5610600366004615009565b610f8c565b61060d610fa0565b60405161039e919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6105c5610677366004615119565b611032565b600e546040516bffffffffffffffffffffffff909116815260200161039e565b6002546001600160a01b03166105da565b6105c56106bb366004614bd7565b6111ab565b610878604080516101c081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081019190915250604080516101c0810182526005546001600160a01b038082168352600160a01b820461ffff9081166020850152760100000000000000000000000000000000000000000000830463ffffffff908116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000808204831660c0870152640100000000820490931660e086015278010000000000000000000000000000000000000000000000008104861661010086015292909204841661012084015260075491821661014084015281048316610160830152660100000000000081049092166101808201526a010000000000000000000090910460ff1615156101a082015290565b60405161039e9190615242565b6105c5610893366004615251565b611275565b6105c56112d8565b6105996108ae366004614bd7565b6113a1565b6000546001600160a01b03166105da565b61096e6108d2366004614bd7565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b03166000908152600b60209081526040918290208251608081018452905463ffffffff8116825267ffffffffffffffff64010000000082048116938301939093526c0100000000000000000000000081049092169281019290925260ff600160a01b909104161515606082015290565b60408051825163ffffffff16815260208084015167ffffffffffffffff9081169183019190915283830151169181019190915260609182015115159181019190915260800161039e565b6109c061149c565b60405161039e92919061531a565b6105c56109dc36600461535c565b611597565b6105836115ff565b6105836109f73660046153ca565b6116bf565b6105c56124b3565b6105c5610a12366004615436565b612738565b6105c5610a25366004614bd7565b612749565b610a3d610a38366004615535565b61275a565b60405161039e9190615552565b60007f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168367ffffffffffffffff1614610aca576040517fd9a9cd6800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6000610ae1610adc608085018561559f565b61278e565b9050610b11610af3602085018561559f565b8351909150610b056040870187615604565b9050846020015161291b565b6000600b81610b266080870160608801614bd7565b6001600160a01b0316815260208082019290925260409081016000208151608081018352905463ffffffff81168252640100000000810467ffffffffffffffff908116948301949094526c01000000000000000000000000810490931691810191909152600160a01b90910460ff16151560608201819052909150610bf357610bb56080850160608601614bd7565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610ac1565b600654600090819064010000000090046001600160a01b031663ffdb4b37610c216080890160608a01614bd7565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff8a1660248201526044016040805180830381865afa158015610c8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb09190615698565b90925090506000808080610cc760408b018b615604565b90501115610d0157610cf5610ce260808b0160608c01614bd7565b86610cf060408d018d615604565b612a84565b91945092509050610d1d565b8551610d1a9063ffffffff16662386f26fc100006156e1565b92505b60065460009062010000900461ffff1615610d7157610d6e6dffffffffffffffffffffffffffff607087901c16610d5760208d018d61559f565b9050610d6660408e018e615604565b905085612e66565b90505b60208781015160055460009267ffffffffffffffff9092169163ffffffff8716917a010000000000000000000000000000000000000000000000000000900461ffff1690610dc1908f018f61559f565b610dcc9291506156e1565b6005548c51610dfb91760100000000000000000000000000000000000000000000900463ffffffff16906156f8565b610e0591906156f8565b610e0f91906156f8565b610e29906dffffffffffffffffffffffffffff89166156e1565b610e3391906156e1565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1682828a6040015167ffffffffffffffff1688610e7091906156e1565b610e7a91906156f8565b610e8491906156f8565b610e8e919061570b565b99505050505050505050505b92915050565b600e54600090610ec290600160801b900467ffffffffffffffff16600161572d565b905090565b610ecf612f36565b610ed98282612f8e565b5050565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610f61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f85919061574e565b9392505050565b610f9461330a565b610f9d81613364565b50565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff8082168352600160801b80830463ffffffff166020850152600160a01b90920460ff161515938301939093526004548084166060840152049091166080820152610ec2906137dd565b61103a612f36565b6001600160a01b03811661107a576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110846115ff565b905060008112156110c1576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036111135761110e6001600160a01b038416838361388f565b505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015261110e9083906001600160a01b038616906370a0823190602401602060405180830381865afa158015611176573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061119a919061576b565b6001600160a01b038616919061388f565b6000546001600160a01b031633148015906111d157506002546001600160a01b03163314155b15611208576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b61127d612f36565b610ed98282808060200260200160405190810160405280939291908181526020016000905b828210156112ce576112bf60408302860136819003810190615784565b815260200190600101906112a2565b505050505061390f565b6001546001600160a01b031633146113325760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610ac1565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b038082166000908152600d6020526040812054909167ffffffffffffffff909116907f00000000000000000000000000000000000000000000000000000000000000001615610e9a5780600003610e9a576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611478573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8591906157c3565b60606000806114ab6008613b75565b90508067ffffffffffffffff8111156114c6576114c6614cd5565b60405190808252806020026020018201604052801561150b57816020015b60408051808201909152600080825260208201528152602001906001900390816114e45790505b50925060005b8181101561157457600080611527600884613b80565b915091506040518060400160405280836001600160a01b031681526020018261ffff1681525086848151811061155f5761155f6157e0565b60209081029190910101525050600101611511565b5050600e5491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b031633148015906115bd57506002546001600160a01b03163314155b156115f4576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f9d600382613b9e565b600e546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611691573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b5919061576b565b610ec291906157f6565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608086901b1660048201526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561175d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117819190615816565b156117b8576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166117f8576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b0316331461183c576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168567ffffffffffffffff16146118b5576040517fd9a9cd6800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610ac1565b60006118c7610adc608087018761559f565b905060006118d86040870187615604565b91506118fe90506118ec602088018861559f565b9050836000015183856020015161291b565b8015611a55576000805b82811015611a435761191d6040890189615604565b8281811061192d5761192d6157e0565b90506040020160200135600003611970576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c600061198160408b018b615604565b84818110611991576119916157e0565b6119a79260206040909202019081019150614bd7565b6001600160a01b031681526020810191909152604001600020547201000000000000000000000000000000000000900460ff1615611a3b57611a2e6119ef60408a018a615604565b838181106119ff576119ff6157e0565b905060400201803603810190611a159190615833565b60065464010000000090046001600160a01b0316613d31565b611a3890836156f8565b91505b600101611908565b508015611a5357611a5381613e52565b505b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016611a8f6080880160608901614bd7565b6001600160a01b031603611af357600e8054869190600090611ac09084906bffffffffffffffffffffffff1661586d565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611c1a565b60065464010000000090046001600160a01b03166241e5be611b1b6080890160608a01614bd7565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018990527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa158015611ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcb919061576b565b600e8054600090611beb9084906bffffffffffffffffffffffff1661586d565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b600e546bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691161115611c87576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615611dd2576001600160a01b0384166000908152600d602052604081205467ffffffffffffffff169003611dd2576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611d5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8291906157c3565b6001600160a01b0385166000908152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b604080516101a08101825267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526001600160a01b03861660208201526000918101611e65611e2b8a8061559f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613e5f92505050565b6001600160a01b03168152602001600e601081819054906101000a900467ffffffffffffffff16611e9590615892565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001846000015181526020016000151581526020018460200151611f3f576001600160a01b0387166000908152600d602052604081208054909190611f159067ffffffffffffffff16615892565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055611f42565b60005b67ffffffffffffffff168152602001611f6160808a0160608b01614bd7565b6001600160a01b03168152602001878152602001888060200190611f85919061559f565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611fcc60408a018a615604565b808060200260200160405190810160405280939291908181526020016000905b828210156120185761200960408302860136819003810190615833565b81526020019060010190611fec565b505050505081526020018367ffffffffffffffff81111561203b5761203b614cd5565b60405190808252806020026020018201604052801561206e57816020015b60608152602001906001900390816120595790505b508152600060209091018190529091505b8281101561243857600061209660408a018a615604565b838181106120a6576120a66157e0565b9050604002018036038101906120bc9190615833565b905060006120ce8b8360000151610edd565b90506001600160a01b038116158061218457506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa15801561215e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121829190615816565b155b156121c95781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610ac1565b6000816001600160a01b0316639a4575b96040518060a001604052808e80600001906121f5919061559f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020808301919091526001600160a01b03808f16604080850191909152918901516060840152885116608090920191909152517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526122c091906004016158b9565b6000604051808303816000875af11580156122df573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123079190810190615986565b9050602081602001515111156123985782516001600160a01b03166000908152600c602090815260409091205490820151516e01000000000000000000000000000090910463ffffffff1610156123985782516040517f36f536ca0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610ac1565b80516123a390613e5f565b5060408051606081019091526001600160a01b03831660808201528060a0810160405160208183030381529060405281526020018260000151815260200182602001518152506040516020016123f99190615a17565b604051602081830303815290604052856101600151858151811061241f5761241f6157e0565b602002602001018190525050505080600101905061207f565b50612463817f0000000000000000000000000000000000000000000000000000000000000000613f05565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90612499908390615b0e565b60405180910390a16101800151925050505b949350505050565b6000546001600160a01b03163314612518576002546001600160a01b03163314612518576124e2600833614060565b612518576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff16600081900361256c576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546bffffffffffffffffffffffff16818110156125b7576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006125c16115ff565b12156125f9576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060006126066008613b75565b905060005b818110156126f557600080612621600884613b80565b9092509050600087612641836bffffffffffffffffffffffff8a166156e1565b61264b919061570b565b90506126578187615c43565b955061269b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff841661388f565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a250505080600101905061260b565b5050600e80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b612740612f36565b610f9d81614075565b61275161330a565b610f9d816141e7565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080518082019091526000808252602082015260008290036127ef57506040805180820190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260006020820152610e9a565b60006127fb8385615c68565b90507fe7e230f0000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000821601612868576128538360048187615cb0565b8101906128609190615cda565b915050610e9a565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016128e95760408051808201909152806128c98560048189615cb0565b8101906128d69190615d06565b815260006020909101529150610e9a9050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006547801000000000000000000000000000000000000000000000000900463ffffffff1680851115612984576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610ac1565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff168411156129e6576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554600160a01b900461ffff16831115612a2d576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81612a7d576007546a0100000000000000000000900460ff1615612a7d576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6000808083815b81811015612e5a576000878783818110612aa757612aa76157e0565b905060400201803603810190612abd9190615833565b905060006001600160a01b0316612af87f00000000000000000000000000000000000000000000000000000000000000008360000151610edd565b6001600160a01b031603612b465780516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610ac1565b80516001600160a01b03166000908152600c6020908152604091829020825160e081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e0100000000000000000000000000008304909116608082015260ff720100000000000000000000000000000000000083048116151560a0830152730100000000000000000000000000000000000000909204909116151560c08201819052612c7e57600754612c2f9061ffff16662386f26fc100006156e1565b612c3990886156f8565b600754909750612c559062010000900463ffffffff1687615d1f565b600754909650612c75906601000000000000900463ffffffff1686615d1f565b94505050612e52565b604081015160009061ffff1615612da25760008c6001600160a01b031684600001516001600160a01b031614612d455760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa158015612d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3e9190615d3c565b9050612d48565b508a5b620186a0836040015161ffff16612d8a8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166142a890919063ffffffff16565b612d9491906156e1565b612d9e919061570b565b9150505b6060820151612db19088615d1f565b9650816080015186612dc39190615d1f565b8251909650600090612de29063ffffffff16662386f26fc100006156e1565b905080821015612e0157612df6818a6156f8565b985050505050612e52565b6000836020015163ffffffff16662386f26fc10000612e2091906156e1565b905080831115612e4057612e34818b6156f8565b99505050505050612e52565b612e4a838b6156f8565b995050505050505b600101612a8b565b50509450945094915050565b60008063ffffffff8316612e7b6080866156e1565b612e87876102206156f8565b612e9191906156f8565b612e9b91906156f8565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612edd9061ffff16846156e1565b612ee791906156f8565b60065490915062010000900461ffff16612f116dffffffffffffffffffffffffffff8916836156e1565b612f1b91906156e1565b612f2b90655af3107a40006156e1565b979650505050505050565b6000546001600160a01b03163314612f8c576002546001600160a01b03163314612f8c576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005b825181101561321c576000838281518110612fae57612fae6157e0565b6020026020010151905060208160a0015163ffffffff16101561301b57805160a08201516040517f24ecdc020000000000000000000000000000000000000000000000000000000081526001600160a01b03909216600483015263ffffffff166024820152604401610ac1565b6040805160e08101825260208381015163ffffffff908116835284840151811682840190815260608087015161ffff9081168688019081526080808a0151861693880193845260a0808b0151871691890191825260c0808c01511515918a019182526001908a018181529b516001600160a01b03166000908152600c9099529990972097518854955192519451915197519a519087167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009096169590951764010000000092871692909202919091177fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff166801000000000000000093909216929092027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff16176a010000000000000000000091841691909102177fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff166e01000000000000000000000000000093909216929092027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1617720100000000000000000000000000000000000094151594909402939093177fffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff16730100000000000000000000000000000000000000931515939093029290921790915501612f91565b507ff5791bc457b3bb990493cf5f655db46c25ccf5764c9b99b8969b4c72ea7df9d08260405161324c9190615d57565b60405180910390a160005b81518110156132c757600c6000838381518110613276576132766157e0565b6020908102919091018101516001600160a01b0316825281019190915260400160002080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055600101613257565b50805115610ed9577ffb95a0042158e60a33e7b5bec100f3d95407b1a71bee6633bd54b8887449750b816040516132fe9190615552565b60405180910390a15050565b6000546001600160a01b03163314612f8c5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ac1565b60e08101516001600160a01b03166133a8576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081610180015163ffffffff161015613404576101808101516040517f24ecdc020000000000000000000000000000000000000000000000000000000081526000600482015263ffffffff9091166024820152604401610ac1565b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160006101000a81548161ffff021916908361ffff1602179055506101608201518160020160026101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160020160066101000a81548163ffffffff021916908363ffffffff1602179055506101a082015181600201600a6101000a81548160ff0219169083151502179055509050507fe375c8cb6ea9807cd0371503b632b93da5ee0f1f64205db8b5b28b95d6b588b06040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152508260405161126a929190615df7565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261386b82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261384f9190615e14565b85608001516fffffffffffffffffffffffffffffffff166142e5565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905261110e90849061430d565b8051604081111561394c576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff16156139a057600e5463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff909116106139a0576139a06124b3565b60006139ac6008613b75565b90505b80156139ee5760006139cd6139c5600184615e14565b600890613b80565b5090506139db6008826143f2565b5050806139e790615e27565b90506139af565b506000805b82811015613af6576000848281518110613a0f57613a0f6157e0565b60200260200101516000015190506000858381518110613a3157613a316157e0565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480613a8657506001600160a01b038216155b15613ac8576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610ac1565b613ad860088361ffff8416614407565b50613ae761ffff821685615d1f565b935050508060010190506139f3565b50600e80547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd2490613b689083908690615e5c565b60405180910390a1505050565b6000610e9a8261441d565b6000808080613b8f8686614428565b909450925050505b9250929050565b8154600090613bba90600160801b900463ffffffff1642615e14565b90508015613c425760018301548354613bf5916fffffffffffffffffffffffffffffffff808216928116918591600160801b909104166142e5565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617600160801b4263ffffffff16021783555b60208201518354613c68916fffffffffffffffffffffffffffffffff9081169116614453565b835483511515600160a01b027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff9283161717845560208301516040808501518316600160801b0291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990613b689084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613d97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613dbb9190615e7b565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613e245783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610ac1565b60208401516124ab907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906142a8565b610f9d6003826000614469565b60008151602014613e9e57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610ac19190614c44565b600082806020019051810190613eb4919061576b565b90506001600160a01b03811180613ecc575061040081105b15610e9a57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610ac19190614c44565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613f9b9897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613fd49190615eae565b604051602081830303815290604052805190602001208761016001516040516020016140009190615ec1565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b6000610f85836001600160a01b038416614773565b60005b81518110156141b7576000828281518110614095576140956157e0565b60209081029190910181015160408051608080820183528385015163ffffffff90811683528385015167ffffffffffffffff908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600b90985294909620925183549451925195511515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9688166c0100000000000000000000000002969096167fffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff93909716640100000000027fffffffffffffffffffffffffffffffffffffffff00000000000000000000000090951691161792909217919091169290921717905550600101614078565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e8160405161126a9190615ed4565b336001600160a01b0382160361423f5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ac1565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a76400006142db837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166156e1565b610f85919061570b565b6000614304856142f584866156e1565b6142ff90876156f8565b614453565b95945050505050565b6000614362826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661477f9092919063ffffffff16565b80519091501561110e57808060200190518101906143809190615816565b61110e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ac1565b6000610f85836001600160a01b03841661478e565b60006124ab846001600160a01b038516846147ab565b6000610e9a826147c8565b6000808061443685856147d2565b600081815260029690960160205260409095205494959350505050565b60008183106144625781610f85565b5090919050565b8254600160a01b900460ff16158061447f575081155b1561448957505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906144c290600160801b900463ffffffff1642615e14565b905080156145685781831115614504576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461453190839085908490600160801b90046fffffffffffffffffffffffffffffffff166142e5565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b4263ffffffff160217875592505b84821015614605576001600160a01b0384166145ba576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610ac1565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610ac1565b848310156146f157600186810154600160801b90046fffffffffffffffffffffffffffffffff1690600090829061463c9082615e14565b614646878a615e14565b61465091906156f8565b61465a919061570b565b90506001600160a01b0386166146a6576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610ac1565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610ac1565b6146fb8584615e14565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610f8583836147de565b60606124ab84846000856147f6565b60008181526002830160205260408120819055610f8583836148dd565b600082815260028401602052604081208290556124ab84846148e9565b6000610e9a825490565b6000610f8583836148f5565b60008181526001830160205260408120541515610f85565b60608247101561486e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ac1565b600080866001600160a01b0316858760405161488a9190615f55565b60006040518083038185875af1925050503d80600081146148c7576040519150601f19603f3d011682016040523d82523d6000602084013e6148cc565b606091505b5091509150612f2b8783838761491f565b6000610f858383614998565b6000610f858383614a92565b600082600001828154811061490c5761490c6157e0565b9060005260206000200154905092915050565b6060831561498e578251600003614987576001600160a01b0385163b6149875760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ac1565b50816124ab565b6124ab8383614ae1565b60008181526001830160205260408120548015614a815760006149bc600183615e14565b85549091506000906149d090600190615e14565b9050818114614a355760008660000182815481106149f0576149f06157e0565b9060005260206000200154905080876000018481548110614a1357614a136157e0565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614a4657614a46615f71565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610e9a565b6000915050610e9a565b5092915050565b6000818152600183016020526040812054614ad957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e9a565b506000610e9a565b815115614af15781518083602001fd5b8060405162461bcd60e51b8152600401610ac19190614c44565b6001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401525060c0810151614b8860c08401826001600160a01b03169052565b5060e081015161110e60e08401826001600160a01b03169052565b6101008101610e9a8284614b0b565b6001600160a01b0381168114610f9d57600080fd5b8035614bd281614bb2565b919050565b600060208284031215614be957600080fd5b8135610f8581614bb2565b60005b83811015614c0f578181015183820152602001614bf7565b50506000910152565b60008151808452614c30816020860160208601614bf4565b601f01601f19169290920160200192915050565b602081526000610f856020830184614c18565b67ffffffffffffffff81168114610f9d57600080fd5b600060a08284031215614c7f57600080fd5b50919050565b60008060408385031215614c9857600080fd5b8235614ca381614c57565b9150602083013567ffffffffffffffff811115614cbf57600080fd5b614ccb85828601614c6d565b9150509250929050565b634e487b7160e01b600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715614d0e57614d0e614cd5565b60405290565b6040516101c0810167ffffffffffffffff81118282101715614d0e57614d0e614cd5565b60405160a0810167ffffffffffffffff81118282101715614d0e57614d0e614cd5565b6040805190810167ffffffffffffffff81118282101715614d0e57614d0e614cd5565b604051601f8201601f1916810167ffffffffffffffff81118282101715614da757614da7614cd5565b604052919050565b600067ffffffffffffffff821115614dc957614dc9614cd5565b5060051b60200190565b63ffffffff81168114610f9d57600080fd5b8035614bd281614dd3565b803561ffff81168114614bd257600080fd5b8015158114610f9d57600080fd5b8035614bd281614e02565b600082601f830112614e2c57600080fd5b81356020614e41614e3c83614daf565b614d7e565b8083825260208201915060208460051b870101935086841115614e6357600080fd5b602086015b84811015614e88578035614e7b81614bb2565b8352918301918301614e68565b509695505050505050565b6000806040808486031215614ea757600080fd5b833567ffffffffffffffff80821115614ebf57600080fd5b818601915086601f830112614ed357600080fd5b81356020614ee3614e3c83614daf565b82815260e0928302850182019282820191908b851115614f0257600080fd5b958301955b84871015614fab5780878d031215614f1f5760008081fd5b614f27614ceb565b8735614f3281614bb2565b815287850135614f4181614dd3565b8186015287890135614f5281614dd3565b818a01526060614f63898201614df0565b90820152608088810135614f7681614dd3565b9082015260a0614f87898201614de5565b9082015260c0614f98898201614e10565b9082015283529586019591830191614f07565b5097505087013593505080831115614fc257600080fd5b5050614ccb85828601614e1b565b60008060408385031215614fe357600080fd5b8235614fee81614c57565b91506020830135614ffe81614bb2565b809150509250929050565b60006101c0828403121561501c57600080fd5b615024614d14565b61502d83614bc7565b815261503b60208401614df0565b602082015261504c60408401614de5565b604082015261505d60608401614df0565b606082015261506e60808401614de5565b608082015261507f60a08401614df0565b60a082015261509060c08401614df0565b60c08201526150a160e08401614bc7565b60e08201526101006150b4818501614de5565b908201526101206150c6848201614de5565b908201526101406150d8848201614df0565b908201526101606150ea848201614de5565b908201526101806150fc848201614de5565b908201526101a061510e848201614e10565b908201529392505050565b6000806040838503121561512c57600080fd5b8235614fee81614bb2565b80516001600160a01b031682526020810151615159602084018261ffff169052565b506040810151615171604084018263ffffffff169052565b506060810151615187606084018261ffff169052565b50608081015161519f608084018263ffffffff169052565b5060a08101516151b560a084018261ffff169052565b5060c08101516151cb60c084018261ffff169052565b5060e08101516151e660e08401826001600160a01b03169052565b506101008181015163ffffffff90811691840191909152610120808301518216908401526101408083015161ffff16908401526101608083015182169084015261018080830151909116908301526101a0908101511515910152565b6101c08101610e9a8284615137565b6000806020838503121561526457600080fd5b823567ffffffffffffffff8082111561527c57600080fd5b818501915085601f83011261529057600080fd5b81358181111561529f57600080fd5b8660208260061b85010111156152b457600080fd5b60209290920196919550909350505050565b60008151808452602080850194506020840160005b8381101561530f57815180516001600160a01b0316885283015161ffff1683880152604090960195908201906001016152db565b509495945050505050565b60408152600061532d60408301856152c6565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff81168114614bd257600080fd5b60006060828403121561536e57600080fd5b6040516060810181811067ffffffffffffffff8211171561539157615391614cd5565b604052823561539f81614e02565b81526153ad6020840161533c565b60208201526153be6040840161533c565b60408201529392505050565b600080600080608085870312156153e057600080fd5b84356153eb81614c57565b9350602085013567ffffffffffffffff81111561540757600080fd5b61541387828801614c6d565b93505060408501359150606085013561542b81614bb2565b939692955090935050565b6000602080838503121561544957600080fd5b823567ffffffffffffffff81111561546057600080fd5b8301601f8101851361547157600080fd5b803561547f614e3c82614daf565b81815260a0918202830184019184820191908884111561549e57600080fd5b938501935b838510156155295780858a0312156154bb5760008081fd5b6154c3614d38565b85356154ce81614bb2565b8152858701356154dd81614dd3565b818801526040868101356154f081614c57565b9082015260608681013561550381614c57565b9082015260808681013561551681614e02565b90820152835293840193918501916154a3565b50979650505050505050565b60006020828403121561554757600080fd5b8135610f8581614c57565b6020808252825182820181905260009190848201906040850190845b818110156155935783516001600160a01b03168352928401929184019160010161556e565b50909695505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155d457600080fd5b83018035915067ffffffffffffffff8211156155ef57600080fd5b602001915036819003821315613b9757600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261563957600080fd5b83018035915067ffffffffffffffff82111561565457600080fd5b6020019150600681901b3603821315613b9757600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614bd257600080fd5b600080604083850312156156ab57600080fd5b6156b48361566c565b91506156c26020840161566c565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e9a57610e9a6156cb565b80820180821115610e9a57610e9a6156cb565b60008261572857634e487b7160e01b600052601260045260246000fd5b500490565b67ffffffffffffffff818116838216019080821115614a8b57614a8b6156cb565b60006020828403121561576057600080fd5b8151610f8581614bb2565b60006020828403121561577d57600080fd5b5051919050565b60006040828403121561579657600080fd5b61579e614d5b565b82356157a981614bb2565b81526157b760208401614df0565b60208201529392505050565b6000602082840312156157d557600080fd5b8151610f8581614c57565b634e487b7160e01b600052603260045260246000fd5b8181036000831280158383131683831282161715614a8b57614a8b6156cb565b60006020828403121561582857600080fd5b8151610f8581614e02565b60006040828403121561584557600080fd5b61584d614d5b565b823561585881614bb2565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff818116838216019080821115614a8b57614a8b6156cb565b600067ffffffffffffffff8083168181036158af576158af6156cb565b6001019392505050565b602081526000825160a060208401526158d560c0840182614c18565b905067ffffffffffffffff602085015116604084015260408401516001600160a01b038082166060860152606086015160808601528060808701511660a086015250508091505092915050565b600082601f83011261593357600080fd5b815167ffffffffffffffff81111561594d5761594d614cd5565b6159606020601f19601f84011601614d7e565b81815284602083860101111561597557600080fd5b6124ab826020830160208701614bf4565b60006020828403121561599857600080fd5b815167ffffffffffffffff808211156159b057600080fd5b90830190604082860312156159c457600080fd5b6159cc614d5b565b8251828111156159db57600080fd5b6159e787828601615922565b8252506020830151828111156159fc57600080fd5b615a0887828601615922565b60208301525095945050505050565b602081526000825160606020840152615a336080840182614c18565b90506020840151601f1980858403016040860152615a518383614c18565b92506040860151915080858403016060860152506143048282614c18565b60008151808452602080850194506020840160005b8381101561530f57815180516001600160a01b031688528301518388015260409096019590820190600101615a84565b60008282518085526020808601955060208260051b8401016020860160005b84811015615b0157601f19868403018952615aef838351614c18565b98840198925090830190600101615ad3565b5090979650505050505050565b60208152615b2960208201835167ffffffffffffffff169052565b60006020830151615b4560408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a0830151615b8e60c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615bc1818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615bef6101c0860184614c18565b9250808601519050601f19610160818786030181880152615c108584615a6f565b945080880151925050610180818786030181880152615c2f8584615ab4565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff828116828216039080821115614a8b57614a8b6156cb565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615ca85780818660040360031b1b83161692505b505092915050565b60008085851115615cc057600080fd5b83861115615ccd57600080fd5b5050820193919092039150565b600060408284031215615cec57600080fd5b615cf4614d5b565b8235815260208301356157b781614e02565b600060208284031215615d1857600080fd5b5035919050565b63ffffffff818116838216019080821115614a8b57614a8b6156cb565b600060208284031215615d4e57600080fd5b610f858261566c565b602080825282518282018190526000919060409081850190868401855b82811015615dea57815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a0808301519091169086015260c09081015115159085015260e09093019290850190600101615d74565b5091979650505050505050565b6102c08101615e068285614b0b565b610f85610100830184615137565b81810381811115610e9a57610e9a6156cb565b600081615e3657615e366156cb565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff831681526040602082015260006124ab60408301846152c6565b600060408284031215615e8d57600080fd5b615e95614d5b565b615e9e8361566c565b815260208301516157b781614dd3565b602081526000610f856020830184615a6f565b602081526000610f856020830184615ab4565b602080825282518282018190526000919060409081850190868401855b82811015615dea57815180516001600160a01b031685528681015163ffffffff16878601528581015167ffffffffffffffff908116878701526060808301519091169086015260809081015115159085015260a09093019290850190600101615ef1565b60008251615f67818460208701614bf4565b9190910192915050565b634e487b7160e01b600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidChainSelector\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"}],\"name\":\"InvalidNopAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidWithdrawParams\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LinkBalanceNotSettled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MaxFeeBalanceReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoFeesToPay\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoNopsToPay\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"NotAFeeToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdminOrNop\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyNops\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeConfig\",\"type\":\"tuple[]\"}],\"name\":\"FeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"NopPaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nopWeightsTotal\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"NopsSet\",\"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\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"transferFeeConfig\",\"type\":\"tuple[]\"}],\"name\":\"TokenTransferFeeConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getFeeTokenConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfig\",\"name\":\"feeTokenConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNopFeesJuels\",\"outputs\":[{\"internalType\":\"uint96\",\"name\":\"\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getNops\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256\",\"name\":\"weightsTotal\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPoolV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint64\"},{\"internalType\":\"uint96\",\"name\":\"maxNopFeesJuels\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"int256\",\"name\":\"\",\"type\":\"int256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"payNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.FeeTokenConfigArgs[]\",\"name\":\"feeTokenConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setFeeTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"nop\",\"type\":\"address\"},{\"internalType\":\"uint16\",\"name\":\"weight\",\"type\":\"uint16\"}],\"internalType\":\"structEVM2EVMOnRamp.NopAndWeight[]\",\"name\":\"nopsAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setNops\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"aggregateRateLimitEnabled\",\"type\":\"bool\"}],\"internalType\":\"structEVM2EVMOnRamp.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"internalType\":\"address[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"address[]\"}],\"name\":\"setTokenTransferFeeConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"withdrawNonLinkFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101a06040523480156200001257600080fd5b506040516200822d3803806200822d833981016040819052620000359162001a93565b8333806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c0816200030b565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606086018190529790950151166080909301839052600380546001600160a01b031916909417600160801b9283021760ff60a01b1916600160a01b90910217909255029091176004555085516001600160a01b0316158062000169575060208601516001600160401b0316155b8062000180575060408601516001600160401b0316155b8062000197575060608601516001600160401b0316155b80620001ae575060c08601516001600160a01b0316155b80620001c5575060e08601516001600160a01b0316155b15620001e4576040516306b7c75960e31b815260040160405180910390fd5b60208087015160408089015181517f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b3948101949094526001600160401b039283169184019190915216606082015230608082015260a00160408051601f198184030181529181528151602092830120608090815288516001600160a01b0390811660e0908152938a01516001600160401b0390811661010052928a015183166101205260608a015190921660a0908152908901516001600160601b031660c090815290890151821661014052880151811661016052908701511661018052620002cd85620003b6565b620002d883620006ad565b604080516000815260208101909152620002f4908390620007dd565b620002ff8162000a83565b5050505050506200218a565b336001600160a01b03821603620003655760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60e08101516001600160a01b0316620003e2576040516306b7c75960e31b815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160006101000a81548161ffff021916908361ffff1602179055506101608201518160020160026101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160020160066101000a81548160ff0219169083151502179055509050507f45b5ad483aa608464c2c7f278bd413d284d7790cdc836e40652e23a02770822060405180610100016040528060e0516001600160a01b03168152602001610100516001600160401b03168152602001610120516001600160401b0316815260200160a0516001600160401b0316815260200160c0516001600160601b03168152602001610140516001600160a01b03168152602001610160516001600160a01b03168152602001610180516001600160a01b031681525082604051620006a292919062001d1c565b60405180910390a150565b60005b8151811015620007ab576000828281518110620006d157620006d162001de1565b60209081029190910181015160408051608080820183528385015163ffffffff9081168352838501516001600160401b03908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600b90985294909620925183549451925195511515600160a01b0260ff60a01b199688166c010000000000000000000000000296909616600160601b600160a81b031993909716640100000000026001600160601b031990951691161792909217919091169290921717905550600101620006b0565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e81604051620006a2919062001df7565b60005b8251811015620009a257600083828151811062000801576200080162001de1565b60200260200101519050602063ffffffff168160a0015163ffffffff1610156200085d57805160a08201516040516312766e0160e11b81526001600160a01b03909216600483015263ffffffff16602482015260440162000084565b6040805160e08101825260208381015163ffffffff908116835284840151811682840190815260608087015161ffff9081168688019081526080808a0151861693880193845260a0808b0151871691890191825260c0808c01511515918a019182526001908a018181529b516001600160a01b03166000908152600c9099529990972097518854955192519451915197519a519087166001600160401b031990961695909517640100000000928716929092029190911765ffffffffffff60401b191668010000000000000000939092169290920263ffffffff60501b1916176a0100000000000000000000918416919091021764ffffffffff60701b1916600160701b939092169290920260ff60901b191617600160901b941515949094029390931760ff60981b1916600160981b931515939093029290921790915501620007e0565b507ff5791bc457b3bb990493cf5f655db46c25ccf5764c9b99b8969b4c72ea7df9d082604051620009d4919062001e86565b60405180910390a160005b815181101562000a3c57600c600083838151811062000a025762000a0262001de1565b6020908102919091018101516001600160a01b0316825281019190915260400160002080546001600160a01b0319169055600101620009df565b5080511562000a7f577ffb95a0042158e60a33e7b5bec100f3d95407b1a71bee6633bd54b8887449750b8160405162000a76919062001f1b565b60405180910390a15b5050565b8051604081111562000aa857604051635ad0867d60e11b815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff161562000afb57600e5463ffffffff6c010000000000000000000000008204166001600160601b039091161062000afb5762000afb62000c9e565b600062000b09600862000e8a565b90505b801562000b5557600062000b2f62000b2660018462001f80565b60089062000e9d565b50905062000b3f60088262000ebb565b50508062000b4d9062001f96565b905062000b0c565b506000805b8281101562000c3557600084828151811062000b7a5762000b7a62001de1565b6020026020010151600001519050600085838151811062000b9f5762000b9f62001de1565b602002602001015160200151905060e0516001600160a01b0316826001600160a01b0316148062000bd757506001600160a01b038216155b1562000c0257604051634de938d160e01b81526001600160a01b038316600482015260240162000084565b62000c1460088361ffff841662000ed9565b5062000c2561ffff82168562001fb0565b9350505080600101905062000b5a565b50600e805463ffffffff60601b19166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd249062000c91908390869062001fd0565b60405180910390a1505050565b6000546001600160a01b0316331462000cef576002546001600160a01b0316331462000cef5762000cd160083362000ef9565b62000cef5760405163032bb72b60e31b815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff16600081900362000d2b5760405163990e30bf60e01b815260040160405180910390fd5b600e546001600160601b03168181101562000d59576040516311a1ee3b60e31b815260040160405180910390fd5b600062000d6562000f10565b121562000d8557604051631e9acf1760e31b815260040160405180910390fd5b80600062000d94600862000e8a565b905060005b8181101562000e645760008062000db260088462000e9d565b909250905060008762000dcf836001600160601b038a1662002040565b62000ddb91906200205a565b905062000de981876200207d565b60e05190965062000e0e906001600160a01b0316846001600160601b03841662000f9e565b6040516001600160601b03821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a250505080600101905062000d99565b5050600e80546001600160601b0319166001600160601b03929092169190911790555050565b600062000e978262000ffb565b92915050565b600080808062000eae868662001008565b9097909650945050505050565b600062000ed2836001600160a01b03841662001035565b9392505050565b600062000ef1846001600160a01b0385168462001054565b949350505050565b600062000ed2836001600160a01b03841662001073565b600e5460e0516040516370a0823160e01b81523060048201526000926001600160601b0316916001600160a01b0316906370a0823190602401602060405180830381865afa15801562000f67573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f8d9190620020a0565b62000f999190620020ba565b905090565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000ff69185916200108116565b505050565b600062000e978262001152565b600080806200101885856200115d565b600081815260029690960160205260409095205494959350505050565b6000818152600283016020526040812081905562000ed283836200116b565b6000828152600284016020526040812082905562000ef1848462001179565b600062000ed2838362001187565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656490820152600090620010d0906001600160a01b038516908490620011a0565b80519091501562000ff65780806020019051810190620010f19190620020dd565b62000ff65760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000084565b600062000e97825490565b600062000ed28383620011b1565b600062000ed28383620011de565b600062000ed28383620012e9565b6000818152600183016020526040812054151562000ed2565b606062000ef184846000856200133b565b6000826000018281548110620011cb57620011cb62001de1565b9060005260206000200154905092915050565b60008181526001830160205260408120548015620012d75760006200120560018362001f80565b85549091506000906200121b9060019062001f80565b9050818114620012875760008660000182815481106200123f576200123f62001de1565b906000526020600020015490508087600001848154811062001265576200126562001de1565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200129b576200129b620020fb565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000e97565b600091505062000e97565b5092915050565b6000818152600183016020526040812054620013325750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000e97565b50600062000e97565b6060824710156200139e5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000084565b600080866001600160a01b03168587604051620013bc919062002137565b60006040518083038185875af1925050503d8060008114620013fb576040519150601f19603f3d011682016040523d82523d6000602084013e62001400565b606091505b50909250905062001414878383876200141f565b979650505050505050565b60608315620014935782516000036200148b576001600160a01b0385163b6200148b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000084565b508162000ef1565b62000ef18383815115620014aa5781518083602001fd5b8060405162461bcd60e51b815260040162000084919062002155565b634e487b7160e01b600052604160045260246000fd5b6040516101a081016001600160401b0381118282101715620015025762001502620014c6565b60405290565b60405160a081016001600160401b0381118282101715620015025762001502620014c6565b60405160e081016001600160401b0381118282101715620015025762001502620014c6565b604080519081016001600160401b0381118282101715620015025762001502620014c6565b60405161010081016001600160401b0381118282101715620015025762001502620014c6565b604051601f8201601f191681016001600160401b0381118282101715620015c857620015c8620014c6565b604052919050565b80516001600160a01b0381168114620015e857600080fd5b919050565b80516001600160401b0381168114620015e857600080fd5b805161ffff81168114620015e857600080fd5b805163ffffffff81168114620015e857600080fd5b80518015158114620015e857600080fd5b60006101a082840312156200165257600080fd5b6200165c620014dc565b90506200166982620015d0565b8152620016796020830162001605565b60208201526200168c6040830162001618565b60408201526200169f6060830162001605565b6060820152620016b26080830162001618565b6080820152620016c560a0830162001605565b60a0820152620016d860c0830162001605565b60c0820152620016eb60e08301620015d0565b60e08201526101006200170081840162001618565b908201526101206200171483820162001618565b908201526101406200172883820162001605565b908201526101606200173c83820162001618565b90820152610180620017508382016200162d565b9082015292915050565b80516001600160801b0381168114620015e857600080fd5b6000606082840312156200178557600080fd5b604051606081016001600160401b0381118282101715620017aa57620017aa620014c6565b604052905080620017bb836200162d565b8152620017cb602084016200175a565b6020820152620017de604084016200175a565b60408201525092915050565b60006001600160401b03821115620018065762001806620014c6565b5060051b60200190565b600082601f8301126200182257600080fd5b815160206200183b6200183583620017ea565b6200159d565b82815260a092830285018201928282019190878511156200185b57600080fd5b8387015b85811015620018e85781818a031215620018795760008081fd5b6200188362001508565b6200188e82620015d0565b81526200189d86830162001618565b868201526040620018b0818401620015ed565b908201526060620018c3838201620015ed565b908201526080620018d68382016200162d565b9082015284529284019281016200185f565b5090979650505050505050565b600082601f8301126200190757600080fd5b815160206200191a6200183583620017ea565b82815260e092830285018201928282019190878511156200193a57600080fd5b8387015b85811015620018e85781818a031215620019585760008081fd5b620019626200152d565b6200196d82620015d0565b81526200197c86830162001618565b8682015260406200198f81840162001618565b908201526060620019a283820162001605565b908201526080620019b583820162001618565b9082015260a0620019c883820162001618565b9082015260c0620019db8382016200162d565b9082015284529284019281016200193e565b600082601f830112620019ff57600080fd5b8151602062001a126200183583620017ea565b82815260069290921b8401810191818101908684111562001a3257600080fd5b8286015b8481101562001a88576040818903121562001a515760008081fd5b62001a5b62001552565b62001a6682620015d0565b815262001a7585830162001605565b8186015283529183019160400162001a36565b509695505050505050565b60008060008060008086880361036081121562001aaf57600080fd5b6101008082121562001ac057600080fd5b62001aca62001577565b915062001ad789620015d0565b825262001ae760208a01620015ed565b602083015262001afa60408a01620015ed565b604083015262001b0d60608a01620015ed565b606083015260808901516001600160601b038116811462001b2d57600080fd5b608083015262001b4060a08a01620015d0565b60a083015262001b5360c08a01620015d0565b60c083015262001b6660e08a01620015d0565b60e083015281975062001b7c8a828b016200163e565b9650505062001b90886102a0890162001772565b6103008801519094506001600160401b038082111562001baf57600080fd5b62001bbd8a838b0162001810565b945061032089015191508082111562001bd557600080fd5b62001be38a838b01620018f5565b935061034089015191508082111562001bfb57600080fd5b5062001c0a89828a01620019ed565b9150509295509295509295565b80516001600160a01b03168252602081015162001c3a602084018261ffff169052565b50604081015162001c53604084018263ffffffff169052565b50606081015162001c6a606084018261ffff169052565b50608081015162001c83608084018263ffffffff169052565b5060a081015162001c9a60a084018261ffff169052565b5060c081015162001cb160c084018261ffff169052565b5060e081015162001ccd60e08401826001600160a01b03169052565b506101008181015163ffffffff90811691840191909152610120808301518216908401526101408083015161ffff16908401526101608083015190911690830152610180908101511515910152565b82516001600160a01b031681526020808401516001600160401b0390811691830191909152604080850151821690830152606080850151918216908301526102a082019050608084015162001d7c60808401826001600160601b03169052565b5060a084015162001d9860a08401826001600160a01b03169052565b5060c084015162001db460c08401826001600160a01b03169052565b5060e084015162001dd060e08401826001600160a01b03169052565b5062000ed261010083018462001c17565b634e487b7160e01b600052603260045260246000fd5b602080825282518282018190526000919060409081850190868401855b8281101562001e7957815180516001600160a01b031685528681015163ffffffff1687860152858101516001600160401b03908116878701526060808301519091169086015260809081015115159085015260a0909301929085019060010162001e14565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b8281101562001e7957815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a0808301519091169086015260c09081015115159085015260e0909301929085019060010162001ea3565b6020808252825182820181905260009190848201906040850190845b8181101562001f5e5783516001600160a01b03168352928401929184019160010162001f37565b50909695505050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111562000e975762000e9762001f6a565b60008162001fa85762001fa862001f6a565b506000190190565b63ffffffff818116838216019080821115620012e257620012e262001f6a565b6000604080830163ffffffff8616845260206040602086015281865180845260608701915060208801935060005b818110156200203257845180516001600160a01b0316845284015161ffff1684840152938301939185019160010162001ffe565b509098975050505050505050565b808202811582820484141762000e975762000e9762001f6a565b6000826200207857634e487b7160e01b600052601260045260246000fd5b500490565b6001600160601b03828116828216039080821115620012e257620012e262001f6a565b600060208284031215620020b357600080fd5b5051919050565b8181036000831280158383131683831282161715620012e257620012e262001f6a565b600060208284031215620020f057600080fd5b62000ed2826200162d565b634e487b7160e01b600052603160045260246000fd5b60005b838110156200212e57818101518382015260200162002114565b50506000910152565b600082516200214b81846020870162002111565b9190910192915050565b60208152600082518060208401526200217681604085016020870162002111565b601f01601f19169190910160400192915050565b60805160a05160c05160e0516101005161012051610140516101605161018051615f75620022b86000396000818161036101528181610efa0152613786015260008181610332015281816116f80152613757015260008181610303015281816113ae0152818161141301528181611c7401528181611d02015261372801526000818161026f01528181610a30015281816118200152818161222201528181612b42015261369401526000818161023f01528181611dd30152613664015260008181610210015281816110a50152818161162401528181611a4101528181611b42015281816126dd015281816136350152613a240152600081816102cf01528181611c0e01526136f401526000818161029f0152818161283801526136c4015260006124b60152615f756000f3fe608060405234801561001057600080fd5b50600436106101b95760003560e01c80637437ff9f116100f9578063c92b283211610097578063eff7cc4811610071578063eff7cc48146109de578063f25561fd146109e6578063f2fde38b146109f9578063fbca3b7414610a0c57600080fd5b8063c92b2832146109b0578063d09dc339146109c3578063df0aa9e9146109cb57600080fd5b8063856c8247116100d3578063856c8247146108825780638da5cb5b146108955780639a113c36146108a6578063b06d41bc1461099a57600080fd5b80637437ff9f146106c057806376f6ae761461086757806379ba50971461087a57600080fd5b806348a98aa411610166578063549e946f11610140578063549e946f1461066957806354b714681461067c578063599f64311461069c578063704b6c02146106ad57600080fd5b806348a98aa4146105c7578063504bffe0146105f2578063546719cd1461060557600080fd5b806320487ded1161019757806320487ded146105705780634120fccd146105915780634816f4f7146105b257600080fd5b806306285c69146101be5780631772047e146103a7578063181f5a7714610527575b600080fd5b6103916040805161010081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101919091526040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b60405161039e9190614b86565b60405180910390f35b6104bb6103b5366004614bba565b6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810191909152506001600160a01b03166000908152600c6020908152604091829020825160e081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e0100000000000000000000000000008304909116608082015260ff720100000000000000000000000000000000000083048116151560a0830152730100000000000000000000000000000000000000909204909116151560c082015290565b60405161039e9190600060e08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015260c0830151151560c083015292915050565b6105636040518060400160405280601781526020017f45564d3245564d4f6e52616d7020312e352e302d64657600000000000000000081525081565b60405161039e9190614c27565b61058361057e366004614c68565b610a2c565b60405190815260200161039e565b610599610e82565b60405167ffffffffffffffff909116815260200161039e565b6105c56105c0366004614e76565b610ea9565b005b6105da6105d5366004614fb3565b610ebf565b6040516001600160a01b03909116815260200161039e565b6105c5610600366004614fec565b610f6e565b61060d610f82565b60405161039e919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6105c56106773660046150ea565b611014565b600e546040516bffffffffffffffffffffffff909116815260200161039e565b6002546001600160a01b03166105da565b6105c56106bb366004614bba565b61118d565b61085a604080516101a081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081019190915250604080516101a0810182526005546001600160a01b038082168352600160a01b820461ffff9081166020850152760100000000000000000000000000000000000000000000830463ffffffff908116958501959095527a0100000000000000000000000000000000000000000000000000008304811660608501527c0100000000000000000000000000000000000000000000000000000000928390048516608085015260065480821660a086015262010000808204831660c0870152640100000000820490931660e08601527801000000000000000000000000000000000000000000000000810486166101008601529290920484166101208401526007549182166101408401528104909216610160820152660100000000000090910460ff16151561018082015290565b60405161039e9190615206565b6105c5610875366004615215565b611257565b6105c56112ba565b610599610890366004614bba565b611383565b6000546001600160a01b03166105da565b6109506108b4366004614bba565b604080516080810182526000808252602082018190529181018290526060810191909152506001600160a01b03166000908152600b60209081526040918290208251608081018452905463ffffffff8116825267ffffffffffffffff64010000000082048116938301939093526c0100000000000000000000000081049092169281019290925260ff600160a01b909104161515606082015290565b60408051825163ffffffff16815260208084015167ffffffffffffffff9081169183019190915283830151169181019190915260609182015115159181019190915260800161039e565b6109a261147e565b60405161039e9291906152de565b6105c56109be366004615320565b611579565b6105836115e1565b6105836109d936600461538e565b6116a1565b6105c561252a565b6105c56109f43660046153fa565b6127af565b6105c5610a07366004614bba565b6127c0565b610a1f610a1a3660046154f9565b6127d1565b60405161039e9190615516565b60007f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168367ffffffffffffffff1614610aac576040517fd9a9cd6800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6000610ac3610abe6080850185615563565b612805565b9050610af3610ad56020850185615563565b8351909150610ae760408701876155c8565b90508460200151612992565b6000600b81610b086080870160608801614bba565b6001600160a01b0316815260208082019290925260409081016000208151608081018352905463ffffffff81168252640100000000810467ffffffffffffffff908116948301949094526c01000000000000000000000000810490931691810191909152600160a01b90910460ff16151560608201819052909150610bd557610b976080850160608601614bba565b6040517fa7499d200000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610aa3565b600654600090819064010000000090046001600160a01b031663ffdb4b37610c036080890160608a01614bba565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b03909116600482015267ffffffffffffffff8a1660248201526044016040805180830381865afa158015610c6e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c92919061565c565b90925090506000808080610ca960408b018b6155c8565b90501115610ce357610cd7610cc460808b0160608c01614bba565b86610cd260408d018d6155c8565b612af7565b91945092509050610cff565b8551610cfc9063ffffffff16662386f26fc100006156a5565b92505b60065460009062010000900461ffff1615610d5357610d506dffffffffffffffffffffffffffff607087901c16610d3960208d018d615563565b9050610d4860408e018e6155c8565b905085612ec6565b90505b60208781015160055460009267ffffffffffffffff9092169163ffffffff8716917a010000000000000000000000000000000000000000000000000000900461ffff1690610da3908f018f615563565b610dae9291506156a5565b6005548c51610ddd91760100000000000000000000000000000000000000000000900463ffffffff16906156bc565b610de791906156bc565b610df191906156bc565b610e0b906dffffffffffffffffffffffffffff89166156a5565b610e1591906156a5565b9050867bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1682828a6040015167ffffffffffffffff1688610e5291906156a5565b610e5c91906156bc565b610e6691906156bc565b610e7091906156cf565b99505050505050505050505b92915050565b600e54600090610ea490600160801b900467ffffffffffffffff1660016156f1565b905090565b610eb1612f97565b610ebb8282612fef565b5050565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610f43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f679190615712565b9392505050565b610f76613371565b610f7f816133cb565b50565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff8082168352600160801b80830463ffffffff166020850152600160a01b90920460ff161515938301939093526004548084166060840152049091166080820152610ea4906137c0565b61101c612f97565b6001600160a01b03811661105c576040517f232cb97f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006110666115e1565b905060008112156110a3576040517f02075e0000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036110f5576110f06001600160a01b0384168383613872565b505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526110f09083906001600160a01b038616906370a0823190602401602060405180830381865afa158015611158573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117c919061572f565b6001600160a01b0386169190613872565b6000546001600160a01b031633148015906111b357506002546001600160a01b03163314155b156111ea576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c906020015b60405180910390a150565b61125f612f97565b610ebb8282808060200260200160405190810160405280939291908181526020016000905b828210156112b0576112a160408302860136819003810190615748565b81526020019060010190611284565b50505050506138f2565b6001546001600160a01b031633146113145760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610aa3565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b038082166000908152600d6020526040812054909167ffffffffffffffff909116907f00000000000000000000000000000000000000000000000000000000000000001615610e7c5780600003610e7c576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa15801561145a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f679190615787565b606060008061148d6008613b58565b90508067ffffffffffffffff8111156114a8576114a8614cb8565b6040519080825280602002602001820160405280156114ed57816020015b60408051808201909152600080825260208201528152602001906001900390816114c65790505b50925060005b8181101561155657600080611509600884613b63565b915091506040518060400160405280836001600160a01b031681526020018261ffff16815250868481518110611541576115416157a4565b602090810291909101015250506001016114f3565b5050600e5491926c0100000000000000000000000090920463ffffffff16919050565b6000546001600160a01b0316331480159061159f57506002546001600160a01b03163314155b156115d6576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f7f600382613b81565b600e546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000916bffffffffffffffffffffffff16907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611673573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611697919061572f565b610ea491906157ba565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608086901b1660048201526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa15801561173f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061176391906157da565b1561179a576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0382166117da576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546001600160a01b0316331461181e576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168567ffffffffffffffff1614611897576040517fd9a9cd6800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86166004820152602401610aa3565b60006118a9610abe6080870187615563565b905060006118ba60408701876155c8565b91506118e090506118ce6020880188615563565b90508360000151838560200151612992565b8015611a37576000805b82811015611a25576118ff60408901896155c8565b8281811061190f5761190f6157a4565b90506040020160200135600003611952576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c600061196360408b018b6155c8565b84818110611973576119736157a4565b6119899260206040909202019081019150614bba565b6001600160a01b031681526020810191909152604001600020547201000000000000000000000000000000000000900460ff1615611a1d57611a106119d160408a018a6155c8565b838181106119e1576119e16157a4565b9050604002018036038101906119f791906157f7565b60065464010000000090046001600160a01b0316613d14565b611a1a90836156bc565b91505b6001016118ea565b508015611a3557611a3581613e35565b505b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016611a716080880160608901614bba565b6001600160a01b031603611ad557600e8054869190600090611aa29084906bffffffffffffffffffffffff16615831565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550611bfc565b60065464010000000090046001600160a01b03166241e5be611afd6080890160608a01614bba565b60405160e083901b7fffffffff000000000000000000000000000000000000000000000000000000001681526001600160a01b039182166004820152602481018990527f00000000000000000000000000000000000000000000000000000000000000009091166044820152606401602060405180830381865afa158015611b89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bad919061572f565b600e8054600090611bcd9084906bffffffffffffffffffffffff16615831565b92506101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055505b600e546bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811691161115611c69576040517fe5c7a49100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160200151611dbd577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031615611dbd576001600160a01b0384166000908152600d602052604081205467ffffffffffffffff169003611dbd576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015611d49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6d9190615787565b6001600160a01b0385166000908152600d6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff929092169190911790555b604080516101a08101825267ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001681526001600160a01b03861660208201526000918101611e50611e168a80615563565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613e4292505050565b6001600160a01b03168152602001600e601081819054906101000a900467ffffffffffffffff16611e8090615856565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff168152602001846000015181526020016000151581526020018460200151611f2a576001600160a01b0387166000908152600d602052604081208054909190611f009067ffffffffffffffff16615856565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055611f2d565b60005b67ffffffffffffffff168152602001611f4c60808a0160608b01614bba565b6001600160a01b03168152602001878152602001888060200190611f709190615563565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001611fb760408a018a6155c8565b808060200260200160405190810160405280939291908181526020016000905b8282101561200357611ff4604083028601368190038101906157f7565b81526020019060010190611fd7565b505050505081526020018367ffffffffffffffff81111561202657612026614cb8565b60405190808252806020026020018201604052801561205957816020015b60608152602001906001900390816120445790505b508152600060209091018190529091505b828110156124af57600061208160408a018a6155c8565b83818110612091576120916157a4565b9050604002018036038101906120a791906157f7565b905060006120b98b8360000151610ebf565b90506001600160a01b038116158061216f57506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf0000000000000000000000000000000000000000000000000000000060048201526001600160a01b038216906301ffc9a790602401602060405180830381865afa158015612149573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216d91906157da565b155b156121b45781516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610aa3565b6000816001600160a01b0316639a4575b96040518060a001604052808e80600001906121e09190615563565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525067ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166020808301919091526001600160a01b03808f16604080850191909152918901516060840152885116608090920191909152517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526122ab919060040161587d565b6000604051808303816000875af11580156122ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526122f2919081019061594a565b9050602063ffffffff1681602001515111156123895782516001600160a01b03166000908152600c602090815260409091205490820151516e01000000000000000000000000000090910463ffffffff1610156123895782516040517f36f536ca0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610aa3565b805161239490613e42565b5060408051608081019091526001600160a01b03831660a08201528060c0810160408051808303601f190181529181529082528351602080840191909152808501518383015286516001600160a01b03166000908152600c9091522054606090910190730100000000000000000000000000000000000000900460ff166124295760075462010000900463ffffffff16612458565b84516001600160a01b03166000908152600c60205260409020546a0100000000000000000000900463ffffffff165b63ffffffff16905260405161247091906020016159db565b6040516020818303038152906040528561016001518581518110612496576124966157a4565b602002602001018190525050505080600101905061206a565b506124da817f0000000000000000000000000000000000000000000000000000000000000000613ee8565b6101808201526040517fd0c3c799bf9e2639de44391e7f524d229b2b55f5b1ea94b2bf7da42f7243dddd90612510908390615aef565b60405180910390a16101800151925050505b949350505050565b6000546001600160a01b0316331461258f576002546001600160a01b0316331461258f57612559600833614043565b61258f576040517f195db95800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff1660008190036125e3576040517f990e30bf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546bffffffffffffffffffffffff168181101561262e576040517f8d0f71d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006126386115e1565b1215612670576040517ff4d678b800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600061267d6008613b58565b905060005b8181101561276c57600080612698600884613b63565b90925090506000876126b8836bffffffffffffffffffffffff8a166156a5565b6126c291906156cf565b90506126ce8187615c24565b95506127126001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016846bffffffffffffffffffffffff8416613872565b6040516bffffffffffffffffffffffff821681526001600160a01b038416907f55fdec2aab60a41fa5abb106670eb1006f5aeaee1ba7afea2bc89b5b3ec7678f9060200160405180910390a2505050806001019050612682565b5050600e80547fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166bffffffffffffffffffffffff929092169190911790555050565b6127b7612f97565b610f7f81614058565b6127c8613371565b610f7f816141ca565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260008082526020820152600082900361286657506040805180820190915267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016815260006020820152610e7c565b60006128728385615c49565b90507fe7e230f0000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016128df576128ca8360048187615c91565b8101906128d79190615cbb565b915050610e7c565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016129605760408051808201909152806129408560048189615c91565b81019061294d9190615ce7565b815260006020909101529150610e7c9050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006547801000000000000000000000000000000000000000000000000900463ffffffff16808511156129fb576040517f869337890000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610aa3565b6006547c0100000000000000000000000000000000000000000000000000000000900463ffffffff16841115612a5d576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600554600160a01b900461ffff16831115612aa4576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81612af0576007546601000000000000900460ff1615612af0576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b6000808083815b81811015612eba576000878783818110612b1a57612b1a6157a4565b905060400201803603810190612b3091906157f7565b905060006001600160a01b0316612b6b7f00000000000000000000000000000000000000000000000000000000000000008360000151610ebf565b6001600160a01b031603612bb95780516040517fbf16aab60000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610aa3565b80516001600160a01b03166000908152600c6020908152604091829020825160e081018452905463ffffffff8082168352640100000000820481169383019390935261ffff68010000000000000000820416938201939093526a01000000000000000000008304821660608201526e0100000000000000000000000000008304909116608082015260ff720100000000000000000000000000000000000083048116151560a0830152730100000000000000000000000000000000000000909204909116151560c08201819052612cde57600754612ca29061ffff16662386f26fc100006156a5565b612cac90886156bc565b600754909750612cc89062010000900463ffffffff1687615d00565b9550612cd5602086615d00565b94505050612eb2565b604081015160009061ffff1615612e025760008c6001600160a01b031684600001516001600160a01b031614612da55760065484516040517f4ab35b0b0000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526401000000009092041690634ab35b0b90602401602060405180830381865afa158015612d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9e9190615d1d565b9050612da8565b508a5b620186a0836040015161ffff16612dea8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661428b90919063ffffffff16565b612df491906156a5565b612dfe91906156cf565b9150505b6060820151612e119088615d00565b9650816080015186612e239190615d00565b8251909650600090612e429063ffffffff16662386f26fc100006156a5565b905080821015612e6157612e56818a6156bc565b985050505050612eb2565b6000836020015163ffffffff16662386f26fc10000612e8091906156a5565b905080831115612ea057612e94818b6156bc565b99505050505050612eb2565b612eaa838b6156bc565b995050505050505b600101612afe565b50509450945094915050565b60008063ffffffff8316612edc610180866156a5565b612ee8876102206156bc565b612ef291906156bc565b612efc91906156bc565b6005546006549192506000917c010000000000000000000000000000000000000000000000000000000090910463ffffffff1690612f3e9061ffff16846156a5565b612f4891906156bc565b60065490915062010000900461ffff16612f726dffffffffffffffffffffffffffff8916836156a5565b612f7c91906156a5565b612f8c90655af3107a40006156a5565b979650505050505050565b6000546001600160a01b03163314612fed576002546001600160a01b03163314612fed576040517ffbdb8e5600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60005b825181101561328357600083828151811061300f5761300f6157a4565b60200260200101519050602063ffffffff168160a0015163ffffffff16101561308257805160a08201516040517f24ecdc020000000000000000000000000000000000000000000000000000000081526001600160a01b03909216600483015263ffffffff166024820152604401610aa3565b6040805160e08101825260208381015163ffffffff908116835284840151811682840190815260608087015161ffff9081168688019081526080808a0151861693880193845260a0808b0151871691890191825260c0808c01511515918a019182526001908a018181529b516001600160a01b03166000908152600c9099529990972097518854955192519451915197519a519087167fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000009096169590951764010000000092871692909202919091177fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff166801000000000000000093909216929092027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff16176a010000000000000000000091841691909102177fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff166e01000000000000000000000000000093909216929092027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff1617720100000000000000000000000000000000000094151594909402939093177fffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffff16730100000000000000000000000000000000000000931515939093029290921790915501612ff2565b507ff5791bc457b3bb990493cf5f655db46c25ccf5764c9b99b8969b4c72ea7df9d0826040516132b39190615d38565b60405180910390a160005b815181101561332e57600c60008383815181106132dd576132dd6157a4565b6020908102919091018101516001600160a01b0316825281019190915260400160002080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556001016132be565b50805115610ebb577ffb95a0042158e60a33e7b5bec100f3d95407b1a71bee6633bd54b8887449750b816040516133659190615516565b60405180910390a15050565b6000546001600160a01b03163314612fed5760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610aa3565b60e08101516001600160a01b031661340f576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600560008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548161ffff021916908361ffff16021790555060408201518160000160166101000a81548163ffffffff021916908363ffffffff160217905550606082015181600001601a6101000a81548161ffff021916908361ffff160217905550608082015181600001601c6101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160010160006101000a81548161ffff021916908361ffff16021790555060c08201518160010160026101000a81548161ffff021916908361ffff16021790555060e08201518160010160046101000a8154816001600160a01b0302191690836001600160a01b031602179055506101008201518160010160186101000a81548163ffffffff021916908363ffffffff16021790555061012082015181600101601c6101000a81548163ffffffff021916908363ffffffff1602179055506101408201518160020160006101000a81548161ffff021916908361ffff1602179055506101608201518160020160026101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160020160066101000a81548160ff0219169083151502179055509050507f45b5ad483aa608464c2c7f278bd413d284d7790cdc836e40652e23a0277082206040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152508260405161124c929190615dd8565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261384e82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426138329190615df5565b85608001516fffffffffffffffffffffffffffffffff166142c8565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526110f09084906142f0565b8051604081111561392f576040517fb5a10cfa00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e546c01000000000000000000000000900463ffffffff161561398357600e5463ffffffff6c010000000000000000000000008204166bffffffffffffffffffffffff909116106139835761398361252a565b600061398f6008613b58565b90505b80156139d15760006139b06139a8600184615df5565b600890613b63565b5090506139be6008826143d5565b5050806139ca90615e08565b9050613992565b506000805b82811015613ad95760008482815181106139f2576139f26157a4565b60200260200101516000015190506000858381518110613a1457613a146157a4565b60200260200101516020015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480613a6957506001600160a01b038216155b15613aab576040517f4de938d10000000000000000000000000000000000000000000000000000000081526001600160a01b0383166004820152602401610aa3565b613abb60088361ffff84166143ea565b50613aca61ffff821685615d00565b935050508060010190506139d6565b50600e80547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff166c0100000000000000000000000063ffffffff8416021790556040517f8c337bff38141c507abd25c547606bdde78fe8c12e941ab613f3a565fea6cd2490613b4b9083908690615e3d565b60405180910390a1505050565b6000610e7c82614400565b6000808080613b72868661440b565b909450925050505b9250929050565b8154600090613b9d90600160801b900463ffffffff1642615df5565b90508015613c255760018301548354613bd8916fffffffffffffffffffffffffffffffff808216928116918591600160801b909104166142c8565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617600160801b4263ffffffff16021783555b60208201518354613c4b916fffffffffffffffffffffffffffffffff9081169116614436565b835483511515600160a01b027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff9283161717845560208301516040808501518316600160801b0291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990613b4b9084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613d7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d9e9190615e5c565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116600003613e075783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b039091166004820152602401610aa3565b6020840151612522907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83169061428b565b610f7f600382600061444c565b60008151602014613e8157816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610aa39190614c27565b600082806020019051810190613e97919061572f565b90506001600160a01b03811180613eaf575061040081105b15610e7c57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610aa39190614c27565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001613f7e9897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001613fb79190615e8f565b60405160208183030381529060405280519060200120876101600151604051602001613fe39190615ea2565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b6000610f67836001600160a01b038416614756565b60005b815181101561419a576000828281518110614078576140786157a4565b60209081029190910181015160408051608080820183528385015163ffffffff90811683528385015167ffffffffffffffff908116848801908152606080880151831686880190815294880151151590860190815296516001600160a01b03166000908152600b90985294909620925183549451925195511515600160a01b027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9688166c0100000000000000000000000002969096167fffffffffffffffffffffff000000000000000000ffffffffffffffffffffffff93909716640100000000027fffffffffffffffffffffffffffffffffffffffff0000000000000000000000009095169116179290921791909116929092171790555060010161405b565b507f067924bf9277d905a9a4631a06d959bc032ace86b3caa835ae7e403d4f39010e8160405161124c9190615eb5565b336001600160a01b038216036142225760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610aa3565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000670de0b6b3a76400006142be837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166156a5565b610f6791906156cf565b60006142e7856142d884866156a5565b6142e290876156bc565b614436565b95945050505050565b6000614345826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166147629092919063ffffffff16565b8051909150156110f0578080602001905181019061436391906157da565b6110f05760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610aa3565b6000610f67836001600160a01b038416614771565b6000612522846001600160a01b0385168461478e565b6000610e7c826147ab565b6000808061441985856147b5565b600081815260029690960160205260409095205494959350505050565b60008183106144455781610f67565b5090919050565b8254600160a01b900460ff161580614462575081155b1561446c57505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906144a590600160801b900463ffffffff1642615df5565b9050801561454b57818311156144e7576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461451490839085908490600160801b90046fffffffffffffffffffffffffffffffff166142c8565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff16600160801b4263ffffffff160217875592505b848210156145e8576001600160a01b03841661459d576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610aa3565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b0385166044820152606401610aa3565b848310156146d457600186810154600160801b90046fffffffffffffffffffffffffffffffff1690600090829061461f9082615df5565b614629878a615df5565b61463391906156bc565b61463d91906156cf565b90506001600160a01b038616614689576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610aa3565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b0387166044820152606401610aa3565b6146de8584615df5565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610f6783836147c1565b606061252284846000856147d9565b60008181526002830160205260408120819055610f6783836148c0565b6000828152600284016020526040812082905561252284846148cc565b6000610e7c825490565b6000610f6783836148d8565b60008181526001830160205260408120541515610f67565b6060824710156148515760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610aa3565b600080866001600160a01b0316858760405161486d9190615f36565b60006040518083038185875af1925050503d80600081146148aa576040519150601f19603f3d011682016040523d82523d6000602084013e6148af565b606091505b5091509150612f8c87838387614902565b6000610f67838361497b565b6000610f678383614a75565b60008260000182815481106148ef576148ef6157a4565b9060005260206000200154905092915050565b6060831561497157825160000361496a576001600160a01b0385163b61496a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610aa3565b5081612522565b6125228383614ac4565b60008181526001830160205260408120548015614a6457600061499f600183615df5565b85549091506000906149b390600190615df5565b9050818114614a185760008660000182815481106149d3576149d36157a4565b90600052602060002001549050808760000184815481106149f6576149f66157a4565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080614a2957614a29615f52565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610e7c565b6000915050610e7c565b5092915050565b6000818152600183016020526040812054614abc57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e7c565b506000610e7c565b815115614ad45781518083602001fd5b8060405162461bcd60e51b8152600401610aa39190614c27565b6001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015280606085015116606086015250506bffffffffffffffffffffffff60808301511660808401528060a08301511660a08401525060c0810151614b6b60c08401826001600160a01b03169052565b5060e08101516110f060e08401826001600160a01b03169052565b6101008101610e7c8284614aee565b6001600160a01b0381168114610f7f57600080fd5b8035614bb581614b95565b919050565b600060208284031215614bcc57600080fd5b8135610f6781614b95565b60005b83811015614bf2578181015183820152602001614bda565b50506000910152565b60008151808452614c13816020860160208601614bd7565b601f01601f19169290920160200192915050565b602081526000610f676020830184614bfb565b67ffffffffffffffff81168114610f7f57600080fd5b600060a08284031215614c6257600080fd5b50919050565b60008060408385031215614c7b57600080fd5b8235614c8681614c3a565b9150602083013567ffffffffffffffff811115614ca257600080fd5b614cae85828601614c50565b9150509250929050565b634e487b7160e01b600052604160045260246000fd5b60405160e0810167ffffffffffffffff81118282101715614cf157614cf1614cb8565b60405290565b6040516101a0810167ffffffffffffffff81118282101715614cf157614cf1614cb8565b60405160a0810167ffffffffffffffff81118282101715614cf157614cf1614cb8565b6040805190810167ffffffffffffffff81118282101715614cf157614cf1614cb8565b604051601f8201601f1916810167ffffffffffffffff81118282101715614d8a57614d8a614cb8565b604052919050565b600067ffffffffffffffff821115614dac57614dac614cb8565b5060051b60200190565b63ffffffff81168114610f7f57600080fd5b8035614bb581614db6565b803561ffff81168114614bb557600080fd5b8015158114610f7f57600080fd5b8035614bb581614de5565b600082601f830112614e0f57600080fd5b81356020614e24614e1f83614d92565b614d61565b8083825260208201915060208460051b870101935086841115614e4657600080fd5b602086015b84811015614e6b578035614e5e81614b95565b8352918301918301614e4b565b509695505050505050565b6000806040808486031215614e8a57600080fd5b833567ffffffffffffffff80821115614ea257600080fd5b818601915086601f830112614eb657600080fd5b81356020614ec6614e1f83614d92565b82815260e0928302850182019282820191908b851115614ee557600080fd5b958301955b84871015614f8e5780878d031215614f025760008081fd5b614f0a614cce565b8735614f1581614b95565b815287850135614f2481614db6565b8186015287890135614f3581614db6565b818a01526060614f46898201614dd3565b90820152608088810135614f5981614db6565b9082015260a0614f6a898201614dc8565b9082015260c0614f7b898201614df3565b9082015283529586019591830191614eea565b5097505087013593505080831115614fa557600080fd5b5050614cae85828601614dfe565b60008060408385031215614fc657600080fd5b8235614fd181614c3a565b91506020830135614fe181614b95565b809150509250929050565b60006101a08284031215614fff57600080fd5b615007614cf7565b61501083614baa565b815261501e60208401614dd3565b602082015261502f60408401614dc8565b604082015261504060608401614dd3565b606082015261505160808401614dc8565b608082015261506260a08401614dd3565b60a082015261507360c08401614dd3565b60c082015261508460e08401614baa565b60e0820152610100615097818501614dc8565b908201526101206150a9848201614dc8565b908201526101406150bb848201614dd3565b908201526101606150cd848201614dc8565b908201526101806150df848201614df3565b908201529392505050565b600080604083850312156150fd57600080fd5b8235614fd181614b95565b80516001600160a01b03168252602081015161512a602084018261ffff169052565b506040810151615142604084018263ffffffff169052565b506060810151615158606084018261ffff169052565b506080810151615170608084018263ffffffff169052565b5060a081015161518660a084018261ffff169052565b5060c081015161519c60c084018261ffff169052565b5060e08101516151b760e08401826001600160a01b03169052565b506101008181015163ffffffff90811691840191909152610120808301518216908401526101408083015161ffff16908401526101608083015190911690830152610180908101511515910152565b6101a08101610e7c8284615108565b6000806020838503121561522857600080fd5b823567ffffffffffffffff8082111561524057600080fd5b818501915085601f83011261525457600080fd5b81358181111561526357600080fd5b8660208260061b850101111561527857600080fd5b60209290920196919550909350505050565b60008151808452602080850194506020840160005b838110156152d357815180516001600160a01b0316885283015161ffff16838801526040909601959082019060010161529f565b509495945050505050565b6040815260006152f1604083018561528a565b90508260208301529392505050565b80356fffffffffffffffffffffffffffffffff81168114614bb557600080fd5b60006060828403121561533257600080fd5b6040516060810181811067ffffffffffffffff8211171561535557615355614cb8565b604052823561536381614de5565b815261537160208401615300565b602082015261538260408401615300565b60408201529392505050565b600080600080608085870312156153a457600080fd5b84356153af81614c3a565b9350602085013567ffffffffffffffff8111156153cb57600080fd5b6153d787828801614c50565b9350506040850135915060608501356153ef81614b95565b939692955090935050565b6000602080838503121561540d57600080fd5b823567ffffffffffffffff81111561542457600080fd5b8301601f8101851361543557600080fd5b8035615443614e1f82614d92565b81815260a0918202830184019184820191908884111561546257600080fd5b938501935b838510156154ed5780858a03121561547f5760008081fd5b615487614d1b565b853561549281614b95565b8152858701356154a181614db6565b818801526040868101356154b481614c3a565b908201526060868101356154c781614c3a565b908201526080868101356154da81614de5565b9082015283529384019391850191615467565b50979650505050505050565b60006020828403121561550b57600080fd5b8135610f6781614c3a565b6020808252825182820181905260009190848201906040850190845b818110156155575783516001600160a01b031683529284019291840191600101615532565b50909695505050505050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261559857600080fd5b83018035915067ffffffffffffffff8211156155b357600080fd5b602001915036819003821315613b7a57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126155fd57600080fd5b83018035915067ffffffffffffffff82111561561857600080fd5b6020019150600681901b3603821315613b7a57600080fd5b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81168114614bb557600080fd5b6000806040838503121561566f57600080fd5b61567883615630565b915061568660208401615630565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610e7c57610e7c61568f565b80820180821115610e7c57610e7c61568f565b6000826156ec57634e487b7160e01b600052601260045260246000fd5b500490565b67ffffffffffffffff818116838216019080821115614a6e57614a6e61568f565b60006020828403121561572457600080fd5b8151610f6781614b95565b60006020828403121561574157600080fd5b5051919050565b60006040828403121561575a57600080fd5b615762614d3e565b823561576d81614b95565b815261577b60208401614dd3565b60208201529392505050565b60006020828403121561579957600080fd5b8151610f6781614c3a565b634e487b7160e01b600052603260045260246000fd5b8181036000831280158383131683831282161715614a6e57614a6e61568f565b6000602082840312156157ec57600080fd5b8151610f6781614de5565b60006040828403121561580957600080fd5b615811614d3e565b823561581c81614b95565b81526020928301359281019290925250919050565b6bffffffffffffffffffffffff818116838216019080821115614a6e57614a6e61568f565b600067ffffffffffffffff8083168181036158735761587361568f565b6001019392505050565b602081526000825160a0602084015261589960c0840182614bfb565b905067ffffffffffffffff602085015116604084015260408401516001600160a01b038082166060860152606086015160808601528060808701511660a086015250508091505092915050565b600082601f8301126158f757600080fd5b815167ffffffffffffffff81111561591157615911614cb8565b6159246020601f19601f84011601614d61565b81815284602083860101111561593957600080fd5b612522826020830160208701614bd7565b60006020828403121561595c57600080fd5b815167ffffffffffffffff8082111561597457600080fd5b908301906040828603121561598857600080fd5b615990614d3e565b82518281111561599f57600080fd5b6159ab878286016158e6565b8252506020830151828111156159c057600080fd5b6159cc878286016158e6565b60208301525095945050505050565b6020815260008251608060208401526159f760a0840182614bfb565b90506020840151601f1980858403016040860152615a158383614bfb565b9250604086015191508085840301606086015250615a338282614bfb565b91505063ffffffff60608501511660808401528091505092915050565b60008151808452602080850194506020840160005b838110156152d357815180516001600160a01b031688528301518388015260409096019590820190600101615a65565b60008282518085526020808601955060208260051b8401016020860160005b84811015615ae257601f19868403018952615ad0838351614bfb565b98840198925090830190600101615ab4565b5090979650505050505050565b60208152615b0a60208201835167ffffffffffffffff169052565b60006020830151615b2660408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015167ffffffffffffffff8116608084015250608083015160a083015260a0830151615b6f60c084018215159052565b5060c083015167ffffffffffffffff811660e08401525060e0830151610100615ba2818501836001600160a01b03169052565b840151610120848101919091528401516101a061014080860182905291925090615bd06101c0860184614bfb565b9250808601519050601f19610160818786030181880152615bf18584615a50565b945080880151925050610180818786030181880152615c108584615a95565b970151959092019490945250929392505050565b6bffffffffffffffffffffffff828116828216039080821115614a6e57614a6e61568f565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015615c895780818660040360031b1b83161692505b505092915050565b60008085851115615ca157600080fd5b83861115615cae57600080fd5b5050820193919092039150565b600060408284031215615ccd57600080fd5b615cd5614d3e565b82358152602083013561577b81614de5565b600060208284031215615cf957600080fd5b5035919050565b63ffffffff818116838216019080821115614a6e57614a6e61568f565b600060208284031215615d2f57600080fd5b610f6782615630565b602080825282518282018190526000919060409081850190868401855b82811015615dcb57815180516001600160a01b031685528681015163ffffffff908116888701528682015181168787015260608083015161ffff169087015260808083015182169087015260a0808301519091169086015260c09081015115159085015260e09093019290850190600101615d55565b5091979650505050505050565b6102a08101615de78285614aee565b610f67610100830184615108565b81810381811115610e7c57610e7c61568f565b600081615e1757615e1761568f565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b63ffffffff83168152604060208201526000612522604083018461528a565b600060408284031215615e6e57600080fd5b615e76614d3e565b615e7f83615630565b8152602083015161577b81614db6565b602081526000610f676020830184615a50565b602081526000610f676020830184615a95565b602080825282518282018190526000919060409081850190868401855b82811015615dcb57815180516001600160a01b031685528681015163ffffffff16878601528581015167ffffffffffffffff908116878701526060808301519091169086015260809081015115159085015260a09093019290850190600101615ed2565b60008251615f48818460208701614bd7565b9190910192915050565b634e487b7160e01b600052603160045260246000fdfea164736f6c6343000818000a",
}
var EVM2EVMOnRampABI = EVM2EVMOnRampMetaData.ABI
@@ -2279,7 +2278,7 @@ func (EVM2EVMOnRampConfigChanged) Topic() common.Hash {
}
func (EVM2EVMOnRampConfigSet) Topic() common.Hash {
- return common.HexToHash("0xe375c8cb6ea9807cd0371503b632b93da5ee0f1f64205db8b5b28b95d6b588b0")
+ return common.HexToHash("0x45b5ad483aa608464c2c7f278bd413d284d7790cdc836e40652e23a027708220")
}
func (EVM2EVMOnRampFeeConfigSet) Topic() common.Hash {
diff --git a/core/gethwrappers/ccip/generated/lock_release_token_pool/lock_release_token_pool.go b/core/gethwrappers/ccip/generated/lock_release_token_pool/lock_release_token_pool.go
index fe2ac3f87e..b2ee5137da 100644
--- a/core/gethwrappers/ccip/generated/lock_release_token_pool/lock_release_token_pool.go
+++ b/core/gethwrappers/ccip/generated/lock_release_token_pool/lock_release_token_pool.go
@@ -82,8 +82,8 @@ type TokenPoolChainUpdate struct {
}
var LockReleaseTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"acceptLiquidity\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientLiquidity\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LiquidityNotAccepted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canAcceptLiquidity\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRebalancer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"provideLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rebalancer\",\"type\":\"address\"}],\"name\":\"setRebalancer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b506040516200487838038062004878833981016040819052620000359162000565565b848484833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c3816200017e565b5050506001600160a01b0384161580620000e457506001600160a01b038116155b80620000f757506001600160a01b038216155b1562000116576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c052620001695760408051600081526020810190915262000169908462000229565b5050505090151560e05250620006d692505050565b336001600160a01b03821603620001d85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200024a576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002d55760008382815181106200026e576200026e62000688565b602090810291909101015190506200028860028262000386565b15620002cb576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200024d565b5060005b815181101562000381576000828281518110620002fa57620002fa62000688565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000326575062000378565b62000333600282620003a6565b1562000376576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002d9565b505050565b60006200039d836001600160a01b038416620003bd565b90505b92915050565b60006200039d836001600160a01b038416620004c1565b60008181526001830160205260408120548015620004b6576000620003e46001836200069e565b8554909150600090620003fa906001906200069e565b9050818114620004665760008660000182815481106200041e576200041e62000688565b906000526020600020015490508087600001848154811062000444576200044462000688565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200047a576200047a620006c0565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620003a0565b6000915050620003a0565b60008181526001830160205260408120546200050a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003a0565b506000620003a0565b6001600160a01b03811681146200052957600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200054f8162000513565b919050565b805180151581146200054f57600080fd5b600080600080600060a086880312156200057e57600080fd5b85516200058b8162000513565b602087810151919650906001600160401b0380821115620005ab57600080fd5b818901915089601f830112620005c057600080fd5b815181811115620005d557620005d56200052c565b8060051b604051601f19603f83011681018181108582111715620005fd57620005fd6200052c565b60405291825284820192508381018501918c8311156200061c57600080fd5b938501935b828510156200064557620006358562000542565b8452938501939285019262000621565b8099505050505050506200065c6040870162000542565b92506200066c6060870162000554565b91506200067c6080870162000542565b90509295509295909350565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003a057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e05161410662000772600039600081816104d1015261163801526000818161057e01528181611bd4015261267901526000818161055801528181611a050152611e8a015260008181610285015281816102da0152818161075c0152818161082e015281816108bf015281816116fa0152818161192501528181611daa0152818161260f015261286401526141066000f3fe608060405234801561001057600080fd5b50600436106101e55760003560e01c80638da5cb5b1161010f578063c4bffe2b116100a2578063dc0bd97111610071578063dc0bd97114610556578063e0351e131461057c578063eb521a4c146105a2578063f2fde38b146105b557600080fd5b8063c4bffe2b14610508578063c75eea9c1461051d578063cf7401f314610530578063db6327dc1461054357600080fd5b8063b0f479a1116100de578063b0f479a11461049e578063b7946580146104bc578063bb98546b146104cf578063c0d78655146104f557600080fd5b80638da5cb5b146103dc5780639a4575b9146103fa578063a7cd63b71461041a578063af58d59f1461042f57600080fd5b8063432a6ba31161018757806378a010b21161015657806378a010b21461039b57806379ba5097146103ae5780637d54534e146103b65780638926f54f146103c957600080fd5b8063432a6ba31461033957806354c8a4f3146103575780636cfd15531461036a5780636d3d1a581461037d57600080fd5b8063181f5a77116101c3578063181f5a771461024757806321df0da714610283578063240028e8146102ca578063390775371461031757600080fd5b806301ffc9a7146101ea5780630a2fd493146102125780630a861f2a14610232575b600080fd5b6101fd6101f836600461320e565b6105c8565b60405190151581526020015b60405180910390f35b61022561022036600461326d565b610624565b60405161020991906132f6565b610245610240366004613309565b6106d4565b005b6102256040518060400160405280601e81526020017f4c6f636b52656c65617365546f6b656e506f6f6c20312e352e302d646576000081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b6101fd6102d836600461334f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b61032a61032536600461336c565b610885565b60405190518152602001610209565b60085473ffffffffffffffffffffffffffffffffffffffff166102a5565b6102456103653660046133f4565b61097b565b61024561037836600461334f565b6109f6565b60095473ffffffffffffffffffffffffffffffffffffffff166102a5565b6102456103a9366004613460565b610a45565b610245610bb4565b6102456103c436600461334f565b610cb1565b6101fd6103d736600461326d565b610d00565b60005473ffffffffffffffffffffffffffffffffffffffff166102a5565b61040d6104083660046134e3565b610d17565b604051610209919061351e565b610422610db1565b604051610209919061357e565b61044261043d36600461326d565b610dc2565b604051610209919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff166102a5565b6102256104ca36600461326d565b610e97565b7f00000000000000000000000000000000000000000000000000000000000000006101fd565b61024561050336600461334f565b610ec2565b610510610f9d565b60405161020991906135d8565b61044261052b36600461326d565b611055565b61024561053e366004613740565b611127565b610245610551366004613785565b6111b0565b7f00000000000000000000000000000000000000000000000000000000000000006102a5565b7f00000000000000000000000000000000000000000000000000000000000000006101fd565b6102456105b0366004613309565b611636565b6102456105c336600461334f565b611752565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fe1d4056600000000000000000000000000000000000000000000000000000000148061061e575061061e82611766565b92915050565b67ffffffffffffffff8116600090815260076020526040902060040180546060919061064f906137c7565b80601f016020809104026020016040519081016040528092919081815260200182805461067b906137c7565b80156106c85780601f1061069d576101008083540402835291602001916106c8565b820191906000526020600020905b8154815290600101906020018083116106ab57829003601f168201915b50505050509050919050565b60085473ffffffffffffffffffffffffffffffffffffffff16331461072c576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156107b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107dc919061381a565b1015610814576040517fbb55fd2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61085573ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016338361184a565b604051819033907fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf984017171990600090a350565b6040805160208101909152600081526108a56108a0836138de565b61191e565b6108ea73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001633606085013561184a565b6108fa606083016040840161334f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52846060013560405161095c91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b610983611b4f565b6109f084848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611bd292505050565b50505050565b6109fe611b4f565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610a4d611b4f565b610a5683610d00565b610a98576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610723565b67ffffffffffffffff831660009081526007602052604081206004018054610abf906137c7565b80601f0160208091040260200160405190810160405280929190818152602001828054610aeb906137c7565b8015610b385780601f10610b0d57610100808354040283529160200191610b38565b820191906000526020600020905b815481529060010190602001808311610b1b57829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610b67838583613a23565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610ba693929190613b3e565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610c35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610723565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610cb9611b4f565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600061061e600567ffffffffffffffff8416611d88565b6040805180820190915260608082526020820152610d3c610d3783613ba2565b611da3565b6040516060830135815233907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060200160405180910390a26040518060400160405280610d968460200160208101906104ca919061326d565b81526040805160208181019092526000815291015292915050565b6060610dbd6002611f6d565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261061e90611f7a565b67ffffffffffffffff8116600090815260076020526040902060050180546060919061064f906137c7565b610eca611b4f565b73ffffffffffffffffffffffffffffffffffffffff8116610f17576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b60606000610fab6005611f6d565b90506000815167ffffffffffffffff811115610fc957610fc961361a565b604051908082528060200260200182016040528015610ff2578160200160208202803683370190505b50905060005b825181101561104e5782818151811061101357611013613c44565b602002602001015182828151811061102d5761102d613c44565b67ffffffffffffffff90921660209283029190910190910152600101610ff8565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261061e90611f7a565b60095473ffffffffffffffffffffffffffffffffffffffff163314801590611167575060005473ffffffffffffffffffffffffffffffffffffffff163314155b156111a0576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610723565b6111ab83838361202c565b505050565b6111b8611b4f565b60005b818110156111ab5760008383838181106111d7576111d7613c44565b90506020028101906111e99190613c73565b6111f290613cb1565b90506112078160800151826020015115612116565b61121a8160a00151826020015115612116565b80602001511561151657805161123c9060059067ffffffffffffffff1661224f565b6112815780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610723565b60408101515115806112965750606081015151155b156112cd576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906114ae9082613d65565b50606082015160058201906114c39082613d65565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506115099493929190613e7f565b60405180910390a161162d565b805161152e9060059067ffffffffffffffff1661225b565b6115735780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610723565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906115dc60048301826131c0565b6115ea6005830160006131c0565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b506001016111bb565b7f000000000000000000000000000000000000000000000000000000000000000061168d576040517fe93f8fa400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085473ffffffffffffffffffffffffffffffffffffffff1633146116e0576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610723565b61172273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612267565b604051819033907fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb31208890600090a350565b61175a611b4f565b611763816122c5565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806117f957507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061061e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526111ab9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526123ba565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146119b35760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610723565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a859190613f18565b15611abc576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ac981602001516124c6565b6000611ad88260200151610624565b9050805160001480611afc575080805190602001208260a001518051906020012014155b15611b39578160a001516040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161072391906132f6565b611b4b826020015183606001516125ec565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bd0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610723565b565b7f0000000000000000000000000000000000000000000000000000000000000000611c29576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611cbf576000838281518110611c4957611c49613c44565b60200260200101519050611c6781600261263390919063ffffffff16565b15611cb65760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611c2c565b5060005b81518110156111ab576000828281518110611ce057611ce0613c44565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d245750611d80565b611d2f600282612655565b15611d7e5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611cc3565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611e385760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610723565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611ee6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f0a9190613f18565b15611f41576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611f4e8160400151612677565b611f5b81602001516126f6565b61176381602001518260600151612844565b60606000611d9c83612888565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261200882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611fec9190613f64565b85608001516fffffffffffffffffffffffffffffffff166128e3565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b61203583610d00565b612077576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610723565b612082826000612116565b67ffffffffffffffff831660009081526007602052604090206120a5908361290d565b6120b0816000612116565b67ffffffffffffffff831660009081526007602052604090206120d6906002018261290d565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b83838360405161210993929190613f77565b60405180910390a1505050565b8151156121dd5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff1610158061216c575060408201516fffffffffffffffffffffffffffffffff16155b156121a557816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016107239190613ffa565b8015611b4b576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580612216575060208201516fffffffffffffffffffffffffffffffff1615155b15611b4b57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016107239190613ffa565b6000611d9c8383612aaf565b6000611d9c8383612afe565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526109f09085907f23b872dd000000000000000000000000000000000000000000000000000000009060840161189c565b3373ffffffffffffffffffffffffffffffffffffffff821603612344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610723565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061241c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612bf19092919063ffffffff16565b8051909150156111ab578080602001905181019061243a9190613f18565b6111ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610723565b6124cf81610d00565b612511576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610723565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612590573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b49190613f18565b611763576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610723565b67ffffffffffffffff82166000908152600760205260409020611b4b90600201827f0000000000000000000000000000000000000000000000000000000000000000612c00565b6000611d9c8373ffffffffffffffffffffffffffffffffffffffff8416612afe565b6000611d9c8373ffffffffffffffffffffffffffffffffffffffff8416612aaf565b7f000000000000000000000000000000000000000000000000000000000000000015611763576126a8600282612f83565b611763576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610723565b6126ff81610d00565b612741576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610723565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa1580156127ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127de9190614036565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611763576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610723565b67ffffffffffffffff82166000908152600760205260409020611b4b90827f0000000000000000000000000000000000000000000000000000000000000000612c00565b6060816000018054806020026020016040519081016040528092919081815260200182805480156106c857602002820191906000526020600020905b8154815260200190600101908083116128c45750505050509050919050565b6000612902856128f38486614053565b6128fd908761406a565b612fb2565b90505b949350505050565b815460009061293690700100000000000000000000000000000000900463ffffffff1642613f64565b905080156129d8576001830154835461297e916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166128e3565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546129fe916fffffffffffffffffffffffffffffffff9081169116612fb2565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612109908490613ffa565b6000818152600183016020526040812054612af65750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561061e565b50600061061e565b60008181526001830160205260408120548015612be7576000612b22600183613f64565b8554909150600090612b3690600190613f64565b9050818114612b9b576000866000018281548110612b5657612b56613c44565b9060005260206000200154905080876000018481548110612b7957612b79613c44565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612bac57612bac61407d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061061e565b600091505061061e565b60606129058484600085612fc8565b825474010000000000000000000000000000000000000000900460ff161580612c27575081155b15612c3157505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612c7790700100000000000000000000000000000000900463ffffffff1642613f64565b90508015612d375781831115612cb9576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612cf39083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166128e3565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612dee5773ffffffffffffffffffffffffffffffffffffffff8416612d96576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610723565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610723565b84831015612f015760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612e329082613f64565b612e3c878a613f64565b612e46919061406a565b612e5091906140ac565b905073ffffffffffffffffffffffffffffffffffffffff8616612ea9576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610723565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610723565b612f0b8584613f64565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611d9c565b6000818310612fc15781611d9c565b5090919050565b60608247101561305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610723565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161308391906140e7565b60006040518083038185875af1925050503d80600081146130c0576040519150601f19603f3d011682016040523d82523d6000602084013e6130c5565b606091505b50915091506130d6878383876130e1565b979650505050505050565b606083156131775782516000036131705773ffffffffffffffffffffffffffffffffffffffff85163b613170576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610723565b5081612905565b612905838381511561318c5781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072391906132f6565b5080546131cc906137c7565b6000825580601f106131dc575050565b601f01602090049060005260206000209081019061176391905b8082111561320a57600081556001016131f6565b5090565b60006020828403121561322057600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611d9c57600080fd5b803567ffffffffffffffff8116811461326857600080fd5b919050565b60006020828403121561327f57600080fd5b611d9c82613250565b60005b838110156132a357818101518382015260200161328b565b50506000910152565b600081518084526132c4816020860160208601613288565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611d9c60208301846132ac565b60006020828403121561331b57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461176357600080fd5b803561326881613322565b60006020828403121561336157600080fd5b8135611d9c81613322565b60006020828403121561337e57600080fd5b813567ffffffffffffffff81111561339557600080fd5b82016101008185031215611d9c57600080fd5b60008083601f8401126133ba57600080fd5b50813567ffffffffffffffff8111156133d257600080fd5b6020830191508360208260051b85010111156133ed57600080fd5b9250929050565b6000806000806040858703121561340a57600080fd5b843567ffffffffffffffff8082111561342257600080fd5b61342e888389016133a8565b9096509450602087013591508082111561344757600080fd5b50613454878288016133a8565b95989497509550505050565b60008060006040848603121561347557600080fd5b61347e84613250565b9250602084013567ffffffffffffffff8082111561349b57600080fd5b818601915086601f8301126134af57600080fd5b8135818111156134be57600080fd5b8760208285010111156134d057600080fd5b6020830194508093505050509250925092565b6000602082840312156134f557600080fd5b813567ffffffffffffffff81111561350c57600080fd5b820160a08185031215611d9c57600080fd5b60208152600082516040602084015261353a60608401826132ac565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084830301604085015261357582826132ac565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156135cc57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161359a565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156135cc57835167ffffffffffffffff16835292840192918401916001016135f4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff8111828210171561366d5761366d61361a565b60405290565b60405160c0810167ffffffffffffffff8111828210171561366d5761366d61361a565b801515811461176357600080fd5b803561326881613696565b80356fffffffffffffffffffffffffffffffff8116811461326857600080fd5b6000606082840312156136e157600080fd5b6040516060810181811067ffffffffffffffff821117156137045761370461361a565b604052905080823561371581613696565b8152613723602084016136af565b6020820152613734604084016136af565b60408201525092915050565b600080600060e0848603121561375557600080fd5b61375e84613250565b925061376d85602086016136cf565b915061377c85608086016136cf565b90509250925092565b6000806020838503121561379857600080fd5b823567ffffffffffffffff8111156137af57600080fd5b6137bb858286016133a8565b90969095509350505050565b600181811c908216806137db57607f821691505b602082108103613814577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561382c57600080fd5b5051919050565b600082601f83011261384457600080fd5b813567ffffffffffffffff8082111561385f5761385f61361a565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156138a5576138a561361a565b816040528381528660208588010111156138be57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600061010082360312156138f157600080fd5b6138f9613649565b823567ffffffffffffffff8082111561391157600080fd5b61391d36838701613833565b835261392b60208601613250565b602084015261393c60408601613344565b60408401526060850135606084015261395760808601613344565b608084015260a085013591508082111561397057600080fd5b61397c36838701613833565b60a084015260c085013591508082111561399557600080fd5b6139a136838701613833565b60c084015260e08501359150808211156139ba57600080fd5b506139c736828601613833565b60e08301525092915050565b601f8211156111ab576000816000526020600020601f850160051c810160208610156139fc5750805b601f850160051c820191505b81811015613a1b57828155600101613a08565b505050505050565b67ffffffffffffffff831115613a3b57613a3b61361a565b613a4f83613a4983546137c7565b836139d3565b6000601f841160018114613aa15760008515613a6b5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355613b37565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613af05786850135825560209485019460019092019101613ad0565b5086821015613b2b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b604081526000613b5160408301866132ac565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a08236031215613bb457600080fd5b60405160a0810167ffffffffffffffff8282108183111715613bd857613bd861361a565b816040528435915080821115613bed57600080fd5b50613bfa36828601613833565b825250613c0960208401613250565b60208201526040830135613c1c81613322565b6040820152606083810135908201526080830135613c3981613322565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1833603018112613ca757600080fd5b9190910192915050565b60006101408236031215613cc457600080fd5b613ccc613673565b613cd583613250565b8152613ce3602084016136a4565b6020820152604083013567ffffffffffffffff80821115613d0357600080fd5b613d0f36838701613833565b60408401526060850135915080821115613d2857600080fd5b50613d3536828601613833565b606083015250613d4836608085016136cf565b6080820152613d5a3660e085016136cf565b60a082015292915050565b815167ffffffffffffffff811115613d7f57613d7f61361a565b613d9381613d8d84546137c7565b846139d3565b602080601f831160018114613de65760008415613db05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a1b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613e3357888601518255948401946001909101908401613e14565b5085821015613e6f57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613ea3818401876132ac565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff9081166060870152908701511660808501529150613ee19050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152613575565b600060208284031215613f2a57600080fd5b8151611d9c81613696565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561061e5761061e613f35565b67ffffffffffffffff8416815260e08101613fc360208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152612905565b6060810161061e82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561404857600080fd5b8151611d9c81613322565b808202811582820484141761061e5761061e613f35565b8082018082111561061e5761061e613f35565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826140e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008251613ca781846020870161328856fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"acceptLiquidity\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientLiquidity\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LiquidityNotAccepted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canAcceptLiquidity\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRebalancer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"provideLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rebalancer\",\"type\":\"address\"}],\"name\":\"setRebalancer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101006040523480156200001257600080fd5b506040516200499e3803806200499e833981016040819052620000359162000565565b848484833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c3816200017e565b5050506001600160a01b0384161580620000e457506001600160a01b038116155b80620000f757506001600160a01b038216155b1562000116576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c052620001695760408051600081526020810190915262000169908462000229565b5050505090151560e05250620006d692505050565b336001600160a01b03821603620001d85760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c0516200024a576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002d55760008382815181106200026e576200026e62000688565b602090810291909101015190506200028860028262000386565b15620002cb576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b506001016200024d565b5060005b815181101562000381576000828281518110620002fa57620002fa62000688565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000326575062000378565b62000333600282620003a6565b1562000376576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002d9565b505050565b60006200039d836001600160a01b038416620003bd565b90505b92915050565b60006200039d836001600160a01b038416620004c1565b60008181526001830160205260408120548015620004b6576000620003e46001836200069e565b8554909150600090620003fa906001906200069e565b9050818114620004665760008660000182815481106200041e576200041e62000688565b906000526020600020015490508087600001848154811062000444576200044462000688565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200047a576200047a620006c0565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620003a0565b6000915050620003a0565b60008181526001830160205260408120546200050a57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003a0565b506000620003a0565b6001600160a01b03811681146200052957600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b80516200054f8162000513565b919050565b805180151581146200054f57600080fd5b600080600080600060a086880312156200057e57600080fd5b85516200058b8162000513565b602087810151919650906001600160401b0380821115620005ab57600080fd5b818901915089601f830112620005c057600080fd5b815181811115620005d557620005d56200052c565b8060051b604051601f19603f83011681018181108582111715620005fd57620005fd6200052c565b60405291825284820192508381018501918c8311156200061c57600080fd5b938501935b828510156200064557620006358562000542565b8452938501939285019262000621565b8099505050505050506200065c6040870162000542565b92506200066c6060870162000554565b91506200067c6080870162000542565b90509295509295909350565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003a057634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e05161422c62000772600039600081816104ef015261173201526000818161059c01528181611cce015261277301526000818161057601528181611aff0152611f84015260008181610290015281816102e50152818161077a0152818161084c015281816108dd015281816117f401528181611a1f01528181611ea401528181612709015261295e015261422c6000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638da5cb5b1161010f578063c4bffe2b116100a2578063dc0bd97111610071578063dc0bd97114610574578063e0351e131461059a578063eb521a4c146105c0578063f2fde38b146105d357600080fd5b8063c4bffe2b14610526578063c75eea9c1461053b578063cf7401f31461054e578063db6327dc1461056157600080fd5b8063b0f479a1116100de578063b0f479a1146104bc578063b7946580146104da578063bb98546b146104ed578063c0d786551461051357600080fd5b80638da5cb5b146103fa5780639a4575b914610418578063a7cd63b714610438578063af58d59f1461044d57600080fd5b806354c8a4f31161018757806378a010b21161015657806378a010b2146103b957806379ba5097146103cc5780637d54534e146103d45780638926f54f146103e757600080fd5b806354c8a4f31461036257806366320087146103755780636cfd1553146103885780636d3d1a581461039b57600080fd5b806321df0da7116101c357806321df0da71461028e578063240028e8146102d55780633907753714610322578063432a6ba31461034457600080fd5b806301ffc9a7146101f55780630a2fd4931461021d5780630a861f2a1461023d578063181f5a7714610252575b600080fd5b610208610203366004613308565b6105e6565b60405190151581526020015b60405180910390f35b61023061022b366004613367565b610642565b60405161021491906133f0565b61025061024b366004613403565b6106f2565b005b6102306040518060400160405280601e81526020017f4c6f636b52656c65617365546f6b656e506f6f6c20312e352e302d646576000081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610214565b6102086102e3366004613449565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b610335610330366004613466565b6108a3565b60405190518152602001610214565b60095473ffffffffffffffffffffffffffffffffffffffff166102b0565b6102506103703660046134ee565b610999565b61025061038336600461355a565b610a14565b610250610396366004613449565b610af0565b60085473ffffffffffffffffffffffffffffffffffffffff166102b0565b6102506103c7366004613586565b610b3f565b610250610cae565b6102506103e2366004613449565b610dab565b6102086103f5366004613367565b610dfa565b60005473ffffffffffffffffffffffffffffffffffffffff166102b0565b61042b610426366004613609565b610e11565b6040516102149190613644565b610440610eab565b60405161021491906136a4565b61046061045b366004613367565b610ebc565b604051610214919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff166102b0565b6102306104e8366004613367565b610f91565b7f0000000000000000000000000000000000000000000000000000000000000000610208565b610250610521366004613449565b610fbc565b61052e611097565b60405161021491906136fe565b610460610549366004613367565b61114f565b61025061055c366004613866565b611221565b61025061056f3660046138ab565b6112aa565b7f00000000000000000000000000000000000000000000000000000000000000006102b0565b7f0000000000000000000000000000000000000000000000000000000000000000610208565b6102506105ce366004613403565b611730565b6102506105e1366004613449565b61184c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fe1d4056600000000000000000000000000000000000000000000000000000000148061063c575061063c82611860565b92915050565b67ffffffffffffffff8116600090815260076020526040902060040180546060919061066d906138ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610699906138ed565b80156106e65780601f106106bb576101008083540402835291602001916106e6565b820191906000526020600020905b8154815290600101906020018083116106c957829003601f168201915b50505050509050919050565b60095473ffffffffffffffffffffffffffffffffffffffff16331461074a576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156107d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107fa9190613940565b1015610832576040517fbb55fd2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61087373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163383611944565b604051819033907fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf984017171990600090a350565b6040805160208101909152600081526108c36108be83613a04565b611a18565b61090873ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016336060850135611944565b6109186060830160408401613449565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f52846060013560405161097a91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b6109a1611c49565b610a0e84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611ccc92505050565b50505050565b610a1c611c49565b6040517f0a861f2a0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff831690630a861f2a90602401600060405180830381600087803b158015610a8457600080fd5b505af1158015610a98573d6000803e3d6000fd5b505050508173ffffffffffffffffffffffffffffffffffffffff167f6fa7abcf1345d1d478e5ea0da6b5f26a90eadb0546ef15ed3833944fbfd1db6282604051610ae491815260200190565b60405180910390a25050565b610af8611c49565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610b47611c49565b610b5083610dfa565b610b92576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610741565b67ffffffffffffffff831660009081526007602052604081206004018054610bb9906138ed565b80601f0160208091040260200160405190810160405280929190818152602001828054610be5906138ed565b8015610c325780601f10610c0757610100808354040283529160200191610c32565b820191906000526020600020905b815481529060010190602001808311610c1557829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610c61838583613b49565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610ca093929190613c64565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610741565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610db3611c49565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600061063c600567ffffffffffffffff8416611e82565b6040805180820190915260608082526020820152610e36610e3183613cc8565b611e9d565b6040516060830135815233907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060200160405180910390a26040518060400160405280610e908460200160208101906104e89190613367565b81526040805160208181019092526000815291015292915050565b6060610eb76002612067565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261063c90612074565b67ffffffffffffffff8116600090815260076020526040902060050180546060919061066d906138ed565b610fc4611c49565b73ffffffffffffffffffffffffffffffffffffffff8116611011576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f1684910160405180910390a15050565b606060006110a56005612067565b90506000815167ffffffffffffffff8111156110c3576110c3613740565b6040519080825280602002602001820160405280156110ec578160200160208202803683370190505b50905060005b82518110156111485782818151811061110d5761110d613d6a565b602002602001015182828151811061112757611127613d6a565b67ffffffffffffffff909216602092830291909101909101526001016110f2565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261063c90612074565b60085473ffffffffffffffffffffffffffffffffffffffff163314801590611261575060005473ffffffffffffffffffffffffffffffffffffffff163314155b1561129a576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610741565b6112a5838383612126565b505050565b6112b2611c49565b60005b818110156112a55760008383838181106112d1576112d1613d6a565b90506020028101906112e39190613d99565b6112ec90613dd7565b90506113018160800151826020015115612210565b6113148160a00151826020015115612210565b8060200151156116105780516113369060059067ffffffffffffffff16612349565b61137b5780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b60408101515115806113905750606081015151155b156113c7576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906115a89082613e8b565b50606082015160058201906115bd9082613e8b565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506116039493929190613fa5565b60405180910390a1611727565b80516116289060059067ffffffffffffffff16612355565b61166d5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610741565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906116d660048301826132ba565b6116e46005830160006132ba565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b506001016112b5565b7f0000000000000000000000000000000000000000000000000000000000000000611787576040517fe93f8fa400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095473ffffffffffffffffffffffffffffffffffffffff1633146117da576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610741565b61181c73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612361565b604051819033907fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb31208890600090a350565b611854611c49565b61185d816123bf565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806118f357507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061063c57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526112a59084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526124b4565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611aad5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610741565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7f919061403e565b15611bb6576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611bc381602001516125c0565b6000611bd28260200151610642565b9050805160001480611bf6575080805190602001208260a001518051906020012014155b15611c33578160a001516040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161074191906133f0565b611c45826020015183606001516126e6565b5050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610741565b565b7f0000000000000000000000000000000000000000000000000000000000000000611d23576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611db9576000838281518110611d4357611d43613d6a565b60200260200101519050611d6181600261272d90919063ffffffff16565b15611db05760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611d26565b5060005b81518110156112a5576000828281518110611dda57611dda613d6a565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e1e5750611e7a565b611e2960028261274f565b15611e785760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611dbd565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611f325760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610741565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611fe0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612004919061403e565b1561203b576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120488160400151612771565b61205581602001516127f0565b61185d8160200151826060015161293e565b60606000611e9683612982565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261210282606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426120e6919061408a565b85608001516fffffffffffffffffffffffffffffffff166129dd565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b61212f83610dfa565b612171576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610741565b61217c826000612210565b67ffffffffffffffff8316600090815260076020526040902061219f9083612a07565b6121aa816000612210565b67ffffffffffffffff831660009081526007602052604090206121d09060020182612a07565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516122039392919061409d565b60405180910390a1505050565b8151156122d75781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580612266575060408201516fffffffffffffffffffffffffffffffff16155b1561229f57816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016107419190614120565b8015611c45576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580612310575060208201516fffffffffffffffffffffffffffffffff1615155b15611c4557816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016107419190614120565b6000611e968383612ba9565b6000611e968383612bf8565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a0e9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611996565b3373ffffffffffffffffffffffffffffffffffffffff82160361243e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610741565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000612516826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612ceb9092919063ffffffff16565b8051909150156112a55780806020019051810190612534919061403e565b6112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610741565b6125c981610dfa565b61260b576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610741565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa15801561268a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126ae919061403e565b61185d576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610741565b67ffffffffffffffff82166000908152600760205260409020611c4590600201827f0000000000000000000000000000000000000000000000000000000000000000612cfa565b6000611e968373ffffffffffffffffffffffffffffffffffffffff8416612bf8565b6000611e968373ffffffffffffffffffffffffffffffffffffffff8416612ba9565b7f00000000000000000000000000000000000000000000000000000000000000001561185d576127a260028261307d565b61185d576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610741565b6127f981610dfa565b61283b576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610741565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa1580156128b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d8919061415c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461185d576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610741565b67ffffffffffffffff82166000908152600760205260409020611c4590827f0000000000000000000000000000000000000000000000000000000000000000612cfa565b6060816000018054806020026020016040519081016040528092919081815260200182805480156106e657602002820191906000526020600020905b8154815260200190600101908083116129be5750505050509050919050565b60006129fc856129ed8486614179565b6129f79087614190565b6130ac565b90505b949350505050565b8154600090612a3090700100000000000000000000000000000000900463ffffffff164261408a565b90508015612ad25760018301548354612a78916fffffffffffffffffffffffffffffffff808216928116918591700100000000000000000000000000000000909104166129dd565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612af8916fffffffffffffffffffffffffffffffff90811691166130ac565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c1990612203908490614120565b6000818152600183016020526040812054612bf05750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561063c565b50600061063c565b60008181526001830160205260408120548015612ce1576000612c1c60018361408a565b8554909150600090612c309060019061408a565b9050818114612c95576000866000018281548110612c5057612c50613d6a565b9060005260206000200154905080876000018481548110612c7357612c73613d6a565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612ca657612ca66141a3565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061063c565b600091505061063c565b60606129ff84846000856130c2565b825474010000000000000000000000000000000000000000900460ff161580612d21575081155b15612d2b57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612d7190700100000000000000000000000000000000900463ffffffff164261408a565b90508015612e315781831115612db3576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612ded9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff166129dd565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015612ee85773ffffffffffffffffffffffffffffffffffffffff8416612e90576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610741565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610741565b84831015612ffb5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290612f2c908261408a565b612f36878a61408a565b612f409190614190565b612f4a91906141d2565b905073ffffffffffffffffffffffffffffffffffffffff8616612fa3576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610741565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610741565b613005858461408a565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515611e96565b60008183106130bb5781611e96565b5090919050565b606082471015613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610741565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161317d919061420d565b60006040518083038185875af1925050503d80600081146131ba576040519150601f19603f3d011682016040523d82523d6000602084013e6131bf565b606091505b50915091506131d0878383876131db565b979650505050505050565b6060831561327157825160000361326a5773ffffffffffffffffffffffffffffffffffffffff85163b61326a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610741565b50816129ff565b6129ff83838151156132865781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074191906133f0565b5080546132c6906138ed565b6000825580601f106132d6575050565b601f01602090049060005260206000209081019061185d91905b8082111561330457600081556001016132f0565b5090565b60006020828403121561331a57600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114611e9657600080fd5b803567ffffffffffffffff8116811461336257600080fd5b919050565b60006020828403121561337957600080fd5b611e968261334a565b60005b8381101561339d578181015183820152602001613385565b50506000910152565b600081518084526133be816020860160208601613382565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611e9660208301846133a6565b60006020828403121561341557600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461185d57600080fd5b80356133628161341c565b60006020828403121561345b57600080fd5b8135611e968161341c565b60006020828403121561347857600080fd5b813567ffffffffffffffff81111561348f57600080fd5b82016101008185031215611e9657600080fd5b60008083601f8401126134b457600080fd5b50813567ffffffffffffffff8111156134cc57600080fd5b6020830191508360208260051b85010111156134e757600080fd5b9250929050565b6000806000806040858703121561350457600080fd5b843567ffffffffffffffff8082111561351c57600080fd5b613528888389016134a2565b9096509450602087013591508082111561354157600080fd5b5061354e878288016134a2565b95989497509550505050565b6000806040838503121561356d57600080fd5b82356135788161341c565b946020939093013593505050565b60008060006040848603121561359b57600080fd5b6135a48461334a565b9250602084013567ffffffffffffffff808211156135c157600080fd5b818601915086601f8301126135d557600080fd5b8135818111156135e457600080fd5b8760208285010111156135f657600080fd5b6020830194508093505050509250925092565b60006020828403121561361b57600080fd5b813567ffffffffffffffff81111561363257600080fd5b820160a08185031215611e9657600080fd5b60208152600082516040602084015261366060608401826133a6565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084830301604085015261369b82826133a6565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156136f257835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016136c0565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156136f257835167ffffffffffffffff168352928401929184019160010161371a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff8111828210171561379357613793613740565b60405290565b60405160c0810167ffffffffffffffff8111828210171561379357613793613740565b801515811461185d57600080fd5b8035613362816137bc565b80356fffffffffffffffffffffffffffffffff8116811461336257600080fd5b60006060828403121561380757600080fd5b6040516060810181811067ffffffffffffffff8211171561382a5761382a613740565b604052905080823561383b816137bc565b8152613849602084016137d5565b602082015261385a604084016137d5565b60408201525092915050565b600080600060e0848603121561387b57600080fd5b6138848461334a565b925061389385602086016137f5565b91506138a285608086016137f5565b90509250925092565b600080602083850312156138be57600080fd5b823567ffffffffffffffff8111156138d557600080fd5b6138e1858286016134a2565b90969095509350505050565b600181811c9082168061390157607f821691505b60208210810361393a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60006020828403121561395257600080fd5b5051919050565b600082601f83011261396a57600080fd5b813567ffffffffffffffff8082111561398557613985613740565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019082821181831017156139cb576139cb613740565b816040528381528660208588010111156139e457600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006101008236031215613a1757600080fd5b613a1f61376f565b823567ffffffffffffffff80821115613a3757600080fd5b613a4336838701613959565b8352613a516020860161334a565b6020840152613a626040860161343e565b604084015260608501356060840152613a7d6080860161343e565b608084015260a0850135915080821115613a9657600080fd5b613aa236838701613959565b60a084015260c0850135915080821115613abb57600080fd5b613ac736838701613959565b60c084015260e0850135915080821115613ae057600080fd5b50613aed36828601613959565b60e08301525092915050565b601f8211156112a5576000816000526020600020601f850160051c81016020861015613b225750805b601f850160051c820191505b81811015613b4157828155600101613b2e565b505050505050565b67ffffffffffffffff831115613b6157613b61613740565b613b7583613b6f83546138ed565b83613af9565b6000601f841160018114613bc75760008515613b915750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355613c5d565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613c165786850135825560209485019460019092019101613bf6565b5086821015613c51577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b604081526000613c7760408301866133a6565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a08236031215613cda57600080fd5b60405160a0810167ffffffffffffffff8282108183111715613cfe57613cfe613740565b816040528435915080821115613d1357600080fd5b50613d2036828601613959565b825250613d2f6020840161334a565b60208201526040830135613d428161341c565b6040820152606083810135908201526080830135613d5f8161341c565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec1833603018112613dcd57600080fd5b9190910192915050565b60006101408236031215613dea57600080fd5b613df2613799565b613dfb8361334a565b8152613e09602084016137ca565b6020820152604083013567ffffffffffffffff80821115613e2957600080fd5b613e3536838701613959565b60408401526060850135915080821115613e4e57600080fd5b50613e5b36828601613959565b606083015250613e6e36608085016137f5565b6080820152613e803660e085016137f5565b60a082015292915050565b815167ffffffffffffffff811115613ea557613ea5613740565b613eb981613eb384546138ed565b84613af9565b602080601f831160018114613f0c5760008415613ed65750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613b41565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613f5957888601518255948401946001909101908401613f3a565b5085821015613f9557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152613fc9818401876133a6565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506140079050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e083015261369b565b60006020828403121561405057600080fd5b8151611e96816137bc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561063c5761063c61405b565b67ffffffffffffffff8416815260e081016140e960208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c08301526129ff565b6060810161063c82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561416e57600080fd5b8151611e968161341c565b808202811582820484141761063c5761063c61405b565b8082018082111561063c5761063c61405b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082614208577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008251613dcd81846020870161338256fea164736f6c6343000818000a",
}
var LockReleaseTokenPoolABI = LockReleaseTokenPoolMetaData.ABI
@@ -750,6 +750,18 @@ func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) SetRouter(ne
return _LockReleaseTokenPool.Contract.SetRouter(&_LockReleaseTokenPool.TransactOpts, newRouter)
}
+func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) TransferLiquidity(opts *bind.TransactOpts, from common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _LockReleaseTokenPool.contract.Transact(opts, "transferLiquidity", from, amount)
+}
+
+func (_LockReleaseTokenPool *LockReleaseTokenPoolSession) TransferLiquidity(from common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _LockReleaseTokenPool.Contract.TransferLiquidity(&_LockReleaseTokenPool.TransactOpts, from, amount)
+}
+
+func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactorSession) TransferLiquidity(from common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _LockReleaseTokenPool.Contract.TransferLiquidity(&_LockReleaseTokenPool.TransactOpts, from, amount)
+}
+
func (_LockReleaseTokenPool *LockReleaseTokenPoolTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
return _LockReleaseTokenPool.contract.Transact(opts, "transferOwnership", to)
}
@@ -1881,6 +1893,134 @@ func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseLiquidityRemoved
return event, nil
}
+type LockReleaseTokenPoolLiquidityTransferredIterator struct {
+ Event *LockReleaseTokenPoolLiquidityTransferred
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *LockReleaseTokenPoolLiquidityTransferredIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(LockReleaseTokenPoolLiquidityTransferred)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(LockReleaseTokenPoolLiquidityTransferred)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *LockReleaseTokenPoolLiquidityTransferredIterator) Error() error {
+ return it.fail
+}
+
+func (it *LockReleaseTokenPoolLiquidityTransferredIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type LockReleaseTokenPoolLiquidityTransferred struct {
+ From common.Address
+ Amount *big.Int
+ Raw types.Log
+}
+
+func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) FilterLiquidityTransferred(opts *bind.FilterOpts, from []common.Address) (*LockReleaseTokenPoolLiquidityTransferredIterator, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+
+ logs, sub, err := _LockReleaseTokenPool.contract.FilterLogs(opts, "LiquidityTransferred", fromRule)
+ if err != nil {
+ return nil, err
+ }
+ return &LockReleaseTokenPoolLiquidityTransferredIterator{contract: _LockReleaseTokenPool.contract, event: "LiquidityTransferred", logs: logs, sub: sub}, nil
+}
+
+func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) WatchLiquidityTransferred(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLiquidityTransferred, from []common.Address) (event.Subscription, error) {
+
+ var fromRule []interface{}
+ for _, fromItem := range from {
+ fromRule = append(fromRule, fromItem)
+ }
+
+ logs, sub, err := _LockReleaseTokenPool.contract.WatchLogs(opts, "LiquidityTransferred", fromRule)
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(LockReleaseTokenPoolLiquidityTransferred)
+ if err := _LockReleaseTokenPool.contract.UnpackLog(event, "LiquidityTransferred", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_LockReleaseTokenPool *LockReleaseTokenPoolFilterer) ParseLiquidityTransferred(log types.Log) (*LockReleaseTokenPoolLiquidityTransferred, error) {
+ event := new(LockReleaseTokenPoolLiquidityTransferred)
+ if err := _LockReleaseTokenPool.contract.UnpackLog(event, "LiquidityTransferred", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
type LockReleaseTokenPoolLockedIterator struct {
Event *LockReleaseTokenPoolLocked
@@ -2939,6 +3079,8 @@ func (_LockReleaseTokenPool *LockReleaseTokenPool) ParseLog(log types.Log) (gene
return _LockReleaseTokenPool.ParseLiquidityAdded(log)
case _LockReleaseTokenPool.abi.Events["LiquidityRemoved"].ID:
return _LockReleaseTokenPool.ParseLiquidityRemoved(log)
+ case _LockReleaseTokenPool.abi.Events["LiquidityTransferred"].ID:
+ return _LockReleaseTokenPool.ParseLiquidityTransferred(log)
case _LockReleaseTokenPool.abi.Events["Locked"].ID:
return _LockReleaseTokenPool.ParseLocked(log)
case _LockReleaseTokenPool.abi.Events["Minted"].ID:
@@ -2997,6 +3139,10 @@ func (LockReleaseTokenPoolLiquidityRemoved) Topic() common.Hash {
return common.HexToHash("0xc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf9840171719")
}
+func (LockReleaseTokenPoolLiquidityTransferred) Topic() common.Hash {
+ return common.HexToHash("0x6fa7abcf1345d1d478e5ea0da6b5f26a90eadb0546ef15ed3833944fbfd1db62")
+}
+
func (LockReleaseTokenPoolLocked) Topic() common.Hash {
return common.HexToHash("0x9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd60008")
}
@@ -3092,6 +3238,8 @@ type LockReleaseTokenPoolInterface interface {
SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
+ TransferLiquidity(opts *bind.TransactOpts, from common.Address, amount *big.Int) (*types.Transaction, error)
+
TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
WithdrawLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
@@ -3150,6 +3298,12 @@ type LockReleaseTokenPoolInterface interface {
ParseLiquidityRemoved(log types.Log) (*LockReleaseTokenPoolLiquidityRemoved, error)
+ FilterLiquidityTransferred(opts *bind.FilterOpts, from []common.Address) (*LockReleaseTokenPoolLiquidityTransferredIterator, error)
+
+ WatchLiquidityTransferred(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLiquidityTransferred, from []common.Address) (event.Subscription, error)
+
+ ParseLiquidityTransferred(log types.Log) (*LockReleaseTokenPoolLiquidityTransferred, error)
+
FilterLocked(opts *bind.FilterOpts, sender []common.Address) (*LockReleaseTokenPoolLockedIterator, error)
WatchLocked(opts *bind.WatchOpts, sink chan<- *LockReleaseTokenPoolLocked, sender []common.Address) (event.Subscription, error)
diff --git a/core/gethwrappers/ccip/generated/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go b/core/gethwrappers/ccip/generated/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go
index 15dd411741..73f2ea6dc4 100644
--- a/core/gethwrappers/ccip/generated/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go
+++ b/core/gethwrappers/ccip/generated/lock_release_token_pool_and_proxy/lock_release_token_pool_and_proxy.go
@@ -82,8 +82,8 @@ type TokenPoolChainUpdate struct {
}
var LockReleaseTokenPoolAndProxyMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"acceptLiquidity\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientLiquidity\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LiquidityNotAccepted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"oldPool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"newPool\",\"type\":\"address\"}],\"name\":\"LegacyPoolChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canAcceptLiquidity\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRampAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRebalancer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"provideLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"prevPool\",\"type\":\"address\"}],\"name\":\"setPreviousPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rebalancer\",\"type\":\"address\"}],\"name\":\"setRebalancer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101006040523480156200001257600080fd5b5060405162004e1b38038062004e1b83398101604081905262000035916200056d565b84848483838383833380600081620000945760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c757620000c78162000186565b5050506001600160a01b0384161580620000e857506001600160a01b038116155b80620000fb57506001600160a01b038216155b156200011a576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016d576040805160008152602081019091526200016d908462000231565b5050505094151560e05250620006de9650505050505050565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008b565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c05162000252576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002dd57600083828151811062000276576200027662000690565b60209081029190910101519050620002906002826200038e565b15620002d3576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010162000255565b5060005b81518110156200038957600082828151811062000302576200030262000690565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200032e575062000380565b6200033b600282620003ae565b156200037e576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002e1565b505050565b6000620003a5836001600160a01b038416620003c5565b90505b92915050565b6000620003a5836001600160a01b038416620004c9565b60008181526001830160205260408120548015620004be576000620003ec600183620006a6565b85549091506000906200040290600190620006a6565b90508181146200046e57600086600001828154811062000426576200042662000690565b90600052602060002001549050808760000184815481106200044c576200044c62000690565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620004825762000482620006c8565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620003a8565b6000915050620003a8565b60008181526001830160205260408120546200051257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003a8565b506000620003a8565b6001600160a01b03811681146200053157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000557816200051b565b919050565b805180151581146200055757600080fd5b600080600080600060a086880312156200058657600080fd5b855162000593816200051b565b602087810151919650906001600160401b0380821115620005b357600080fd5b818901915089601f830112620005c857600080fd5b815181811115620005dd57620005dd62000534565b8060051b604051601f19603f8301168101818110858211171562000605576200060562000534565b60405291825284820192508381018501918c8311156200062457600080fd5b938501935b828510156200064d576200063d856200054a565b8452938501939285019262000629565b80995050505050505062000664604087016200054a565b925062000674606087016200055c565b915062000684608087016200054a565b90509295509295909350565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003a857634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e05161469a620007816000396000818161051701526118510152600081816105c401528181611e860152612a4201526000818161059e01528181611c1e0152612139015260008181610292015281816102e7015281816107a2015281816108740152818161093e0152818161191301528181611b3e015281816120590152818161223f015281816129d80152612c2d015261469a6000f3fe608060405234801561001057600080fd5b50600436106102265760003560e01c80639766b9321161012a578063c0d78655116100bd578063db6327dc1161008c578063e0351e1311610071578063e0351e13146105c2578063eb521a4c146105e8578063f2fde38b146105fb57600080fd5b8063db6327dc14610589578063dc0bd9711461059c57600080fd5b8063c0d786551461053b578063c4bffe2b1461054e578063c75eea9c14610563578063cf7401f31461057657600080fd5b8063af58d59f116100f9578063af58d59f14610475578063b0f479a1146104e4578063b794658014610502578063bb98546b1461051557600080fd5b80639766b9321461041a5780639a4575b91461042d578063a7cd63b71461044d578063a8d87a3b1461046257600080fd5b806354c8a4f3116101bd57806379ba50971161018c57806383826b2b1161017157806383826b2b146103d65780638926f54f146103e95780638da5cb5b146103fc57600080fd5b806379ba5097146103bb5780637d54534e146103c357600080fd5b806354c8a4f3146103645780636cfd1553146103775780636d3d1a581461038a57806378a010b2146103a857600080fd5b806321df0da7116101f957806321df0da714610290578063240028e8146102d75780633907753714610324578063432a6ba31461034657600080fd5b806301ffc9a71461022b5780630a2fd493146102535780630a861f2a14610273578063181f5a7714610288575b600080fd5b61023e6102393660046135d7565b61060e565b60405190151581526020015b60405180910390f35b610266610261366004613636565b61066a565b60405161024a91906136bf565b6102866102813660046136d2565b61071a565b005b6102666108cb565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161024a565b61023e6102e5366004613718565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b610337610332366004613735565b6108e7565b6040519051815260200161024a565b60095473ffffffffffffffffffffffffffffffffffffffff166102b2565b6102866103723660046137bd565b610a10565b610286610385366004613718565b610a8b565b600a5473ffffffffffffffffffffffffffffffffffffffff166102b2565b6102866103b6366004613829565b610ada565b610286610c49565b6102866103d1366004613718565b610d46565b61023e6103e43660046138ac565b610d95565b61023e6103f7366004613636565b610e62565b60005473ffffffffffffffffffffffffffffffffffffffff166102b2565b610286610428366004613718565b610e79565b61044061043b3660046138e3565b610f08565b60405161024a919061391e565b610455610fd1565b60405161024a919061397e565b6102b2610470366004613636565b503090565b610488610483366004613636565b610fe2565b60405161024a919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff166102b2565b610266610510366004613636565b6110b7565b7f000000000000000000000000000000000000000000000000000000000000000061023e565b610286610549366004613718565b6110e2565b6105566111b6565b60405161024a91906139d8565b610488610571366004613636565b61126e565b610286610584366004613b8f565b611340565b610286610597366004613bd4565b6113c9565b7f00000000000000000000000000000000000000000000000000000000000000006102b2565b7f000000000000000000000000000000000000000000000000000000000000000061023e565b6102866105f63660046136d2565b61184f565b610286610609366004613718565b61196b565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fe1d4056600000000000000000000000000000000000000000000000000000000148061066457506106648261197f565b92915050565b67ffffffffffffffff8116600090815260076020526040902060040180546060919061069590613c16565b80601f01602080910402602001604051908101604052809291908181526020018280546106c190613c16565b801561070e5780601f106106e35761010080835404028352916020019161070e565b820191906000526020600020905b8154815290600101906020018083116106f157829003601f168201915b50505050509050919050565b60095473ffffffffffffffffffffffffffffffffffffffff163314610772576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156107fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108229190613c69565b101561085a576040517fbb55fd2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61089b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163383611a63565b604051819033907fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf984017171990600090a350565b6040518060600160405280602681526020016146686026913981565b60408051602081019091526000815261090761090283613d1e565b611b37565b60085473ffffffffffffffffffffffffffffffffffffffff1661096e5761096973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016336060850135611a63565b61097f565b61097f61097a83613d1e565b611d68565b61098f6060830160408401613718565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f5284606001356040516109f191815260200190565b60405180910390a3506040805160208101909152606090910135815290565b610a18611e01565b610a8584848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611e8492505050565b50505050565b610a93611e01565b600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610ae2611e01565b610aeb83610e62565b610b2d576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610769565b67ffffffffffffffff831660009081526007602052604081206004018054610b5490613c16565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8090613c16565b8015610bcd5780601f10610ba257610100808354040283529160200191610bcd565b820191906000526020600020905b815481529060010190602001808311610bb057829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610bfc838583613e63565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610c3b93929190613f7d565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610cca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610769565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610d4e611e01565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600073ffffffffffffffffffffffffffffffffffffffff8216301480610e5b5750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169281019290925273ffffffffffffffffffffffffffffffffffffffff848116602484015216906383826b2b90604401602060405180830381865afa158015610e37573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5b9190613fe1565b9392505050565b6000610664600567ffffffffffffffff841661203a565b610e81611e01565b6008805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f81accd0a7023865eaa51b3399dd0eafc488bf3ba238402911e1659cfe860f22891015b60405180910390a15050565b6040805180820190915260608082526020820152610f2d610f2883613ffe565b612052565b60085473ffffffffffffffffffffffffffffffffffffffff1615610f5c57610f5c610f5783613ffe565b61221c565b6040516060830135815233907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060200160405180910390a26040518060400160405280610fb68460200160208101906105109190613636565b81526040805160208181019092526000815291015292915050565b6060610fdd6002612336565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261066490612343565b67ffffffffffffffff8116600090815260076020526040902060050180546060919061069590613c16565b6110ea611e01565b73ffffffffffffffffffffffffffffffffffffffff8116611137576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849101610efc565b606060006111c46005612336565b90506000815167ffffffffffffffff8111156111e2576111e2613a1a565b60405190808252806020026020018201604052801561120b578160200160208202803683370190505b50905060005b82518110156112675782818151811061122c5761122c6140a0565b6020026020010151828281518110611246576112466140a0565b67ffffffffffffffff90921660209283029190910190910152600101611211565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261066490612343565b600a5473ffffffffffffffffffffffffffffffffffffffff163314801590611380575060005473ffffffffffffffffffffffffffffffffffffffff163314155b156113b9576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610769565b6113c48383836123f5565b505050565b6113d1611e01565b60005b818110156113c45760008383838181106113f0576113f06140a0565b905060200281019061140291906140cf565b61140b9061410d565b905061142081608001518260200151156124df565b6114338160a001518260200151156124df565b80602001511561172f5780516114559060059067ffffffffffffffff16612618565b61149a5780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610769565b60408101515115806114af5750606081015151155b156114e6576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906116c790826141c1565b50606082015160058201906116dc90826141c1565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c2955061172294939291906142db565b60405180910390a1611846565b80516117479060059067ffffffffffffffff16612624565b61178c5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610769565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906117f56004830182613589565b611803600583016000613589565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b506001016113d4565b7f00000000000000000000000000000000000000000000000000000000000000006118a6576040517fe93f8fa400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095473ffffffffffffffffffffffffffffffffffffffff1633146118f9576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610769565b61193b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016333084612630565b604051819033907fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb31208890600090a350565b611973611e01565b61197c8161268e565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf000000000000000000000000000000000000000000000000000000001480611a1257507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061066457507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526113c49084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612783565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611bcc5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610769565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611c7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c9e9190613fe1565b15611cd5576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ce2816020015161288f565b6000611cf1826020015161066a565b9050805160001480611d15575080805190602001208260a001518051906020012014155b15611d52578160a001516040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161076991906136bf565b611d64826020015183606001516129b5565b5050565b6008548151606083015160208401516040517f8627fad600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90941693638627fad693611dcc9390923392600401614374565b600060405180830381600087803b158015611de657600080fd5b505af1158015611dfa573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610769565b565b7f0000000000000000000000000000000000000000000000000000000000000000611edb576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611f71576000838281518110611efb57611efb6140a0565b60200260200101519050611f198160026129fc90919063ffffffff16565b15611f685760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611ede565b5060005b81518110156113c4576000828281518110611f9257611f926140a0565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611fd65750612032565b611fe1600282612a1e565b156120305760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611f75565b60008181526001830160205260408120541515610e5b565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146120e75760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610769565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015612195573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121b99190613fe1565b156121f0576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6121fd8160400151612a40565b61220a8160200151612abf565b61197c81602001518260600151612c0d565b60085460608201516122699173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692911690611a63565b60085460408083015183516060850151602086015193517f9687544500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff909516946396875445946122d1949392916004016143d5565b6000604051808303816000875af11580156122f0573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611d649190810190614435565b60606000610e5b83612c51565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526123d182606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426123b591906144d2565b85608001516fffffffffffffffffffffffffffffffff16612cac565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6123fe83610e62565b612440576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610769565b61244b8260006124df565b67ffffffffffffffff8316600090815260076020526040902061246e9083612cd6565b6124798160006124df565b67ffffffffffffffff8316600090815260076020526040902061249f9060020182612cd6565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516124d2939291906144e5565b60405180910390a1505050565b8151156125a65781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580612535575060408201516fffffffffffffffffffffffffffffffff16155b1561256e57816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016107699190614568565b8015611d64576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff161515806125df575060208201516fffffffffffffffffffffffffffffffff1615155b15611d6457816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016107699190614568565b6000610e5b8383612e78565b6000610e5b8383612ec7565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a859085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611ab5565b3373ffffffffffffffffffffffffffffffffffffffff82160361270d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610769565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006127e5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612fba9092919063ffffffff16565b8051909150156113c457808060200190518101906128039190613fe1565b6113c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610769565b61289881610e62565b6128da576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610769565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061297d9190613fe1565b61197c576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610769565b67ffffffffffffffff82166000908152600760205260409020611d6490600201827f0000000000000000000000000000000000000000000000000000000000000000612fc9565b6000610e5b8373ffffffffffffffffffffffffffffffffffffffff8416612ec7565b6000610e5b8373ffffffffffffffffffffffffffffffffffffffff8416612e78565b7f00000000000000000000000000000000000000000000000000000000000000001561197c57612a7160028261334c565b61197c576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610769565b612ac881610e62565b612b0a576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610769565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba791906145a4565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461197c576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610769565b67ffffffffffffffff82166000908152600760205260409020611d6490827f0000000000000000000000000000000000000000000000000000000000000000612fc9565b60608160000180548060200260200160405190810160405280929190818152602001828054801561070e57602002820191906000526020600020905b815481526020019060010190808311612c8d5750505050509050919050565b6000612ccb85612cbc84866145c1565b612cc690876145d8565b61337b565b90505b949350505050565b8154600090612cff90700100000000000000000000000000000000900463ffffffff16426144d2565b90508015612da15760018301548354612d47916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612cac565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612dc7916fffffffffffffffffffffffffffffffff908116911661337b565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906124d2908490614568565b6000818152600183016020526040812054612ebf57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610664565b506000610664565b60008181526001830160205260408120548015612fb0576000612eeb6001836144d2565b8554909150600090612eff906001906144d2565b9050818114612f64576000866000018281548110612f1f57612f1f6140a0565b9060005260206000200154905080876000018481548110612f4257612f426140a0565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612f7557612f756145eb565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610664565b6000915050610664565b6060612cce8484600085613391565b825474010000000000000000000000000000000000000000900460ff161580612ff0575081155b15612ffa57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061304090700100000000000000000000000000000000900463ffffffff16426144d2565b905080156131005781831115613082576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546130bc9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612cac565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156131b75773ffffffffffffffffffffffffffffffffffffffff841661315f576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610769565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610769565b848310156132ca5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906131fb90826144d2565b613205878a6144d2565b61320f91906145d8565b613219919061461a565b905073ffffffffffffffffffffffffffffffffffffffff8616613272576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610769565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610769565b6132d485846144d2565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610e5b565b600081831061338a5781610e5b565b5090919050565b606082471015613423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610769565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161344c9190614655565b60006040518083038185875af1925050503d8060008114613489576040519150601f19603f3d011682016040523d82523d6000602084013e61348e565b606091505b509150915061349f878383876134aa565b979650505050505050565b606083156135405782516000036135395773ffffffffffffffffffffffffffffffffffffffff85163b613539576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610769565b5081612cce565b612cce83838151156135555781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076991906136bf565b50805461359590613c16565b6000825580601f106135a5575050565b601f01602090049060005260206000209081019061197c91905b808211156135d357600081556001016135bf565b5090565b6000602082840312156135e957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610e5b57600080fd5b803567ffffffffffffffff8116811461363157600080fd5b919050565b60006020828403121561364857600080fd5b610e5b82613619565b60005b8381101561366c578181015183820152602001613654565b50506000910152565b6000815180845261368d816020860160208601613651565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610e5b6020830184613675565b6000602082840312156136e457600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461197c57600080fd5b8035613631816136eb565b60006020828403121561372a57600080fd5b8135610e5b816136eb565b60006020828403121561374757600080fd5b813567ffffffffffffffff81111561375e57600080fd5b82016101008185031215610e5b57600080fd5b60008083601f84011261378357600080fd5b50813567ffffffffffffffff81111561379b57600080fd5b6020830191508360208260051b85010111156137b657600080fd5b9250929050565b600080600080604085870312156137d357600080fd5b843567ffffffffffffffff808211156137eb57600080fd5b6137f788838901613771565b9096509450602087013591508082111561381057600080fd5b5061381d87828801613771565b95989497509550505050565b60008060006040848603121561383e57600080fd5b61384784613619565b9250602084013567ffffffffffffffff8082111561386457600080fd5b818601915086601f83011261387857600080fd5b81358181111561388757600080fd5b87602082850101111561389957600080fd5b6020830194508093505050509250925092565b600080604083850312156138bf57600080fd5b6138c883613619565b915060208301356138d8816136eb565b809150509250929050565b6000602082840312156138f557600080fd5b813567ffffffffffffffff81111561390c57600080fd5b820160a08185031215610e5b57600080fd5b60208152600082516040602084015261393a6060840182613675565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526139758282613675565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156139cc57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161399a565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156139cc57835167ffffffffffffffff16835292840192918401916001016139f4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715613a6d57613a6d613a1a565b60405290565b60405160c0810167ffffffffffffffff81118282101715613a6d57613a6d613a1a565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613add57613add613a1a565b604052919050565b801515811461197c57600080fd5b803561363181613ae5565b80356fffffffffffffffffffffffffffffffff8116811461363157600080fd5b600060608284031215613b3057600080fd5b6040516060810181811067ffffffffffffffff82111715613b5357613b53613a1a565b6040529050808235613b6481613ae5565b8152613b7260208401613afe565b6020820152613b8360408401613afe565b60408201525092915050565b600080600060e08486031215613ba457600080fd5b613bad84613619565b9250613bbc8560208601613b1e565b9150613bcb8560808601613b1e565b90509250925092565b60008060208385031215613be757600080fd5b823567ffffffffffffffff811115613bfe57600080fd5b613c0a85828601613771565b90969095509350505050565b600181811c90821680613c2a57607f821691505b602082108103613c63577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613c7b57600080fd5b5051919050565b600067ffffffffffffffff821115613c9c57613c9c613a1a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613cd957600080fd5b8135613cec613ce782613c82565b613a96565b818152846020838601011115613d0157600080fd5b816020850160208301376000918101602001919091529392505050565b60006101008236031215613d3157600080fd5b613d39613a49565b823567ffffffffffffffff80821115613d5157600080fd5b613d5d36838701613cc8565b8352613d6b60208601613619565b6020840152613d7c6040860161370d565b604084015260608501356060840152613d976080860161370d565b608084015260a0850135915080821115613db057600080fd5b613dbc36838701613cc8565b60a084015260c0850135915080821115613dd557600080fd5b613de136838701613cc8565b60c084015260e0850135915080821115613dfa57600080fd5b50613e0736828601613cc8565b60e08301525092915050565b601f8211156113c4576000816000526020600020601f850160051c81016020861015613e3c5750805b601f850160051c820191505b81811015613e5b57828155600101613e48565b505050505050565b67ffffffffffffffff831115613e7b57613e7b613a1a565b613e8f83613e898354613c16565b83613e13565b6000601f841160018114613ee15760008515613eab5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611dfa565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b82811015613f305786850135825560209485019460019092019101613f10565b5086821015613f6b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b604081526000613f906040830186613675565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060208284031215613ff357600080fd5b8151610e5b81613ae5565b600060a0823603121561401057600080fd5b60405160a0810167ffffffffffffffff828210818311171561403457614034613a1a565b81604052843591508082111561404957600080fd5b5061405636828601613cc8565b82525061406560208401613619565b60208201526040830135614078816136eb565b6040820152606083810135908201526080830135614095816136eb565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261410357600080fd5b9190910192915050565b6000610140823603121561412057600080fd5b614128613a73565b61413183613619565b815261413f60208401613af3565b6020820152604083013567ffffffffffffffff8082111561415f57600080fd5b61416b36838701613cc8565b6040840152606085013591508082111561418457600080fd5b5061419136828601613cc8565b6060830152506141a43660808501613b1e565b60808201526141b63660e08501613b1e565b60a082015292915050565b815167ffffffffffffffff8111156141db576141db613a1a565b6141ef816141e98454613c16565b84613e13565b602080601f831160018114614242576000841561420c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613e5b565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561428f57888601518255948401946001909101908401614270565b50858210156142cb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff871683528060208401526142ff81840187613675565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff908116606087015290870151166080850152915061433d9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152613975565b60a08152600061438760a0830187613675565b73ffffffffffffffffffffffffffffffffffffffff8616602084015284604084015267ffffffffffffffff841660608401528281036080840152600081526020810191505095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8516815260a06020820152600061440460a0830186613675565b60408301949094525067ffffffffffffffff9190911660608201528082036080909101526000815260200192915050565b60006020828403121561444757600080fd5b815167ffffffffffffffff81111561445e57600080fd5b8201601f8101841361446f57600080fd5b805161447d613ce782613c82565b81815285602083850101111561449257600080fd5b613975826020830160208601613651565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610664576106646144a3565b67ffffffffffffffff8416815260e0810161453160208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152612cce565b6060810161066482848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156145b657600080fd5b8151610e5b816136eb565b8082028115828204841417610664576106646144a3565b80820180821115610664576106646144a3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082614650577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000825161410381846020870161365156fe4c6f636b52656c65617365546f6b656e506f6f6c416e6450726f787920312e352e302d646576a164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"acceptLiquidity\",\"type\":\"bool\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientLiquidity\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LiquidityNotAccepted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"oldPool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"newPool\",\"type\":\"address\"}],\"name\":\"LegacyPoolChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"provider\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"LiquidityRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"canAcceptLiquidity\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getOnRamp\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"onRampAddress\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRebalancer\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"offRamp\",\"type\":\"address\"}],\"name\":\"isOffRamp\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"provideLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIPoolPriorTo1_5\",\"name\":\"prevPool\",\"type\":\"address\"}],\"name\":\"setPreviousPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rebalancer\",\"type\":\"address\"}],\"name\":\"setRebalancer\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"withdrawLiquidity\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101006040523480156200001257600080fd5b5060405162004ef938038062004ef983398101604081905262000035916200056d565b84848483838383833380600081620000945760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c757620000c78162000186565b5050506001600160a01b0384161580620000e857506001600160a01b038116155b80620000fb57506001600160a01b038216155b156200011a576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016d576040805160008152602081019091526200016d908462000231565b5050505094151560e05250620006de9650505050505050565b336001600160a01b03821603620001e05760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016200008b565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c05162000252576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620002dd57600083828151811062000276576200027662000690565b60209081029190910101519050620002906002826200038e565b15620002d3576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b5060010162000255565b5060005b81518110156200038957600082828151811062000302576200030262000690565b6020026020010151905060006001600160a01b0316816001600160a01b0316036200032e575062000380565b6200033b600282620003ae565b156200037e576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101620002e1565b505050565b6000620003a5836001600160a01b038416620003c5565b90505b92915050565b6000620003a5836001600160a01b038416620004c9565b60008181526001830160205260408120548015620004be576000620003ec600183620006a6565b85549091506000906200040290600190620006a6565b90508181146200046e57600086600001828154811062000426576200042662000690565b90600052602060002001549050808760000184815481106200044c576200044c62000690565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620004825762000482620006c8565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050620003a8565b6000915050620003a8565b60008181526001830160205260408120546200051257508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620003a8565b506000620003a8565b6001600160a01b03811681146200053157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000557816200051b565b919050565b805180151581146200055757600080fd5b600080600080600060a086880312156200058657600080fd5b855162000593816200051b565b602087810151919650906001600160401b0380821115620005b357600080fd5b818901915089601f830112620005c857600080fd5b815181811115620005dd57620005dd62000534565b8060051b604051601f19603f8301168101818110858211171562000605576200060562000534565b60405291825284820192508381018501918c8311156200062457600080fd5b938501935b828510156200064d576200063d856200054a565b8452938501939285019262000629565b80995050505050505062000664604087016200054a565b925062000674606087016200055c565b915062000684608087016200054a565b90509295509295909350565b634e487b7160e01b600052603260045260246000fd5b81810381811115620003a857634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c05160e0516147786200078160003960008181610545015261190b0152600081816105f201528181611f400152612afc0152600081816105cc01528181611cd801526121f30152600081816102ad01528181610302015281816107d0015281816108a20152818161096c015281816119cd01528181611bf801528181612113015281816122f901528181612a920152612ce701526147786000f3fe608060405234801561001057600080fd5b50600436106102415760003560e01c80638da5cb5b11610145578063c0d78655116100bd578063db6327dc1161008c578063e0351e1311610071578063e0351e13146105f0578063eb521a4c14610616578063f2fde38b1461062957600080fd5b8063db6327dc146105b7578063dc0bd971146105ca57600080fd5b8063c0d7865514610569578063c4bffe2b1461057c578063c75eea9c14610591578063cf7401f3146105a457600080fd5b8063a8d87a3b11610114578063b0f479a1116100f9578063b0f479a114610512578063b794658014610530578063bb98546b1461054357600080fd5b8063a8d87a3b14610490578063af58d59f146104a357600080fd5b80638da5cb5b1461042a5780639766b932146104485780639a4575b91461045b578063a7cd63b71461047b57600080fd5b806354c8a4f3116101d857806378a010b2116101a75780637d54534e1161018c5780637d54534e146103f157806383826b2b146104045780638926f54f1461041757600080fd5b806378a010b2146103d657806379ba5097146103e957600080fd5b806354c8a4f31461037f57806366320087146103925780636cfd1553146103a55780636d3d1a58146103b857600080fd5b806321df0da71161021457806321df0da7146102ab578063240028e8146102f2578063390775371461033f578063432a6ba31461036157600080fd5b806301ffc9a7146102465780630a2fd4931461026e5780630a861f2a1461028e578063181f5a77146102a3575b600080fd5b610259610254366004613691565b61063c565b60405190151581526020015b60405180910390f35b61028161027c3660046136f0565b610698565b6040516102659190613779565b6102a161029c36600461378c565b610748565b005b6102816108f9565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610265565b6102596103003660046137d2565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b61035261034d3660046137ef565b610915565b60405190518152602001610265565b600a5473ffffffffffffffffffffffffffffffffffffffff166102cd565b6102a161038d366004613877565b610a3e565b6102a16103a03660046138e3565b610ab9565b6102a16103b33660046137d2565b610b45565b60085473ffffffffffffffffffffffffffffffffffffffff166102cd565b6102a16103e436600461390f565b610b94565b6102a1610d03565b6102a16103ff3660046137d2565b610e00565b610259610412366004613992565b610e4f565b6102596104253660046136f0565b610f1c565b60005473ffffffffffffffffffffffffffffffffffffffff166102cd565b6102a16104563660046137d2565b610f33565b61046e6104693660046139c9565b610fc2565b6040516102659190613a04565b61048361108b565b6040516102659190613a64565b6102cd61049e3660046136f0565b503090565b6104b66104b13660046136f0565b61109c565b604051610265919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff166102cd565b61028161053e3660046136f0565b611171565b7f0000000000000000000000000000000000000000000000000000000000000000610259565b6102a16105773660046137d2565b61119c565b610584611270565b6040516102659190613abe565b6104b661059f3660046136f0565b611328565b6102a16105b2366004613c75565b6113fa565b6102a16105c5366004613cba565b611483565b7f00000000000000000000000000000000000000000000000000000000000000006102cd565b7f0000000000000000000000000000000000000000000000000000000000000000610259565b6102a161062436600461378c565b611909565b6102a16106373660046137d2565b611a25565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fe1d40566000000000000000000000000000000000000000000000000000000001480610692575061069282611a39565b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906106c390613cfc565b80601f01602080910402602001604051908101604052809291908181526020018280546106ef90613cfc565b801561073c5780601f106107115761010080835404028352916020019161073c565b820191906000526020600020905b81548152906001019060200180831161071f57829003601f168201915b50505050509050919050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146107a0576040517f8e4a23d60000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015281907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561082c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108509190613d4f565b1015610888576040517fbb55fd2700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108c973ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163383611b1d565b604051819033907fc2c3f06e49b9f15e7b4af9055e183b0d73362e033ad82a07dec9bf984017171990600090a350565b6040518060600160405280602681526020016147466026913981565b60408051602081019091526000815261093561093083613e04565b611bf1565b60095473ffffffffffffffffffffffffffffffffffffffff1661099c5761099773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016336060850135611b1d565b6109ad565b6109ad6109a883613e04565b611e22565b6109bd60608301604084016137d2565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f2d87480f50083e2b2759522a8fdda59802650a8055e609a7772cf70c07748f528460600135604051610a1f91815260200190565b60405180910390a3506040805160208101909152606090910135815290565b610a46611ebb565b610ab384848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611f3e92505050565b50505050565b610ac1611ebb565b6040517f0a861f2a0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff831690630a861f2a90602401600060405180830381600087803b158015610b2957600080fd5b505af1158015610b3d573d6000803e3d6000fd5b505050505050565b610b4d611ebb565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610b9c611ebb565b610ba583610f1c565b610be7576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610797565b67ffffffffffffffff831660009081526007602052604081206004018054610c0e90613cfc565b80601f0160208091040260200160405190810160405280929190818152602001828054610c3a90613cfc565b8015610c875780601f10610c5c57610100808354040283529160200191610c87565b820191906000526020600020905b815481529060010190602001808311610c6a57829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610cb6838583613f41565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610cf59392919061405b565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610797565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610e08611ebb565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600073ffffffffffffffffffffffffffffffffffffffff8216301480610f155750600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff86169281019290925273ffffffffffffffffffffffffffffffffffffffff848116602484015216906383826b2b90604401602060405180830381865afa158015610ef1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1591906140bf565b9392505050565b6000610692600567ffffffffffffffff84166120f4565b610f3b611ebb565b6009805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f81accd0a7023865eaa51b3399dd0eafc488bf3ba238402911e1659cfe860f22891015b60405180910390a15050565b6040805180820190915260608082526020820152610fe7610fe2836140dc565b61210c565b60095473ffffffffffffffffffffffffffffffffffffffff161561101657611016611011836140dc565b6122d6565b6040516060830135815233907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060200160405180910390a2604051806040016040528061107084602001602081019061053e91906136f0565b81526040805160208181019092526000815291015292915050565b606061109760026123f0565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff161515948201949094526003909101548084166060830152919091049091166080820152610692906123fd565b67ffffffffffffffff811660009081526007602052604090206005018054606091906106c390613cfc565b6111a4611ebb565b73ffffffffffffffffffffffffffffffffffffffff81166111f1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849101610fb6565b6060600061127e60056123f0565b90506000815167ffffffffffffffff81111561129c5761129c613b00565b6040519080825280602002602001820160405280156112c5578160200160208202803683370190505b50905060005b8251811015611321578281815181106112e6576112e661417e565b60200260200101518282815181106113005761130061417e565b67ffffffffffffffff909216602092830291909101909101526001016112cb565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff161515948201949094526001909101548084166060830152919091049091166080820152610692906123fd565b60085473ffffffffffffffffffffffffffffffffffffffff16331480159061143a575060005473ffffffffffffffffffffffffffffffffffffffff163314155b15611473576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610797565b61147e8383836124af565b505050565b61148b611ebb565b60005b8181101561147e5760008383838181106114aa576114aa61417e565b90506020028101906114bc91906141ad565b6114c5906141eb565b90506114da8160800151826020015115612599565b6114ed8160a00151826020015115612599565b8060200151156117e957805161150f9060059067ffffffffffffffff166126d2565b6115545780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610797565b60408101515115806115695750606081015151155b156115a0576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c17909116961515029590951790985590810151940151938116931690910291909117600382015591519091906004820190611781908261429f565b5060608201516005820190611796908261429f565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506117dc94939291906143b9565b60405180910390a1611900565b80516118019060059067ffffffffffffffff166126de565b6118465780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610797565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906118af6004830182613643565b6118bd600583016000613643565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b5060010161148e565b7f0000000000000000000000000000000000000000000000000000000000000000611960576040517fe93f8fa400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff1633146119b3576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610797565b6119f573ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846126ea565b604051819033907fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb31208890600090a350565b611a2d611ebb565b611a3681612748565b50565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf000000000000000000000000000000000000000000000000000000001480611acc57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061069257507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a7000000000000000000000000000000000000000000000000000000001492915050565b60405173ffffffffffffffffffffffffffffffffffffffff831660248201526044810182905261147e9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261283d565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611c865760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610797565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611d34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5891906140bf565b15611d8f576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d9c8160200151612949565b6000611dab8260200151610698565b9050805160001480611dcf575080805190602001208260a001518051906020012014155b15611e0c578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016107979190613779565b611e1e82602001518360600151612a6f565b5050565b6009548151606083015160208401516040517f8627fad600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90941693638627fad693611e869390923392600401614452565b600060405180830381600087803b158015611ea057600080fd5b505af1158015611eb4573d6000803e3d6000fd5b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611f3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610797565b565b7f0000000000000000000000000000000000000000000000000000000000000000611f95576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561202b576000838281518110611fb557611fb561417e565b60200260200101519050611fd3816002612ab690919063ffffffff16565b156120225760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611f98565b5060005b815181101561147e57600082828151811061204c5761204c61417e565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361209057506120ec565b61209b600282612ad8565b156120ea5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010161202f565b60008181526001830160205260408120541515610f15565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146121a15760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610797565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa15801561224f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227391906140bf565b156122aa576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122b78160400151612afa565b6122c48160200151612b79565b611a3681602001518260600151612cc7565b60095460608201516123239173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692911690611b1d565b60095460408083015183516060850151602086015193517f9687544500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9095169463968754459461238b949392916004016144b3565b6000604051808303816000875af11580156123aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611e1e9190810190614513565b60606000610f1583612d0b565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261248b82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261246f91906145b0565b85608001516fffffffffffffffffffffffffffffffff16612d66565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b6124b883610f1c565b6124fa576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610797565b612505826000612599565b67ffffffffffffffff831660009081526007602052604090206125289083612d90565b612533816000612599565b67ffffffffffffffff831660009081526007602052604090206125599060020182612d90565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b83838360405161258c939291906145c3565b60405180910390a1505050565b8151156126605781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff161015806125ef575060408201516fffffffffffffffffffffffffffffffff16155b1561262857816040517f8020d1240000000000000000000000000000000000000000000000000000000081526004016107979190614646565b8015611e1e576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580612699575060208201516fffffffffffffffffffffffffffffffff1615155b15611e1e57816040517fd68af9cc0000000000000000000000000000000000000000000000000000000081526004016107979190614646565b6000610f158383612f32565b6000610f158383612f81565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610ab39085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611b6f565b3373ffffffffffffffffffffffffffffffffffffffff8216036127c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610797565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600061289f826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166130749092919063ffffffff16565b80519091501561147e57808060200190518101906128bd91906140bf565b61147e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610797565b61295281610f1c565b612994576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610797565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a3791906140bf565b611a36576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610797565b67ffffffffffffffff82166000908152600760205260409020611e1e90600201827f0000000000000000000000000000000000000000000000000000000000000000613083565b6000610f158373ffffffffffffffffffffffffffffffffffffffff8416612f81565b6000610f158373ffffffffffffffffffffffffffffffffffffffff8416612f32565b7f000000000000000000000000000000000000000000000000000000000000000015611a3657612b2b600282613406565b611a36576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610797565b612b8281610f1c565b612bc4576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610797565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612c3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c619190614682565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a36576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610797565b67ffffffffffffffff82166000908152600760205260409020611e1e90827f0000000000000000000000000000000000000000000000000000000000000000613083565b60608160000180548060200260200160405190810160405280929190818152602001828054801561073c57602002820191906000526020600020905b815481526020019060010190808311612d475750505050509050919050565b6000612d8585612d76848661469f565b612d8090876146b6565b613435565b90505b949350505050565b8154600090612db990700100000000000000000000000000000000900463ffffffff16426145b0565b90508015612e5b5760018301548354612e01916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612d66565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612e81916fffffffffffffffffffffffffffffffff9081169116613435565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061258c908490614646565b6000818152600183016020526040812054612f7957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610692565b506000610692565b6000818152600183016020526040812054801561306a576000612fa56001836145b0565b8554909150600090612fb9906001906145b0565b905081811461301e576000866000018281548110612fd957612fd961417e565b9060005260206000200154905080876000018481548110612ffc57612ffc61417e565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061302f5761302f6146c9565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610692565b6000915050610692565b6060612d88848460008561344b565b825474010000000000000000000000000000000000000000900460ff1615806130aa575081155b156130b457505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906130fa90700100000000000000000000000000000000900463ffffffff16426145b0565b905080156131ba578183111561313c576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546131769083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612d66565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156132715773ffffffffffffffffffffffffffffffffffffffff8416613219576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610797565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610797565b848310156133845760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906132b590826145b0565b6132bf878a6145b0565b6132c991906146b6565b6132d391906146f8565b905073ffffffffffffffffffffffffffffffffffffffff861661332c576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610797565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610797565b61338e85846145b0565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610f15565b60008183106134445781610f15565b5090919050565b6060824710156134dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610797565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516135069190614733565b60006040518083038185875af1925050503d8060008114613543576040519150601f19603f3d011682016040523d82523d6000602084013e613548565b606091505b509150915061355987838387613564565b979650505050505050565b606083156135fa5782516000036135f35773ffffffffffffffffffffffffffffffffffffffff85163b6135f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610797565b5081612d88565b612d88838381511561360f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107979190613779565b50805461364f90613cfc565b6000825580601f1061365f575050565b601f016020900490600052602060002090810190611a3691905b8082111561368d5760008155600101613679565b5090565b6000602082840312156136a357600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f1557600080fd5b803567ffffffffffffffff811681146136eb57600080fd5b919050565b60006020828403121561370257600080fd5b610f15826136d3565b60005b8381101561372657818101518382015260200161370e565b50506000910152565b6000815180845261374781602086016020860161370b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610f15602083018461372f565b60006020828403121561379e57600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff81168114611a3657600080fd5b80356136eb816137a5565b6000602082840312156137e457600080fd5b8135610f15816137a5565b60006020828403121561380157600080fd5b813567ffffffffffffffff81111561381857600080fd5b82016101008185031215610f1557600080fd5b60008083601f84011261383d57600080fd5b50813567ffffffffffffffff81111561385557600080fd5b6020830191508360208260051b850101111561387057600080fd5b9250929050565b6000806000806040858703121561388d57600080fd5b843567ffffffffffffffff808211156138a557600080fd5b6138b18883890161382b565b909650945060208701359150808211156138ca57600080fd5b506138d78782880161382b565b95989497509550505050565b600080604083850312156138f657600080fd5b8235613901816137a5565b946020939093013593505050565b60008060006040848603121561392457600080fd5b61392d846136d3565b9250602084013567ffffffffffffffff8082111561394a57600080fd5b818601915086601f83011261395e57600080fd5b81358181111561396d57600080fd5b87602082850101111561397f57600080fd5b6020830194508093505050509250925092565b600080604083850312156139a557600080fd5b6139ae836136d3565b915060208301356139be816137a5565b809150509250929050565b6000602082840312156139db57600080fd5b813567ffffffffffffffff8111156139f257600080fd5b820160a08185031215610f1557600080fd5b602081526000825160406020840152613a20606084018261372f565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0848303016040850152613a5b828261372f565b95945050505050565b6020808252825182820181905260009190848201906040850190845b81811015613ab257835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101613a80565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015613ab257835167ffffffffffffffff1683529284019291840191600101613ada565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715613b5357613b53613b00565b60405290565b60405160c0810167ffffffffffffffff81118282101715613b5357613b53613b00565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613bc357613bc3613b00565b604052919050565b8015158114611a3657600080fd5b80356136eb81613bcb565b80356fffffffffffffffffffffffffffffffff811681146136eb57600080fd5b600060608284031215613c1657600080fd5b6040516060810181811067ffffffffffffffff82111715613c3957613c39613b00565b6040529050808235613c4a81613bcb565b8152613c5860208401613be4565b6020820152613c6960408401613be4565b60408201525092915050565b600080600060e08486031215613c8a57600080fd5b613c93846136d3565b9250613ca28560208601613c04565b9150613cb18560808601613c04565b90509250925092565b60008060208385031215613ccd57600080fd5b823567ffffffffffffffff811115613ce457600080fd5b613cf08582860161382b565b90969095509350505050565b600181811c90821680613d1057607f821691505b602082108103613d49577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208284031215613d6157600080fd5b5051919050565b600067ffffffffffffffff821115613d8257613d82613b00565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600082601f830112613dbf57600080fd5b8135613dd2613dcd82613d68565b613b7c565b818152846020838601011115613de757600080fd5b816020850160208301376000918101602001919091529392505050565b60006101008236031215613e1757600080fd5b613e1f613b2f565b823567ffffffffffffffff80821115613e3757600080fd5b613e4336838701613dae565b8352613e51602086016136d3565b6020840152613e62604086016137c7565b604084015260608501356060840152613e7d608086016137c7565b608084015260a0850135915080821115613e9657600080fd5b613ea236838701613dae565b60a084015260c0850135915080821115613ebb57600080fd5b613ec736838701613dae565b60c084015260e0850135915080821115613ee057600080fd5b50613eed36828601613dae565b60e08301525092915050565b601f82111561147e576000816000526020600020601f850160051c81016020861015613f225750805b601f850160051c820191505b81811015610b3d57828155600101613f2e565b67ffffffffffffffff831115613f5957613f59613b00565b613f6d83613f678354613cfc565b83613ef9565b6000601f841160018114613fbf5760008515613f895750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355611eb4565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b8281101561400e5786850135825560209485019460019092019101613fee565b5086821015614049577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555050505050565b60408152600061406e604083018661372f565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b6000602082840312156140d157600080fd5b8151610f1581613bcb565b600060a082360312156140ee57600080fd5b60405160a0810167ffffffffffffffff828210818311171561411257614112613b00565b81604052843591508082111561412757600080fd5b5061413436828601613dae565b825250614143602084016136d3565b60208201526040830135614156816137a5565b6040820152606083810135908201526080830135614173816137a5565b608082015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec18336030181126141e157600080fd5b9190910192915050565b600061014082360312156141fe57600080fd5b614206613b59565b61420f836136d3565b815261421d60208401613bd9565b6020820152604083013567ffffffffffffffff8082111561423d57600080fd5b61424936838701613dae565b6040840152606085013591508082111561426257600080fd5b5061426f36828601613dae565b6060830152506142823660808501613c04565b60808201526142943660e08501613c04565b60a082015292915050565b815167ffffffffffffffff8111156142b9576142b9613b00565b6142cd816142c78454613cfc565b84613ef9565b602080601f83116001811461432057600084156142ea5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610b3d565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561436d5788860151825594840194600190910190840161434e565b50858210156143a957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff871683528060208401526143dd8184018761372f565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff908116606087015290870151166080850152915061441b9050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152613a5b565b60a08152600061446560a083018761372f565b73ffffffffffffffffffffffffffffffffffffffff8616602084015284604084015267ffffffffffffffff841660608401528281036080840152600081526020810191505095945050505050565b73ffffffffffffffffffffffffffffffffffffffff8516815260a0602082015260006144e260a083018661372f565b60408301949094525067ffffffffffffffff9190911660608201528082036080909101526000815260200192915050565b60006020828403121561452557600080fd5b815167ffffffffffffffff81111561453c57600080fd5b8201601f8101841361454d57600080fd5b805161455b613dcd82613d68565b81815285602083850101111561457057600080fd5b613a5b82602083016020860161370b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561069257610692614581565b67ffffffffffffffff8416815260e0810161460f60208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152612d88565b6060810161069282848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561469457600080fd5b8151610f15816137a5565b808202811582820484141761069257610692614581565b8082018082111561069257610692614581565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60008261472e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082516141e181846020870161370b56fe4c6f636b52656c65617365546f6b656e506f6f6c416e6450726f787920312e352e302d646576a164736f6c6343000818000a",
}
var LockReleaseTokenPoolAndProxyABI = LockReleaseTokenPoolAndProxyMetaData.ABI
@@ -806,6 +806,18 @@ func (_LockReleaseTokenPoolAndProxy *LockReleaseTokenPoolAndProxyTransactorSessi
return _LockReleaseTokenPoolAndProxy.Contract.SetRouter(&_LockReleaseTokenPoolAndProxy.TransactOpts, newRouter)
}
+func (_LockReleaseTokenPoolAndProxy *LockReleaseTokenPoolAndProxyTransactor) TransferLiquidity(opts *bind.TransactOpts, from common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _LockReleaseTokenPoolAndProxy.contract.Transact(opts, "transferLiquidity", from, amount)
+}
+
+func (_LockReleaseTokenPoolAndProxy *LockReleaseTokenPoolAndProxySession) TransferLiquidity(from common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _LockReleaseTokenPoolAndProxy.Contract.TransferLiquidity(&_LockReleaseTokenPoolAndProxy.TransactOpts, from, amount)
+}
+
+func (_LockReleaseTokenPoolAndProxy *LockReleaseTokenPoolAndProxyTransactorSession) TransferLiquidity(from common.Address, amount *big.Int) (*types.Transaction, error) {
+ return _LockReleaseTokenPoolAndProxy.Contract.TransferLiquidity(&_LockReleaseTokenPoolAndProxy.TransactOpts, from, amount)
+}
+
func (_LockReleaseTokenPoolAndProxy *LockReleaseTokenPoolAndProxyTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) {
return _LockReleaseTokenPoolAndProxy.contract.Transact(opts, "transferOwnership", to)
}
@@ -3278,6 +3290,8 @@ type LockReleaseTokenPoolAndProxyInterface interface {
SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
+ TransferLiquidity(opts *bind.TransactOpts, from common.Address, amount *big.Int) (*types.Transaction, error)
+
TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
WithdrawLiquidity(opts *bind.TransactOpts, amount *big.Int) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generated/price_registry/price_registry.go b/core/gethwrappers/ccip/generated/price_registry/price_registry.go
index 19f1bd4a19..a93faaf82c 100644
--- a/core/gethwrappers/ccip/generated/price_registry/price_registry.go
+++ b/core/gethwrappers/ccip/generated/price_registry/price_registry.go
@@ -147,7 +147,7 @@ type PriceRegistryTokenTransferFeeConfigSingleTokenArgs struct {
var PriceRegistryMetaData = &bind.MetaData{
ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structPriceRegistry.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structPriceRegistry.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chain\",\"type\":\"uint64\"}],\"name\":\"ChainNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"priceUpdater\",\"type\":\"address\"}],\"name\":\"PriceUpdaterRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"priceUpdater\",\"type\":\"address\"}],\"name\":\"PriceUpdaterSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structPriceRegistry.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structPriceRegistry.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"rampTokenAmounts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"validatePoolReturnData\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b50604051620069373803806200693783398101604081905262000034916200180a565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a99565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b65565b5050505050505062001ac8565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001929565b60209081029190910101519050620002f560028262000e98565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001929565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000eb8565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001929565b6020026020010151600c62000eb860201b90919060201c565b1562000499578281815181106200045b576200045b62001929565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001929565b6020026020010151600c62000e9860201b90919060201c565b156200053b57818181518110620004fd57620004fd62001929565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001929565b6020908102919091018101518051818301516001600160a01b0380831660008181526006875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001929565b6020026020010151905060008383815181106200065f576200065f62001929565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061018081015163ffffffff16155b80620006ba57506102008101516001600160e01b031916630a04b54b60e21b14155b80620006d15750602081610160015163ffffffff16105b80620006f15750806060015163ffffffff1681610180015163ffffffff16115b156200071c5760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260086020526040812060010154600160a81b900460e01b6001600160e01b03191690036200079c57816001600160401b03167fa937382a486d993de71c220bc8b559242deb4e286a353fa732330b4aa7d13577826040516200078e91906200193f565b60405180910390a2620007e0565b816001600160401b03167fa7b607fc10d28a1caf39ab7d27f4c94945db708a576d572781a455c5894fad9382604051620007d791906200193f565b60405180910390a25b8060086000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101a08201518160010160086101000a8154816001600160401b0302191690836001600160401b031602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000abd5762000abd62001929565b6020026020010151600001519050600083838151811062000ae25762000ae262001929565b6020908102919091018101518101516001600160a01b03841660008181526007845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000a9c565b60005b825181101562000dd257600083828151811062000b895762000b8962001929565b6020026020010151905060008160000151905060005b82602001515181101562000dc35760008360200151828151811062000bc85762000bc862001929565b602002602001015160200151905060008460200151838151811062000bf15762000bf162001929565b60200260200101516000015190506020826080015163ffffffff16101562000c4a5760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b03841660008181526009602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000db0908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000b9f565b50505080600101905062000b68565b5060005b81518110156200054457600082828151811062000df75762000df762001929565b6020026020010151600001519050600083838151811062000e1c5762000e1c62001929565b6020908102919091018101518101516001600160401b03841660008181526009845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000dd6565b600062000eaf836001600160a01b03841662000ecf565b90505b92915050565b600062000eaf836001600160a01b03841662000fd3565b6000818152600183016020526040812054801562000fc857600062000ef660018362001a90565b855490915060009062000f0c9060019062001a90565b905081811462000f7857600086600001828154811062000f305762000f3062001929565b906000526020600020015490508087600001848154811062000f565762000f5662001929565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f8c5762000f8c62001ab2565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000eb2565b600091505062000eb2565b60008181526001830160205260408120546200101c5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000eb2565b50600062000eb2565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b038111828210171562001060576200106062001025565b60405290565b60405160c081016001600160401b038111828210171562001060576200106062001025565b60405161022081016001600160401b038111828210171562001060576200106062001025565b604051601f8201601f191681016001600160401b0381118282101715620010dc57620010dc62001025565b604052919050565b80516001600160a01b0381168114620010fc57600080fd5b919050565b805163ffffffff81168114620010fc57600080fd5b6000606082840312156200112957600080fd5b604051606081016001600160401b03811182821017156200114e576200114e62001025565b604052825190915081906001600160601b03811681146200116e57600080fd5b81526200117e60208401620010e4565b6020820152620011916040840162001101565b60408201525092915050565b60006001600160401b03821115620011b957620011b962001025565b5060051b60200190565b600082601f830112620011d557600080fd5b81516020620011ee620011e8836200119d565b620010b1565b8083825260208201915060208460051b8701019350868411156200121157600080fd5b602086015b8481101562001238576200122a81620010e4565b835291830191830162001216565b509695505050505050565b600082601f8301126200125557600080fd5b8151602062001268620011e8836200119d565b828152606092830285018201928282019190878511156200128857600080fd5b8387015b858110156200131b5780890382811215620012a75760008081fd5b620012b16200103b565b620012bc83620010e4565b8152604080601f1984011215620012d35760008081fd5b620012dd6200103b565b9250620012ec888501620010e4565b835283015160ff81168114620013025760008081fd5b828801528087019190915284529284019281016200128c565b5090979650505050505050565b80516001600160401b0381168114620010fc57600080fd5b805161ffff81168114620010fc57600080fd5b80518015158114620010fc57600080fd5b600082601f8301126200137657600080fd5b8151602062001389620011e8836200119d565b82815260059290921b84018101918181019086841115620013a957600080fd5b8286015b84811015620012385780516001600160401b0380821115620013ce57600080fd5b908801906040601f19838c038101821315620013e957600080fd5b620013f36200103b565b6200140089860162001328565b815282850151848111156200141457600080fd5b8086019550508c603f8601126200142a57600080fd5b8885015193506200143f620011e8856200119d565b84815260e09094028501830193898101908e8611156200145e57600080fd5b958401955b858710156200153757868f0360e08112156200147e57600080fd5b620014886200103b565b6200149389620010e4565b815260c08683011215620014a657600080fd5b620014b062001066565b9150620014bf8d8a0162001101565b8252620014ce878a0162001101565b8d830152620014e060608a0162001340565b87830152620014f260808a0162001101565b60608301526200150560a08a0162001101565b60808301526200151860c08a0162001353565b60a0830152808d0191909152825260e09690960195908a019062001463565b828b015250875250505092840192508301620013ad565b600082601f8301126200156057600080fd5b8151602062001573620011e8836200119d565b82815260069290921b840181019181810190868411156200159357600080fd5b8286015b84811015620012385760408189031215620015b25760008081fd5b620015bc6200103b565b620015c782620010e4565b8152620015d685830162001328565b8186015283529183019160400162001597565b80516001600160e01b031981168114620010fc57600080fd5b600082601f8301126200161457600080fd5b8151602062001627620011e8836200119d565b82815261024092830285018201928282019190878511156200164857600080fd5b8387015b858110156200131b5780890382811215620016675760008081fd5b620016716200103b565b6200167c8362001328565b815261022080601f1984011215620016945760008081fd5b6200169e6200108b565b9250620016ad88850162001353565b83526040620016be81860162001340565b898501526060620016d181870162001101565b8286015260809150620016e682870162001101565b9085015260a0620016f986820162001101565b8286015260c091506200170e82870162001340565b9085015260e06200172186820162001101565b8286015261010091506200173782870162001340565b908501526101206200174b86820162001340565b8286015261014091506200176182870162001340565b908501526101606200177586820162001101565b8286015261018091506200178b82870162001101565b908501526101a06200179f86820162001101565b828601526101c09150620017b582870162001328565b908501526101e0620017c986820162001101565b828601526102009150620017df82870162001353565b90850152620017f0858301620015e9565b90840152508087019190915284529284019281016200164c565b6000806000806000806000610120888a0312156200182757600080fd5b62001833898962001116565b60608901519097506001600160401b03808211156200185157600080fd5b6200185f8b838c01620011c3565b975060808a01519150808211156200187657600080fd5b620018848b838c01620011c3565b965060a08a01519150808211156200189b57600080fd5b620018a98b838c0162001243565b955060c08a0151915080821115620018c057600080fd5b620018ce8b838c0162001364565b945060e08a0151915080821115620018e557600080fd5b620018f38b838c016200154e565b93506101008a01519150808211156200190b57600080fd5b506200191a8a828b0162001602565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b8151151581526102208101602083015162001960602084018261ffff169052565b50604083015162001979604084018263ffffffff169052565b50606083015162001992606084018263ffffffff169052565b506080830151620019ab608084018263ffffffff169052565b5060a0830151620019c260a084018261ffff169052565b5060c0830151620019db60c084018263ffffffff169052565b5060e0830151620019f260e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501518216908401526101a0808501516001600160401b0316908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000eb257634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051614e1562001b22600039600081816102d901528181611ad30152611b3c01526000818161029d0152818161104e01526110ae015260008181610269015281816110d701526111470152614e156000f3fe608060405234801561001057600080fd5b50600436106101b85760003560e01c80637afac322116100f9578063cc88924c11610097578063d8694ccd11610071578063d8694ccd14610a5c578063f2fde38b14610a6f578063f700042a14610a82578063ffdb4b3714610a9557600080fd5b8063cc88924c14610a2e578063cdc73d5114610a41578063d02641a014610a4957600080fd5b806391a2749a116100d357806391a2749a14610939578063a69c64c01461094c578063bf78e03f1461095f578063c4276bfc14610a0c57600080fd5b80637afac3221461078e57806382b49eb0146107a15780638da5cb5b1461091157600080fd5b8063407e108611610166578063514e8cff11610140578063514e8cff146104385780636def4ce7146104db578063770e2dc41461077357806379ba50971461078657600080fd5b8063407e1086146103c557806345ac924d146103d85780634ab35b0b146103f857600080fd5b8063181f5a7711610197578063181f5a77146103525780632451a6271461039b5780633937306f146103b057600080fd5b806241e5be146101bd578063061877e3146101e357806306285c691461023c575b600080fd5b6101d06101cb366004613802565b610add565b6040519081526020015b60405180910390f35b6102236101f136600461383e565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101da565b610306604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101da565b61038e6040518060400160405280601781526020017f5072696365526567697374727920312e362e302d64657600000000000000000081525081565b6040516101da91906138bd565b6103a3610b4b565b6040516101da91906138d0565b6103c36103be36600461392a565b610b5c565b005b6103c36103d3366004613a86565b610e11565b6103eb6103e6366004613be4565b610e25565b6040516101da9190613c26565b61040b61040636600461383e565b610ef0565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101da565b6104ce610446366004613cb9565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600460209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101da9190613cd4565b6107666104e9366004613cb9565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260086020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b010000000000000000000000000000000000000000000000000000009092048616610140840152600190930154808616610160840152640100000000810486166101808401526801000000000000000081049096166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101da9190613d0f565b6103c3610781366004613f4c565b610efb565b6103c3610f11565b6103c361079c366004614266565b611013565b6108b16107af3660046142ca565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff91909116600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101da9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101da565b6103c36109473660046142f4565b611025565b6103c361095a366004614385565b611036565b6109d861096d36600461383e565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526006825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101da565b610a1f610a1a36600461444a565b611047565b6040516101da939291906144e5565b6103c3610a3c36600461450f565b611245565b6103a361141b565b6104ce610a5736600461383e565b611427565b6101d0610a6a3660046145aa565b611523565b6103c3610a7d36600461383e565b6119dd565b6103c3610a9036600461462f565b6119ee565b610aa8610aa336600461484f565b6119ff565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101da565b6000610ae882611b8a565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b0f85611b8a565b610b37907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856148a8565b610b4191906148bf565b90505b9392505050565b6060610b576002611c24565b905090565b610b64611c31565b6000610b7082806148fa565b9050905060005b81811015610cba576000610b8b84806148fa565b83818110610b9b57610b9b614962565b905060400201803603810190610bb191906149bd565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610ca99290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610b77565b506000610cca60208401846148fa565b9050905060005b81811015610e0b576000610ce860208601866148fa565b83818110610cf857610cf8614962565b905060400201803603810190610d0e91906149fa565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600490975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610dfa9290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610cd1565b50505050565b610e19611c76565b610e2281611cf7565b50565b60608160008167ffffffffffffffff811115610e4357610e43613965565b604051908082528060200260200182016040528015610e8857816020015b6040805180820190915260008082526020820152815260200190600190039081610e615790505b50905060005b82811015610ee557610ec0868683818110610eab57610eab614962565b9050602002016020810190610a57919061383e565b828281518110610ed257610ed2614962565b6020908102919091010152600101610e8e565b509150505b92915050565b6000610eea82611b8a565b610f03611c76565b610f0d8282611df5565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61101b611c76565b610f0d8282612201565b61102d611c76565b610e2281612348565b61103e611c76565b610e22816124d4565b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036110a7578592506110d5565b6110d287877f0000000000000000000000000000000000000000000000000000000000000000610add565b92505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16831115611174576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018490526bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610f8e565b67ffffffffffffffff8816600090815260086020526040812060010154640100000000900463ffffffff16906111ab8787846125be565b9050806020015193508484611232836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b9450945094505050955095509592505050565b67ffffffffffffffff85166000908152600860205260408120600101547501000000000000000000000000000000000000000000900460e01b905b8481101561141257600084848381811061129c5761129c614962565b6112b2926020604090920201908101915061383e565b905060008787848181106112c8576112c8614962565b90506020028101906112da9190614a1d565b6112e8906040810190614a5b565b91505060208111156113985767ffffffffffffffff8916600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115611398576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610f8e565b611408848989868181106113ae576113ae614962565b90506020028101906113c09190614a1d565b6113ce906020810190614a5b565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061276792505050565b5050600101611280565b50505050505050565b6060610b57600c611c24565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8281166000908152600660209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff16908201529061151a57505073ffffffffffffffffffffffffffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b610b44816127b9565b67ffffffffffffffff8083166000908152600860209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b010000000000000000000000000000000000000000000000000000009093048616610140850152600190940154808616610160850152640100000000810486166101808501526801000000000000000081049098166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611759576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610f8e565b600061176860408501856148fa565b91506117c490508261177d6020870187614a5b565b90508361178a8880614a5b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506129fc92505050565b60006007816117d9608088016060890161383e565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081205467ffffffffffffffff169150806118286118226080890160608a0161383e565b896119ff565b909250905060008080861561186e57611862888c61184c60808e0160608f0161383e565b888e806040019061185d91906148fa565b612aa6565b9194509250905061188e565b6101c088015161188b9063ffffffff16662386f26fc100006148a8565b92505b61010088015160009061ffff16156118d2576118cf896dffffffffffffffffffffffffffff607088901c166118c660208f018f614a5b565b90508b86612d84565b90505b6101a089015160009067ffffffffffffffff166118fb6118f560808f018f614a5b565b8d612e33565b600001518563ffffffff168c60a0015161ffff168f806020019061191f9190614a5b565b61192a9291506148a8565b8d6080015163ffffffff1661193f9190614ac0565b6119499190614ac0565b6119539190614ac0565b61196d906dffffffffffffffffffffffffffff89166148a8565b61197791906148a8565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff871682826119ae67ffffffffffffffff8c16896148a8565b6119b89190614ac0565b6119c29190614ac0565b6119cc91906148bf565b9d9c50505050505050505050505050565b6119e5611c76565b610e2281612ef4565b6119f6611c76565b610e2281612fe9565b67ffffffffffffffff811660009081526004602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff1691810182905282918203611ab7576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610f8e565b6000816020015163ffffffff1642611acf9190614ad3565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16811115611b70576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610f8e565b611b7986611b8a565b9151919350909150505b9250929050565b600080611b9683611427565b9050806020015163ffffffff1660001480611bce575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15611c1d576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610f8e565b5192915050565b60606000610b44836134d1565b611c3c60023361352d565b611c74576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610f8e565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f8e565b60005b8151811015610f0d576000828281518110611d1757611d17614962565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526006875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a2505050806001019050611cfa565b60005b8251811015612118576000838281518110611e1557611e15614962565b6020026020010151905060008160000151905060005b82602001515181101561210a57600083602001518281518110611e5057611e50614962565b6020026020010151602001519050600084602001518381518110611e7657611e76614962565b60200260200101516000015190506020826080015163ffffffff161015611ef35760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610f8e565b67ffffffffffffffff8416600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b5906120f8908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101611e2b565b505050806001019050611df8565b5060005b81518110156121fc57600082828151811061213957612139614962565b6020026020010151600001519050600083838151811061215b5761215b614962565b60209081029190910181015181015167ffffffffffffffff8416600081815260098452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010161211c565b505050565b60005b82518110156122a45761223a83828151811061222257612222614962565b6020026020010151600c61355c90919063ffffffff16565b1561229c5782818151811061225157612251614962565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b600101612204565b5060005b81518110156121fc576122de8282815181106122c6576122c6614962565b6020026020010151600c61357e90919063ffffffff16565b15612340578181815181106122f5576122f5614962565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b6001016122a8565b602081015160005b81518110156123e357600082828151811061236d5761236d614962565b6020026020010151905061238b81600261357e90919063ffffffff16565b156123da5760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101612350565b50815160005b8151811015610e0b57600082828151811061240657612406614962565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612476576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61248160028261355c565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016123e9565b60005b8151811015610f0d5760008282815181106124f4576124f4614962565b6020026020010151600001519050600083838151811061251657612516614962565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526007845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a250506001016124d7565b604080518082019091526000808252602082015260008390036125ff57506040805180820190915267ffffffffffffffff8216815260006020820152610b44565b600061260b8486614ae6565b9050600061261c8560048189614b2c565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016126b957808060200190518101906126b09190614b56565b92505050610b44565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601612735576040518060400160405280828060200190518101906127219190614b82565b815260006020909101529250610b44915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610f0d576121fc816135a0565b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612823573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128479190614bb5565b5050509150506000811215612888576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000819050600085602001518473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129039190614c05565b61290d9190614c22565b905060248160ff16111561294257612926602482614c3b565b61293190600a614d74565b61293b90836148bf565b9150612965565b61294d816024614c3b565b61295890600a614d74565b61296290836148a8565b91505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156129bb576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff42166020820152949350505050565b836040015163ffffffff16831115612a555760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610f8e565b836020015161ffff16821115612a97576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0b84610200015182612767565b6000808083815b81811015612d76576000878783818110612ac957612ac9614962565b905060400201803603810190612adf9190614d83565b67ffffffffffffffff8c166000908152600960209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090612c05576101208d0151612bcc9061ffff16662386f26fc100006148a8565b612bd69088614ac0565b96508c610140015186612be99190614dbc565b95508c610160015185612bfc9190614dbc565b94505050612d6e565b604081015160009061ffff1615612cbe5760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614612c61578351612c5a90611b8a565b9050612c64565b508a5b620186a0836040015161ffff16612ca68660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661365390919063ffffffff16565b612cb091906148a8565b612cba91906148bf565b9150505b6060820151612ccd9088614dbc565b9650816080015186612cdf9190614dbc565b8251909650600090612cfe9063ffffffff16662386f26fc100006148a8565b905080821015612d1d57612d12818a614ac0565b985050505050612d6e565b6000836020015163ffffffff16662386f26fc10000612d3c91906148a8565b905080831115612d5c57612d50818b614ac0565b99505050505050612d6e565b612d66838b614ac0565b995050505050505b600101612aad565b505096509650969350505050565b60008063ffffffff8316612d9960e0866148a8565b612da5876101c0614ac0565b612daf9190614ac0565b612db99190614ac0565b905060008760c0015163ffffffff168860e0015161ffff1683612ddc91906148a8565b612de69190614ac0565b61010089015190915061ffff16612e0d6dffffffffffffffffffffffffffff8916836148a8565b612e1791906148a8565b612e2790655af3107a40006148a8565b98975050505050505050565b60408051808201909152600080825260208201526000612e5f858585610180015163ffffffff166125be565b9050826060015163ffffffff1681600001511115612ea9576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015612ebd57508060200151155b15610b41576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612f73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f8e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015610f0d57600082828151811061300957613009614962565b60200260200101519050600083838151811061302757613027614962565b60200260200101516000015190506000826020015190508167ffffffffffffffff1660001480613060575061018081015163ffffffff16155b806130b257506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806130c85750602081610160015163ffffffff16105b806130e75750806060015163ffffffff1681610180015163ffffffff16115b1561312a576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f8e565b67ffffffffffffffff82166000908152600860205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff000000000000000000000000000000000000000000000000000000001690036131d2578167ffffffffffffffff167fa937382a486d993de71c220bc8b559242deb4e286a353fa732330b4aa7d13577826040516131c59190613d0f565b60405180910390a2613215565b8167ffffffffffffffff167fa7b607fc10d28a1caf39ab7d27f4c94945db708a576d572781a455c5894fad938260405161320c9190613d0f565b60405180910390a25b80600860008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101a08201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050612fec565b60608160000180548060200260200160405190810160405280929190818152602001828054801561352157602002820191906000526020600020905b81548152602001906001019080831161350d575b50505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b44565b6000610b448373ffffffffffffffffffffffffffffffffffffffff8416613690565b6000610b448373ffffffffffffffffffffffffffffffffffffffff84166136df565b600081516020146135df57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610f8e91906138bd565b6000828060200190518101906135f59190614b82565b905073ffffffffffffffffffffffffffffffffffffffff81118061361a575061040081105b15610eea57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610f8e91906138bd565b6000670de0b6b3a7640000613686837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166148a8565b610b4491906148bf565b60008181526001830160205260408120546136d757508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eea565b506000610eea565b600081815260018301602052604081205480156137c8576000613703600183614ad3565b855490915060009061371790600190614ad3565b905081811461377c57600086600001828154811061373757613737614962565b906000526020600020015490508087600001848154811061375a5761375a614962565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061378d5761378d614dd9565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610eea565b6000915050610eea565b5092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146137fd57600080fd5b919050565b60008060006060848603121561381757600080fd5b613820846137d9565b925060208401359150613835604085016137d9565b90509250925092565b60006020828403121561385057600080fd5b610b44826137d9565b6000815180845260005b8181101561387f57602081850181015186830182015201613863565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b446020830184613859565b6020808252825182820181905260009190848201906040850190845b8181101561391e57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016138ec565b50909695505050505050565b60006020828403121561393c57600080fd5b813567ffffffffffffffff81111561395357600080fd5b820160408185031215610b4457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156139b7576139b7613965565b60405290565b60405160c0810167ffffffffffffffff811182821017156139b7576139b7613965565b604051610220810167ffffffffffffffff811182821017156139b7576139b7613965565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a4b57613a4b613965565b604052919050565b600067ffffffffffffffff821115613a6d57613a6d613965565b5060051b60200190565b60ff81168114610e2257600080fd5b60006020808385031215613a9957600080fd5b823567ffffffffffffffff811115613ab057600080fd5b8301601f81018513613ac157600080fd5b8035613ad4613acf82613a53565b613a04565b81815260609182028301840191848201919088841115613af357600080fd5b938501935b83851015613b935784890381811215613b115760008081fd5b613b19613994565b613b22876137d9565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215613b565760008081fd5b613b5e613994565b9250613b6b8989016137d9565b8352870135613b7981613a77565b828901528088019190915283529384019391850191613af8565b50979650505050505050565b60008083601f840112613bb157600080fd5b50813567ffffffffffffffff811115613bc957600080fd5b6020830191508360208260051b8501011115611b8357600080fd5b60008060208385031215613bf757600080fd5b823567ffffffffffffffff811115613c0e57600080fd5b613c1a85828601613b9f565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015613c9457613c8484835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101613c43565b5091979650505050505050565b803567ffffffffffffffff811681146137fd57600080fd5b600060208284031215613ccb57600080fd5b610b4482613ca1565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff169082015260408101610eea565b81511515815261022081016020830151613d2f602084018261ffff169052565b506040830151613d47604084018263ffffffff169052565b506060830151613d5f606084018263ffffffff169052565b506080830151613d77608084018263ffffffff169052565b5060a0830151613d8d60a084018261ffff169052565b5060c0830151613da560c084018263ffffffff169052565b5060e0830151613dbb60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501518216908401526101a08085015167ffffffffffffffff16908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff811681146137fd57600080fd5b803561ffff811681146137fd57600080fd5b8015158114610e2257600080fd5b80356137fd81613e9b565b600082601f830112613ec557600080fd5b81356020613ed5613acf83613a53565b82815260069290921b84018101918181019086841115613ef457600080fd5b8286015b84811015613f415760408189031215613f115760008081fd5b613f19613994565b613f2282613ca1565b8152613f2f8583016137d9565b81860152835291830191604001613ef8565b509695505050505050565b60008060408385031215613f5f57600080fd5b67ffffffffffffffff83351115613f7557600080fd5b83601f843585010112613f8757600080fd5b613f97613acf8435850135613a53565b8335840180358083526020808401939260059290921b90910101861015613fbd57600080fd5b602085358601015b85358601803560051b016020018110156141ca5767ffffffffffffffff81351115613fef57600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a0301121561402857600080fd5b614030613994565b61403c60208301613ca1565b815267ffffffffffffffff6040830135111561405757600080fd5b88603f60408401358401011261406c57600080fd5b614082613acf6020604085013585010135613a53565b6020604084810135850182810135808552928401939260e00201018b10156140a957600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156141ab5760e0818d0312156140dc57600080fd5b6140e4613994565b6140ed826137d9565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f0301121561412157600080fd5b6141296139bd565b61413560208401613e75565b815261414360408401613e75565b602082015261415460608401613e89565b604082015261416560808401613e75565b606082015261417660a08401613e75565b608082015261418860c0840135613e9b565b60c083013560a0820152602082810191909152908452929092019160e0016140b3565b5080602084015250508085525050602083019250602081019050613fc5565b5092505067ffffffffffffffff602084013511156141e757600080fd5b6141f78460208501358501613eb4565b90509250929050565b600082601f83011261421157600080fd5b81356020614221613acf83613a53565b8083825260208201915060208460051b87010193508684111561424357600080fd5b602086015b84811015613f4157614259816137d9565b8352918301918301614248565b6000806040838503121561427957600080fd5b823567ffffffffffffffff8082111561429157600080fd5b61429d86838701614200565b935060208501359150808211156142b357600080fd5b506142c085828601614200565b9150509250929050565b600080604083850312156142dd57600080fd5b6142e683613ca1565b91506141f7602084016137d9565b60006020828403121561430657600080fd5b813567ffffffffffffffff8082111561431e57600080fd5b908301906040828603121561433257600080fd5b61433a613994565b82358281111561434957600080fd5b61435587828601614200565b82525060208301358281111561436a57600080fd5b61437687828601614200565b60208301525095945050505050565b6000602080838503121561439857600080fd5b823567ffffffffffffffff8111156143af57600080fd5b8301601f810185136143c057600080fd5b80356143ce613acf82613a53565b81815260069190911b820183019083810190878311156143ed57600080fd5b928401925b8284101561443f576040848903121561440b5760008081fd5b614413613994565b61441c856137d9565b8152614429868601613ca1565b81870152825260409390930192908401906143f2565b979650505050505050565b60008060008060006080868803121561446257600080fd5b61446b86613ca1565b9450614479602087016137d9565b935060408601359250606086013567ffffffffffffffff8082111561449d57600080fd5b818801915088601f8301126144b157600080fd5b8135818111156144c057600080fd5b8960208285010111156144d257600080fd5b9699959850939650602001949392505050565b83815282151560208201526060604082015260006145066060830184613859565b95945050505050565b60008060008060006060868803121561452757600080fd5b61453086613ca1565b9450602086013567ffffffffffffffff8082111561454d57600080fd5b61455989838a01613b9f565b9096509450604088013591508082111561457257600080fd5b818801915088601f83011261458657600080fd5b81358181111561459557600080fd5b8960208260061b85010111156144d257600080fd5b600080604083850312156145bd57600080fd5b6145c683613ca1565b9150602083013567ffffffffffffffff8111156145e257600080fd5b830160a081860312156145f457600080fd5b809150509250929050565b80357fffffffff00000000000000000000000000000000000000000000000000000000811681146137fd57600080fd5b6000602080838503121561464257600080fd5b823567ffffffffffffffff81111561465957600080fd5b8301601f8101851361466a57600080fd5b8035614678613acf82613a53565b818152610240918202830184019184820191908884111561469857600080fd5b938501935b83851015613b9357848903818112156146b65760008081fd5b6146be613994565b6146c787613ca1565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156146fc5760008081fd5b6147046139e0565b9250614711898901613ea9565b83526040614720818a01613e89565b8a8501526060614731818b01613e75565b8286015260809150614744828b01613e75565b9085015260a06147558a8201613e75565b8286015260c09150614768828b01613e89565b9085015260e06147798a8201613e75565b82860152610100915061478d828b01613e89565b9085015261012061479f8a8201613e89565b8286015261014091506147b3828b01613e89565b908501526101606147c58a8201613e75565b8286015261018091506147d9828b01613e75565b908501526101a06147eb8a8201613e75565b828601526101c091506147ff828b01613ca1565b908501526101e06148118a8201613e75565b828601526102009150614825828b01613ea9565b908501526148348983016145ff565b9084015250808801919091528352938401939185019161469d565b6000806040838503121561486257600080fd5b61486b836137d9565b91506141f760208401613ca1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610eea57610eea614879565b6000826148f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261492f57600080fd5b83018035915067ffffffffffffffff82111561494a57600080fd5b6020019150600681901b3603821315611b8357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146137fd57600080fd5b6000604082840312156149cf57600080fd5b6149d7613994565b6149e0836137d9565b81526149ee60208401614991565b60208201529392505050565b600060408284031215614a0c57600080fd5b614a14613994565b6149e083613ca1565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614a5157600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614a9057600080fd5b83018035915067ffffffffffffffff821115614aab57600080fd5b602001915036819003821315611b8357600080fd5b80820180821115610eea57610eea614879565b81810381811115610eea57610eea614879565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015613e6d5760049490940360031b84901b1690921692915050565b60008085851115614b3c57600080fd5b83861115614b4957600080fd5b5050820193919092039150565b600060408284031215614b6857600080fd5b614b70613994565b8251815260208301516149ee81613e9b565b600060208284031215614b9457600080fd5b5051919050565b805169ffffffffffffffffffff811681146137fd57600080fd5b600080600080600060a08688031215614bcd57600080fd5b614bd686614b9b565b9450602086015193506040860151925060608601519150614bf960808701614b9b565b90509295509295909350565b600060208284031215614c1757600080fd5b8151610b4481613a77565b60ff8181168382160190811115610eea57610eea614879565b60ff8281168282160390811115610eea57610eea614879565b600181815b80851115614cad57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614c9357614c93614879565b80851615614ca057918102915b93841c9390800290614c59565b509250929050565b600082614cc457506001610eea565b81614cd157506000610eea565b8160018114614ce75760028114614cf157614d0d565b6001915050610eea565b60ff841115614d0257614d02614879565b50506001821b610eea565b5060208310610133831016604e8410600b8410161715614d30575081810a610eea565b614d3a8383614c54565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d6c57614d6c614879565b029392505050565b6000610b4460ff841683614cb5565b600060408284031215614d9557600080fd5b614d9d613994565b614da6836137d9565b8152602083013560208201528091505092915050565b63ffffffff8181168382160190808211156137d2576137d2614879565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ Bin: "0x60e06040523480156200001157600080fd5b506040516200695038038062006950833981016040819052620000349162001816565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a9f565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b6b565b5050505050505062001ad4565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001935565b60209081029190910101519050620002f560028262000ea4565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001935565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000ec4565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001935565b6020026020010151600c62000ec460201b90919060201c565b1562000499578281815181106200045b576200045b62001935565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001935565b6020026020010151600c62000ea460201b90919060201c565b156200053b57818181518110620004fd57620004fd62001935565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001935565b6020908102919091018101518051818301516001600160a01b0380831660008181526006875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001935565b6020026020010151905060008383815181106200065f576200065f62001935565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061018081015163ffffffff16155b80620006ba57506102008101516001600160e01b031916630a04b54b60e21b14155b80620006d75750602063ffffffff1681610160015163ffffffff16105b80620006f75750806060015163ffffffff1681610180015163ffffffff16115b15620007225760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260086020526040812060010154600160a81b900460e01b6001600160e01b0319169003620007a257816001600160401b03167fa937382a486d993de71c220bc8b559242deb4e286a353fa732330b4aa7d13577826040516200079491906200194b565b60405180910390a2620007e6565b816001600160401b03167fa7b607fc10d28a1caf39ab7d27f4c94945db708a576d572781a455c5894fad9382604051620007dd91906200194b565b60405180910390a25b8060086000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101a08201518160010160086101000a8154816001600160401b0302191690836001600160401b031602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000ac35762000ac362001935565b6020026020010151600001519050600083838151811062000ae85762000ae862001935565b6020908102919091018101518101516001600160a01b03841660008181526007845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000aa2565b60005b825181101562000dde57600083828151811062000b8f5762000b8f62001935565b6020026020010151905060008160000151905060005b82602001515181101562000dcf5760008360200151828151811062000bce5762000bce62001935565b602002602001015160200151905060008460200151838151811062000bf75762000bf762001935565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c565760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b03841660008181526009602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000dbc908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000ba5565b50505080600101905062000b6e565b5060005b81518110156200054457600082828151811062000e035762000e0362001935565b6020026020010151600001519050600083838151811062000e285762000e2862001935565b6020908102919091018101518101516001600160401b03841660008181526009845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000de2565b600062000ebb836001600160a01b03841662000edb565b90505b92915050565b600062000ebb836001600160a01b03841662000fdf565b6000818152600183016020526040812054801562000fd457600062000f0260018362001a9c565b855490915060009062000f189060019062001a9c565b905081811462000f8457600086600001828154811062000f3c5762000f3c62001935565b906000526020600020015490508087600001848154811062000f625762000f6262001935565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f985762000f9862001abe565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000ebe565b600091505062000ebe565b6000818152600183016020526040812054620010285750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000ebe565b50600062000ebe565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200106c576200106c62001031565b60405290565b60405160c081016001600160401b03811182821017156200106c576200106c62001031565b60405161022081016001600160401b03811182821017156200106c576200106c62001031565b604051601f8201601f191681016001600160401b0381118282101715620010e857620010e862001031565b604052919050565b80516001600160a01b03811681146200110857600080fd5b919050565b805163ffffffff811681146200110857600080fd5b6000606082840312156200113557600080fd5b604051606081016001600160401b03811182821017156200115a576200115a62001031565b604052825190915081906001600160601b03811681146200117a57600080fd5b81526200118a60208401620010f0565b60208201526200119d604084016200110d565b60408201525092915050565b60006001600160401b03821115620011c557620011c562001031565b5060051b60200190565b600082601f830112620011e157600080fd5b81516020620011fa620011f483620011a9565b620010bd565b8083825260208201915060208460051b8701019350868411156200121d57600080fd5b602086015b8481101562001244576200123681620010f0565b835291830191830162001222565b509695505050505050565b600082601f8301126200126157600080fd5b8151602062001274620011f483620011a9565b828152606092830285018201928282019190878511156200129457600080fd5b8387015b85811015620013275780890382811215620012b35760008081fd5b620012bd62001047565b620012c883620010f0565b8152604080601f1984011215620012df5760008081fd5b620012e962001047565b9250620012f8888501620010f0565b835283015160ff811681146200130e5760008081fd5b8288015280870191909152845292840192810162001298565b5090979650505050505050565b80516001600160401b03811681146200110857600080fd5b805161ffff811681146200110857600080fd5b805180151581146200110857600080fd5b600082601f8301126200138257600080fd5b8151602062001395620011f483620011a9565b82815260059290921b84018101918181019086841115620013b557600080fd5b8286015b84811015620012445780516001600160401b0380821115620013da57600080fd5b908801906040601f19838c038101821315620013f557600080fd5b620013ff62001047565b6200140c89860162001334565b815282850151848111156200142057600080fd5b8086019550508c603f8601126200143657600080fd5b8885015193506200144b620011f485620011a9565b84815260e09094028501830193898101908e8611156200146a57600080fd5b958401955b858710156200154357868f0360e08112156200148a57600080fd5b6200149462001047565b6200149f89620010f0565b815260c08683011215620014b257600080fd5b620014bc62001072565b9150620014cb8d8a016200110d565b8252620014da878a016200110d565b8d830152620014ec60608a016200134c565b87830152620014fe60808a016200110d565b60608301526200151160a08a016200110d565b60808301526200152460c08a016200135f565b60a0830152808d0191909152825260e09690960195908a01906200146f565b828b015250875250505092840192508301620013b9565b600082601f8301126200156c57600080fd5b815160206200157f620011f483620011a9565b82815260069290921b840181019181810190868411156200159f57600080fd5b8286015b84811015620012445760408189031215620015be5760008081fd5b620015c862001047565b620015d382620010f0565b8152620015e285830162001334565b81860152835291830191604001620015a3565b80516001600160e01b0319811681146200110857600080fd5b600082601f8301126200162057600080fd5b8151602062001633620011f483620011a9565b82815261024092830285018201928282019190878511156200165457600080fd5b8387015b85811015620013275780890382811215620016735760008081fd5b6200167d62001047565b620016888362001334565b815261022080601f1984011215620016a05760008081fd5b620016aa62001097565b9250620016b98885016200135f565b83526040620016ca8186016200134c565b898501526060620016dd8187016200110d565b8286015260809150620016f28287016200110d565b9085015260a0620017058682016200110d565b8286015260c091506200171a8287016200134c565b9085015260e06200172d8682016200110d565b828601526101009150620017438287016200134c565b90850152610120620017578682016200134c565b8286015261014091506200176d8287016200134c565b90850152610160620017818682016200110d565b828601526101809150620017978287016200110d565b908501526101a0620017ab8682016200110d565b828601526101c09150620017c182870162001334565b908501526101e0620017d58682016200110d565b828601526102009150620017eb8287016200135f565b90850152620017fc858301620015f5565b908401525080870191909152845292840192810162001658565b6000806000806000806000610120888a0312156200183357600080fd5b6200183f898962001122565b60608901519097506001600160401b03808211156200185d57600080fd5b6200186b8b838c01620011cf565b975060808a01519150808211156200188257600080fd5b620018908b838c01620011cf565b965060a08a0151915080821115620018a757600080fd5b620018b58b838c016200124f565b955060c08a0151915080821115620018cc57600080fd5b620018da8b838c0162001370565b945060e08a0151915080821115620018f157600080fd5b620018ff8b838c016200155a565b93506101008a01519150808211156200191757600080fd5b50620019268a828b016200160e565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815115158152610220810160208301516200196c602084018261ffff169052565b50604083015162001985604084018263ffffffff169052565b5060608301516200199e606084018263ffffffff169052565b506080830151620019b7608084018263ffffffff169052565b5060a0830151620019ce60a084018261ffff169052565b5060c0830151620019e760c084018263ffffffff169052565b5060e0830151620019fe60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501518216908401526101a0808501516001600160401b0316908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000ebe57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051614e2262001b2e600039600081816102d901528181611ad30152611b3c01526000818161029d0152818161104e01526110ae015260008181610269015281816110d701526111470152614e226000f3fe608060405234801561001057600080fd5b50600436106101b85760003560e01c80637afac322116100f9578063cc88924c11610097578063d8694ccd11610071578063d8694ccd14610a5c578063f2fde38b14610a6f578063f700042a14610a82578063ffdb4b3714610a9557600080fd5b8063cc88924c14610a2e578063cdc73d5114610a41578063d02641a014610a4957600080fd5b806391a2749a116100d357806391a2749a14610939578063a69c64c01461094c578063bf78e03f1461095f578063c4276bfc14610a0c57600080fd5b80637afac3221461078e57806382b49eb0146107a15780638da5cb5b1461091157600080fd5b8063407e108611610166578063514e8cff11610140578063514e8cff146104385780636def4ce7146104db578063770e2dc41461077357806379ba50971461078657600080fd5b8063407e1086146103c557806345ac924d146103d85780634ab35b0b146103f857600080fd5b8063181f5a7711610197578063181f5a77146103525780632451a6271461039b5780633937306f146103b057600080fd5b806241e5be146101bd578063061877e3146101e357806306285c691461023c575b600080fd5b6101d06101cb36600461380f565b610add565b6040519081526020015b60405180910390f35b6102236101f136600461384b565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101da565b610306604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101da565b61038e6040518060400160405280601781526020017f5072696365526567697374727920312e362e302d64657600000000000000000081525081565b6040516101da91906138ca565b6103a3610b4b565b6040516101da91906138dd565b6103c36103be366004613937565b610b5c565b005b6103c36103d3366004613a93565b610e11565b6103eb6103e6366004613bf1565b610e25565b6040516101da9190613c33565b61040b61040636600461384b565b610ef0565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101da565b6104ce610446366004613cc6565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600460209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101da9190613ce1565b6107666104e9366004613cc6565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260086020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b010000000000000000000000000000000000000000000000000000009092048616610140840152600190930154808616610160840152640100000000810486166101808401526801000000000000000081049096166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101da9190613d1c565b6103c3610781366004613f59565b610efb565b6103c3610f11565b6103c361079c366004614273565b611013565b6108b16107af3660046142d7565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff91909116600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101da9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101da565b6103c3610947366004614301565b611025565b6103c361095a366004614392565b611036565b6109d861096d36600461384b565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526006825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101da565b610a1f610a1a366004614457565b611047565b6040516101da939291906144f2565b6103c3610a3c36600461451c565b611245565b6103a361141b565b6104ce610a5736600461384b565b611427565b6101d0610a6a3660046145b7565b611523565b6103c3610a7d36600461384b565b6119dd565b6103c3610a9036600461463c565b6119ee565b610aa8610aa336600461485c565b6119ff565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101da565b6000610ae882611b8a565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b0f85611b8a565b610b37907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856148b5565b610b4191906148cc565b90505b9392505050565b6060610b576002611c24565b905090565b610b64611c31565b6000610b708280614907565b9050905060005b81811015610cba576000610b8b8480614907565b83818110610b9b57610b9b61496f565b905060400201803603810190610bb191906149ca565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610ca99290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610b77565b506000610cca6020840184614907565b9050905060005b81811015610e0b576000610ce86020860186614907565b83818110610cf857610cf861496f565b905060400201803603810190610d0e9190614a07565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600490975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610dfa9290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610cd1565b50505050565b610e19611c76565b610e2281611cf7565b50565b60608160008167ffffffffffffffff811115610e4357610e43613972565b604051908082528060200260200182016040528015610e8857816020015b6040805180820190915260008082526020820152815260200190600190039081610e615790505b50905060005b82811015610ee557610ec0868683818110610eab57610eab61496f565b9050602002016020810190610a57919061384b565b828281518110610ed257610ed261496f565b6020908102919091010152600101610e8e565b509150505b92915050565b6000610eea82611b8a565b610f03611c76565b610f0d8282611df5565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61101b611c76565b610f0d8282612207565b61102d611c76565b610e228161234e565b61103e611c76565b610e22816124da565b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036110a7578592506110d5565b6110d287877f0000000000000000000000000000000000000000000000000000000000000000610add565b92505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16831115611174576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018490526bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610f8e565b67ffffffffffffffff8816600090815260086020526040812060010154640100000000900463ffffffff16906111ab8787846125c4565b9050806020015193508484611232836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b9450945094505050955095509592505050565b67ffffffffffffffff85166000908152600860205260408120600101547501000000000000000000000000000000000000000000900460e01b905b8481101561141257600084848381811061129c5761129c61496f565b6112b2926020604090920201908101915061384b565b905060008787848181106112c8576112c861496f565b90506020028101906112da9190614a2a565b6112e8906040810190614a68565b91505060208111156113985767ffffffffffffffff8916600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115611398576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610f8e565b611408848989868181106113ae576113ae61496f565b90506020028101906113c09190614a2a565b6113ce906020810190614a68565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061276d92505050565b5050600101611280565b50505050505050565b6060610b57600c611c24565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8281166000908152600660209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff16908201529061151a57505073ffffffffffffffffffffffffffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b610b44816127bf565b67ffffffffffffffff8083166000908152600860209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b010000000000000000000000000000000000000000000000000000009093048616610140850152600190940154808616610160850152640100000000810486166101808501526801000000000000000081049098166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611759576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610f8e565b60006117686040850185614907565b91506117c490508261177d6020870187614a68565b90508361178a8880614a68565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a0292505050565b60006007816117d9608088016060890161384b565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081205467ffffffffffffffff169150806118286118226080890160608a0161384b565b896119ff565b909250905060008080861561186e57611862888c61184c60808e0160608f0161384b565b888e806040019061185d9190614907565b612aac565b9194509250905061188e565b6101c088015161188b9063ffffffff16662386f26fc100006148b5565b92505b61010088015160009061ffff16156118d2576118cf896dffffffffffffffffffffffffffff607088901c166118c660208f018f614a68565b90508b86612d8a565b90505b6101a089015160009067ffffffffffffffff166118fb6118f560808f018f614a68565b8d612e3a565b600001518563ffffffff168c60a0015161ffff168f806020019061191f9190614a68565b61192a9291506148b5565b8d6080015163ffffffff1661193f9190614acd565b6119499190614acd565b6119539190614acd565b61196d906dffffffffffffffffffffffffffff89166148b5565b61197791906148b5565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff871682826119ae67ffffffffffffffff8c16896148b5565b6119b89190614acd565b6119c29190614acd565b6119cc91906148cc565b9d9c50505050505050505050505050565b6119e5611c76565b610e2281612efb565b6119f6611c76565b610e2281612ff0565b67ffffffffffffffff811660009081526004602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff1691810182905282918203611ab7576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610f8e565b6000816020015163ffffffff1642611acf9190614ae0565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16811115611b70576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610f8e565b611b7986611b8a565b9151919350909150505b9250929050565b600080611b9683611427565b9050806020015163ffffffff1660001480611bce575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15611c1d576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610f8e565b5192915050565b60606000610b44836134de565b611c3c60023361353a565b611c74576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610f8e565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f8e565b60005b8151811015610f0d576000828281518110611d1757611d1761496f565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526006875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a2505050806001019050611cfa565b60005b825181101561211e576000838281518110611e1557611e1561496f565b6020026020010151905060008160000151905060005b82602001515181101561211057600083602001518281518110611e5057611e5061496f565b6020026020010151602001519050600084602001518381518110611e7657611e7661496f565b6020026020010151600001519050602063ffffffff16826080015163ffffffff161015611ef95760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610f8e565b67ffffffffffffffff8416600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b5906120fe908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101611e2b565b505050806001019050611df8565b5060005b815181101561220257600082828151811061213f5761213f61496f565b602002602001015160000151905060008383815181106121615761216161496f565b60209081029190910181015181015167ffffffffffffffff8416600081815260098452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101612122565b505050565b60005b82518110156122aa576122408382815181106122285761222861496f565b6020026020010151600c61356990919063ffffffff16565b156122a2578281815181106122575761225761496f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010161220a565b5060005b8151811015612202576122e48282815181106122cc576122cc61496f565b6020026020010151600c61358b90919063ffffffff16565b15612346578181815181106122fb576122fb61496f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b6001016122ae565b602081015160005b81518110156123e95760008282815181106123735761237361496f565b6020026020010151905061239181600261358b90919063ffffffff16565b156123e05760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101612356565b50815160005b8151811015610e0b57600082828151811061240c5761240c61496f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361247c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612487600282613569565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016123ef565b60005b8151811015610f0d5760008282815181106124fa576124fa61496f565b6020026020010151600001519050600083838151811061251c5761251c61496f565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526007845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a250506001016124dd565b6040805180820190915260008082526020820152600083900361260557506040805180820190915267ffffffffffffffff8216815260006020820152610b44565b60006126118486614af3565b905060006126228560048189614b39565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016126bf57808060200190518101906126b69190614b63565b92505050610b44565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161273b576040518060400160405280828060200190518101906127279190614b8f565b815260006020909101529250610b44915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610f0d57612202816135ad565b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284d9190614bc2565b505050915050600081121561288e576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000819050600085602001518473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129099190614c12565b6129139190614c2f565b905060248160ff1611156129485761292c602482614c48565b61293790600a614d81565b61294190836148cc565b915061296b565b612953816024614c48565b61295e90600a614d81565b61296890836148b5565b91505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156129c1576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff42166020820152949350505050565b836040015163ffffffff16831115612a5b5760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610f8e565b836020015161ffff16821115612a9d576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0b8461020001518261276d565b6000808083815b81811015612d7c576000878783818110612acf57612acf61496f565b905060400201803603810190612ae59190614d90565b67ffffffffffffffff8c166000908152600960209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090612c0b576101208d0151612bd29061ffff16662386f26fc100006148b5565b612bdc9088614acd565b96508c610140015186612bef9190614dc9565b95508c610160015185612c029190614dc9565b94505050612d74565b604081015160009061ffff1615612cc45760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614612c67578351612c6090611b8a565b9050612c6a565b508a5b620186a0836040015161ffff16612cac8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661366090919063ffffffff16565b612cb691906148b5565b612cc091906148cc565b9150505b6060820151612cd39088614dc9565b9650816080015186612ce59190614dc9565b8251909650600090612d049063ffffffff16662386f26fc100006148b5565b905080821015612d2357612d18818a614acd565b985050505050612d74565b6000836020015163ffffffff16662386f26fc10000612d4291906148b5565b905080831115612d6257612d56818b614acd565b99505050505050612d74565b612d6c838b614acd565b995050505050505b600101612ab3565b505096509650969350505050565b60008063ffffffff8316612da0610140866148b5565b612dac876101c0614acd565b612db69190614acd565b612dc09190614acd565b905060008760c0015163ffffffff168860e0015161ffff1683612de391906148b5565b612ded9190614acd565b61010089015190915061ffff16612e146dffffffffffffffffffffffffffff8916836148b5565b612e1e91906148b5565b612e2e90655af3107a40006148b5565b98975050505050505050565b60408051808201909152600080825260208201526000612e66858585610180015163ffffffff166125c4565b9050826060015163ffffffff1681600001511115612eb0576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015612ec457508060200151155b15610b41576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f8e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015610f0d5760008282815181106130105761301061496f565b60200260200101519050600083838151811061302e5761302e61496f565b60200260200101516000015190506000826020015190508167ffffffffffffffff1660001480613067575061018081015163ffffffff16155b806130b957506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806130d55750602063ffffffff1681610160015163ffffffff16105b806130f45750806060015163ffffffff1681610180015163ffffffff16115b15613137576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f8e565b67ffffffffffffffff82166000908152600860205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff000000000000000000000000000000000000000000000000000000001690036131df578167ffffffffffffffff167fa937382a486d993de71c220bc8b559242deb4e286a353fa732330b4aa7d13577826040516131d29190613d1c565b60405180910390a2613222565b8167ffffffffffffffff167fa7b607fc10d28a1caf39ab7d27f4c94945db708a576d572781a455c5894fad93826040516132199190613d1c565b60405180910390a25b80600860008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101a08201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050612ff3565b60608160000180548060200260200160405190810160405280929190818152602001828054801561352e57602002820191906000526020600020905b81548152602001906001019080831161351a575b50505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b44565b6000610b448373ffffffffffffffffffffffffffffffffffffffff841661369d565b6000610b448373ffffffffffffffffffffffffffffffffffffffff84166136ec565b600081516020146135ec57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610f8e91906138ca565b6000828060200190518101906136029190614b8f565b905073ffffffffffffffffffffffffffffffffffffffff811180613627575061040081105b15610eea57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610f8e91906138ca565b6000670de0b6b3a7640000613693837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166148b5565b610b4491906148cc565b60008181526001830160205260408120546136e457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eea565b506000610eea565b600081815260018301602052604081205480156137d5576000613710600183614ae0565b855490915060009061372490600190614ae0565b90508181146137895760008660000182815481106137445761374461496f565b90600052602060002001549050808760000184815481106137675761376761496f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061379a5761379a614de6565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610eea565b6000915050610eea565b5092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461380a57600080fd5b919050565b60008060006060848603121561382457600080fd5b61382d846137e6565b925060208401359150613842604085016137e6565b90509250925092565b60006020828403121561385d57600080fd5b610b44826137e6565b6000815180845260005b8181101561388c57602081850181015186830182015201613870565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b446020830184613866565b6020808252825182820181905260009190848201906040850190845b8181101561392b57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016138f9565b50909695505050505050565b60006020828403121561394957600080fd5b813567ffffffffffffffff81111561396057600080fd5b820160408185031215610b4457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156139c4576139c4613972565b60405290565b60405160c0810167ffffffffffffffff811182821017156139c4576139c4613972565b604051610220810167ffffffffffffffff811182821017156139c4576139c4613972565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5857613a58613972565b604052919050565b600067ffffffffffffffff821115613a7a57613a7a613972565b5060051b60200190565b60ff81168114610e2257600080fd5b60006020808385031215613aa657600080fd5b823567ffffffffffffffff811115613abd57600080fd5b8301601f81018513613ace57600080fd5b8035613ae1613adc82613a60565b613a11565b81815260609182028301840191848201919088841115613b0057600080fd5b938501935b83851015613ba05784890381811215613b1e5760008081fd5b613b266139a1565b613b2f876137e6565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215613b635760008081fd5b613b6b6139a1565b9250613b788989016137e6565b8352870135613b8681613a84565b828901528088019190915283529384019391850191613b05565b50979650505050505050565b60008083601f840112613bbe57600080fd5b50813567ffffffffffffffff811115613bd657600080fd5b6020830191508360208260051b8501011115611b8357600080fd5b60008060208385031215613c0457600080fd5b823567ffffffffffffffff811115613c1b57600080fd5b613c2785828601613bac565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015613ca157613c9184835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101613c50565b5091979650505050505050565b803567ffffffffffffffff8116811461380a57600080fd5b600060208284031215613cd857600080fd5b610b4482613cae565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff169082015260408101610eea565b81511515815261022081016020830151613d3c602084018261ffff169052565b506040830151613d54604084018263ffffffff169052565b506060830151613d6c606084018263ffffffff169052565b506080830151613d84608084018263ffffffff169052565b5060a0830151613d9a60a084018261ffff169052565b5060c0830151613db260c084018263ffffffff169052565b5060e0830151613dc860e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501518216908401526101a08085015167ffffffffffffffff16908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff8116811461380a57600080fd5b803561ffff8116811461380a57600080fd5b8015158114610e2257600080fd5b803561380a81613ea8565b600082601f830112613ed257600080fd5b81356020613ee2613adc83613a60565b82815260069290921b84018101918181019086841115613f0157600080fd5b8286015b84811015613f4e5760408189031215613f1e5760008081fd5b613f266139a1565b613f2f82613cae565b8152613f3c8583016137e6565b81860152835291830191604001613f05565b509695505050505050565b60008060408385031215613f6c57600080fd5b67ffffffffffffffff83351115613f8257600080fd5b83601f843585010112613f9457600080fd5b613fa4613adc8435850135613a60565b8335840180358083526020808401939260059290921b90910101861015613fca57600080fd5b602085358601015b85358601803560051b016020018110156141d75767ffffffffffffffff81351115613ffc57600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a0301121561403557600080fd5b61403d6139a1565b61404960208301613cae565b815267ffffffffffffffff6040830135111561406457600080fd5b88603f60408401358401011261407957600080fd5b61408f613adc6020604085013585010135613a60565b6020604084810135850182810135808552928401939260e00201018b10156140b657600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156141b85760e0818d0312156140e957600080fd5b6140f16139a1565b6140fa826137e6565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f0301121561412e57600080fd5b6141366139ca565b61414260208401613e82565b815261415060408401613e82565b602082015261416160608401613e96565b604082015261417260808401613e82565b606082015261418360a08401613e82565b608082015261419560c0840135613ea8565b60c083013560a0820152602082810191909152908452929092019160e0016140c0565b5080602084015250508085525050602083019250602081019050613fd2565b5092505067ffffffffffffffff602084013511156141f457600080fd5b6142048460208501358501613ec1565b90509250929050565b600082601f83011261421e57600080fd5b8135602061422e613adc83613a60565b8083825260208201915060208460051b87010193508684111561425057600080fd5b602086015b84811015613f4e57614266816137e6565b8352918301918301614255565b6000806040838503121561428657600080fd5b823567ffffffffffffffff8082111561429e57600080fd5b6142aa8683870161420d565b935060208501359150808211156142c057600080fd5b506142cd8582860161420d565b9150509250929050565b600080604083850312156142ea57600080fd5b6142f383613cae565b9150614204602084016137e6565b60006020828403121561431357600080fd5b813567ffffffffffffffff8082111561432b57600080fd5b908301906040828603121561433f57600080fd5b6143476139a1565b82358281111561435657600080fd5b6143628782860161420d565b82525060208301358281111561437757600080fd5b6143838782860161420d565b60208301525095945050505050565b600060208083850312156143a557600080fd5b823567ffffffffffffffff8111156143bc57600080fd5b8301601f810185136143cd57600080fd5b80356143db613adc82613a60565b81815260069190911b820183019083810190878311156143fa57600080fd5b928401925b8284101561444c57604084890312156144185760008081fd5b6144206139a1565b614429856137e6565b8152614436868601613cae565b81870152825260409390930192908401906143ff565b979650505050505050565b60008060008060006080868803121561446f57600080fd5b61447886613cae565b9450614486602087016137e6565b935060408601359250606086013567ffffffffffffffff808211156144aa57600080fd5b818801915088601f8301126144be57600080fd5b8135818111156144cd57600080fd5b8960208285010111156144df57600080fd5b9699959850939650602001949392505050565b83815282151560208201526060604082015260006145136060830184613866565b95945050505050565b60008060008060006060868803121561453457600080fd5b61453d86613cae565b9450602086013567ffffffffffffffff8082111561455a57600080fd5b61456689838a01613bac565b9096509450604088013591508082111561457f57600080fd5b818801915088601f83011261459357600080fd5b8135818111156145a257600080fd5b8960208260061b85010111156144df57600080fd5b600080604083850312156145ca57600080fd5b6145d383613cae565b9150602083013567ffffffffffffffff8111156145ef57600080fd5b830160a0818603121561460157600080fd5b809150509250929050565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461380a57600080fd5b6000602080838503121561464f57600080fd5b823567ffffffffffffffff81111561466657600080fd5b8301601f8101851361467757600080fd5b8035614685613adc82613a60565b81815261024091820283018401918482019190888411156146a557600080fd5b938501935b83851015613ba057848903818112156146c35760008081fd5b6146cb6139a1565b6146d487613cae565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156147095760008081fd5b6147116139ed565b925061471e898901613eb6565b8352604061472d818a01613e96565b8a850152606061473e818b01613e82565b8286015260809150614751828b01613e82565b9085015260a06147628a8201613e82565b8286015260c09150614775828b01613e96565b9085015260e06147868a8201613e82565b82860152610100915061479a828b01613e96565b908501526101206147ac8a8201613e96565b8286015261014091506147c0828b01613e96565b908501526101606147d28a8201613e82565b8286015261018091506147e6828b01613e82565b908501526101a06147f88a8201613e82565b828601526101c0915061480c828b01613cae565b908501526101e061481e8a8201613e82565b828601526102009150614832828b01613eb6565b9085015261484189830161460c565b908401525080880191909152835293840193918501916146aa565b6000806040838503121561486f57600080fd5b614878836137e6565b915061420460208401613cae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610eea57610eea614886565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261493c57600080fd5b83018035915067ffffffffffffffff82111561495757600080fd5b6020019150600681901b3603821315611b8357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461380a57600080fd5b6000604082840312156149dc57600080fd5b6149e46139a1565b6149ed836137e6565b81526149fb6020840161499e565b60208201529392505050565b600060408284031215614a1957600080fd5b614a216139a1565b6149ed83613cae565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614a5e57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614a9d57600080fd5b83018035915067ffffffffffffffff821115614ab857600080fd5b602001915036819003821315611b8357600080fd5b80820180821115610eea57610eea614886565b81810381811115610eea57610eea614886565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015613e7a5760049490940360031b84901b1690921692915050565b60008085851115614b4957600080fd5b83861115614b5657600080fd5b5050820193919092039150565b600060408284031215614b7557600080fd5b614b7d6139a1565b8251815260208301516149fb81613ea8565b600060208284031215614ba157600080fd5b5051919050565b805169ffffffffffffffffffff8116811461380a57600080fd5b600080600080600060a08688031215614bda57600080fd5b614be386614ba8565b9450602086015193506040860151925060608601519150614c0660808701614ba8565b90509295509295909350565b600060208284031215614c2457600080fd5b8151610b4481613a84565b60ff8181168382160190811115610eea57610eea614886565b60ff8281168282160390811115610eea57610eea614886565b600181815b80851115614cba57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ca057614ca0614886565b80851615614cad57918102915b93841c9390800290614c66565b509250929050565b600082614cd157506001610eea565b81614cde57506000610eea565b8160018114614cf45760028114614cfe57614d1a565b6001915050610eea565b60ff841115614d0f57614d0f614886565b50506001821b610eea565b5060208310610133831016604e8410600b8410161715614d3d575081810a610eea565b614d478383614c61565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d7957614d79614886565b029392505050565b6000610b4460ff841683614cc2565b600060408284031215614da257600080fd5b614daa6139a1565b614db3836137e6565b8152602083013560208201528091505092915050565b63ffffffff8181168382160190808211156137df576137df614886565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var PriceRegistryABI = PriceRegistryMetaData.ABI
diff --git a/core/gethwrappers/ccip/generated/token_pool/token_pool.go b/core/gethwrappers/ccip/generated/token_pool/token_pool.go
index 0fb4c4e087..0bca23641c 100644
--- a/core/gethwrappers/ccip/generated/token_pool/token_pool.go
+++ b/core/gethwrappers/ccip/generated/token_pool/token_pool.go
@@ -82,7 +82,7 @@ type TokenPoolChainUpdate struct {
}
var TokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"lockOrBurnOut\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"lockOrBurnOut\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
}
var TokenPoolABI = TokenPoolMetaData.ABI
@@ -291,6 +291,28 @@ func (_TokenPool *TokenPoolCallerSession) GetCurrentOutboundRateLimiterState(rem
return _TokenPool.Contract.GetCurrentOutboundRateLimiterState(&_TokenPool.CallOpts, remoteChainSelector)
}
+func (_TokenPool *TokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _TokenPool.contract.Call(opts, &out, "getRateLimitAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_TokenPool *TokenPoolSession) GetRateLimitAdmin() (common.Address, error) {
+ return _TokenPool.Contract.GetRateLimitAdmin(&_TokenPool.CallOpts)
+}
+
+func (_TokenPool *TokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) {
+ return _TokenPool.Contract.GetRateLimitAdmin(&_TokenPool.CallOpts)
+}
+
func (_TokenPool *TokenPoolCaller) GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
var out []interface{}
err := _TokenPool.contract.Call(opts, &out, "getRemotePool", remoteChainSelector)
@@ -583,6 +605,18 @@ func (_TokenPool *TokenPoolTransactorSession) SetChainRateLimiterConfig(remoteCh
return _TokenPool.Contract.SetChainRateLimiterConfig(&_TokenPool.TransactOpts, remoteChainSelector, outboundConfig, inboundConfig)
}
+func (_TokenPool *TokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _TokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin)
+}
+
+func (_TokenPool *TokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _TokenPool.Contract.SetRateLimitAdmin(&_TokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_TokenPool *TokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _TokenPool.Contract.SetRateLimitAdmin(&_TokenPool.TransactOpts, rateLimitAdmin)
+}
+
func (_TokenPool *TokenPoolTransactor) SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
return _TokenPool.contract.Transact(opts, "setRemotePool", remoteChainSelector, remotePoolAddress)
}
@@ -2480,6 +2514,8 @@ type TokenPoolInterface interface {
GetCurrentOutboundRateLimiterState(opts *bind.CallOpts, remoteChainSelector uint64) (RateLimiterTokenBucket, error)
+ GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error)
+
GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
@@ -2512,6 +2548,8 @@ type TokenPoolInterface interface {
SetChainRateLimiterConfig(opts *bind.TransactOpts, remoteChainSelector uint64, outboundConfig RateLimiterConfig, inboundConfig RateLimiterConfig) (*types.Transaction, error)
+ SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error)
+
SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generated/usdc_token_pool/usdc_token_pool.go b/core/gethwrappers/ccip/generated/usdc_token_pool/usdc_token_pool.go
index 1e15b6b6cd..a4e4f9de70 100644
--- a/core/gethwrappers/ccip/generated/usdc_token_pool/usdc_token_pool.go
+++ b/core/gethwrappers/ccip/generated/usdc_token_pool/usdc_token_pool.go
@@ -95,8 +95,8 @@ type USDCTokenPoolDomainUpdate struct {
}
var USDCTokenPoolMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"contractITokenMessenger\",\"name\":\"tokenMessenger\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"got\",\"type\":\"uint32\"}],\"name\":\"InvalidDestinationDomain\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"allowedCaller\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"domainIdentifier\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structUSDCTokenPool.DomainUpdate\",\"name\":\"domain\",\"type\":\"tuple\"}],\"name\":\"InvalidDomain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageVersion\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"}],\"name\":\"InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"got\",\"type\":\"uint32\"}],\"name\":\"InvalidSourceDomain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"InvalidTokenMessengerVersion\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"domain\",\"type\":\"uint64\"}],\"name\":\"UnknownDomain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnlockingUSDCFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenMessenger\",\"type\":\"address\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"allowedCaller\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"domainIdentifier\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structUSDCTokenPool.DomainUpdate[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"name\":\"DomainsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SUPPORTED_USDC_VERSION\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getDomain\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"allowedCaller\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"domainIdentifier\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structUSDCTokenPool.Domain\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_localDomainIdentifier\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_messageTransmitter\",\"outputs\":[{\"internalType\":\"contractIMessageTransmitter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_tokenMessenger\",\"outputs\":[{\"internalType\":\"contractITokenMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"allowedCaller\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"domainIdentifier\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structUSDCTokenPool.DomainUpdate[]\",\"name\":\"domains\",\"type\":\"tuple[]\"}],\"name\":\"setDomains\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x6101406040523480156200001257600080fd5b506040516200559338038062005593833981016040819052620000359162000b4c565b838383833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c3816200041b565b5050506001600160a01b0384161580620000e457506001600160a01b038116155b80620000f757506001600160a01b038216155b1562000116576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016957604080516000815260208101909152620001699084620004c6565b5050506001600160a01b038616905062000196576040516306b7c75960e31b815260040160405180910390fd5b6000856001600160a01b0316632c1219216040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fd919062000c72565b90506000816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000266919062000c99565b905063ffffffff81161562000297576040516334697c6b60e11b815263ffffffff8216600482015260240162000087565b6000876001600160a01b0316639cdbb1816040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fe919062000c99565b905063ffffffff8116156200032f576040516316ba39c560e31b815263ffffffff8216600482015260240162000087565b6001600160a01b0380891660e05283166101008190526040805163234d8e3d60e21b81529051638d3638f4916004808201926020929091908290030181865afa15801562000381573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a7919062000c99565b63ffffffff166101205260e051608051620003d1916001600160a01b039091169060001962000623565b6040516001600160a01b03891681527f2e902d38f15b233cbb63711add0fca4545334d3a169d60c0a616494d7eea95449060200160405180910390a1505050505050505062000de6565b336001600160a01b03821603620004755760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c051620004e7576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620005725760008382815181106200050b576200050b62000cc1565b602090810291909101015190506200052560028262000709565b1562000568576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101620004ea565b5060005b81518110156200061e57600082828151811062000597576200059762000cc1565b6020026020010151905060006001600160a01b0316816001600160a01b031603620005c3575062000615565b620005d060028262000729565b1562000613576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010162000576565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200069b919062000cd7565b620006a7919062000d07565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000703918691906200074016565b50505050565b600062000720836001600160a01b03841662000811565b90505b92915050565b600062000720836001600160a01b03841662000915565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200078f906001600160a01b03851690849062000967565b8051909150156200061e5780806020019051810190620007b0919062000d1d565b6200061e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000087565b600081815260018301602052604081205480156200090a5760006200083860018362000d41565b85549091506000906200084e9060019062000d41565b9050818114620008ba57600086600001828154811062000872576200087262000cc1565b906000526020600020015490508087600001848154811062000898576200089862000cc1565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620008ce57620008ce62000d57565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000723565b600091505062000723565b60008181526001830160205260408120546200095e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000723565b50600062000723565b606062000978848460008562000980565b949350505050565b606082471015620009e35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000087565b600080866001600160a01b0316858760405162000a01919062000d93565b60006040518083038185875af1925050503d806000811462000a40576040519150601f19603f3d011682016040523d82523d6000602084013e62000a45565b606091505b50909250905062000a598783838762000a64565b979650505050505050565b6060831562000ad857825160000362000ad0576001600160a01b0385163b62000ad05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000087565b508162000978565b62000978838381511562000aef5781518083602001fd5b8060405162461bcd60e51b815260040162000087919062000db1565b6001600160a01b038116811462000b2157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000b478162000b0b565b919050565b600080600080600060a0868803121562000b6557600080fd5b855162000b728162000b0b565b8095505060208087015162000b878162000b0b565b60408801519095506001600160401b038082111562000ba557600080fd5b818901915089601f83011262000bba57600080fd5b81518181111562000bcf5762000bcf62000b24565b8060051b604051601f19603f8301168101818110858211171562000bf75762000bf762000b24565b60405291825284820192508381018501918c83111562000c1657600080fd5b938501935b8285101562000c3f5762000c2f8562000b3a565b8452938501939285019262000c1b565b80985050505050505062000c566060870162000b3a565b915062000c666080870162000b3a565b90509295509295909350565b60006020828403121562000c8557600080fd5b815162000c928162000b0b565b9392505050565b60006020828403121562000cac57600080fd5b815163ffffffff8116811462000c9257600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000cea57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000723576200072362000cf1565b60006020828403121562000d3057600080fd5b8151801515811462000c9257600080fd5b8181038181111562000723576200072362000cf1565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000d8a57818101518382015260200162000d70565b50506000910152565b6000825162000da781846020870162000d6d565b9190910192915050565b602081526000825180602084015262000dd281604085016020870162000d6d565b601f01601f19169190910160400192915050565b60805160a05160c05160e05161010051610120516146ed62000ea66000396000818161036c0152818161116601528181611d6d0152611dcb01526000818161062f0152610a31015260008181610345015261107a0152600081816105f301528181611ef5015261293c01526000818161052f01528181611b6b01526121ab015260008181610279015281816102ce01528181610af70152818161104701528181611a8b015281816120cb015281816127c60152612b2701526146ed6000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c80639fdf13ff11610104578063c75eea9c116100a2578063dfadfa3511610071578063dfadfa3514610553578063e0351e13146105f1578063f2fde38b14610617578063fbf84dd71461062a57600080fd5b8063c75eea9c146104f4578063cf7401f314610507578063db6327dc1461051a578063dc0bd9711461052d57600080fd5b8063b0f479a1116100de578063b0f479a11461049b578063b7946580146104b9578063c0d78655146104cc578063c4bffe2b146104df57600080fd5b80639fdf13ff1461040f578063a7cd63b714610417578063af58d59f1461042c57600080fd5b806354c8a4f31161017c57806379ba50971161014b57806379ba5097146103b65780638926f54f146103be5780638da5cb5b146103d15780639a4575b9146103ef57600080fd5b806354c8a4f31461032d5780636155cda0146103405780636b716b0d1461036757806378a010b2146103a357600080fd5b8063181f5a77116101b8578063181f5a771461023b57806321df0da714610277578063240028e8146102be578063390775371461030b57600080fd5b806241d3c1146101de57806301ffc9a7146101f35780630a2fd4931461021b575b600080fd5b6101f16101ec3660046134d1565b610651565b005b610206610201366004613546565b6107ee565b60405190151581526020015b60405180910390f35b61022e6102293660046135ae565b6108d3565b6040516102129190613639565b61022e6040518060400160405280601381526020017f55534443546f6b656e506f6f6c20312e342e300000000000000000000000000081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610212565b6102066102cc366004613679565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b61031e610319366004613696565b610983565b60405190518152602001610212565b6101f161033b36600461371e565b610bb5565b6102997f000000000000000000000000000000000000000000000000000000000000000081565b61038e7f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610212565b6101f16103b136600461378a565b610c30565b6101f1610d9f565b6102066103cc3660046135ae565b610e9c565b60005473ffffffffffffffffffffffffffffffffffffffff16610299565b6104026103fd36600461380f565b610eb3565b604051610212919061384a565b61038e600081565b61041f6111e0565b60405161021291906138aa565b61043f61043a3660046135ae565b6111f1565b604051610212919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff16610299565b61022e6104c73660046135ae565b6112c6565b6101f16104da366004613679565b6112f1565b6104e76113c5565b6040516102129190613904565b61043f6105023660046135ae565b61147d565b6101f1610515366004613a8f565b61154f565b6101f1610528366004613ad6565b611567565b7f0000000000000000000000000000000000000000000000000000000000000000610299565b6105c76105613660046135ae565b60408051606080820183526000808352602080840182905292840181905267ffffffffffffffff949094168452600882529282902082519384018352805484526001015463ffffffff811691840191909152640100000000900460ff1615159082015290565b604080518251815260208084015163ffffffff169082015291810151151590820152606001610212565b7f0000000000000000000000000000000000000000000000000000000000000000610206565b6101f1610625366004613679565b6119ed565b6102997f000000000000000000000000000000000000000000000000000000000000000081565b610659611a01565b60005b818110156107b057600083838381811061067857610678613b18565b90506080020180360381019061068e9190613b5b565b805190915015806106ab5750604081015167ffffffffffffffff16155b1561071a57604080517fa087bd2900000000000000000000000000000000000000000000000000000000815282516004820152602083015163ffffffff1660248201529082015167ffffffffffffffff1660448201526060820151151560648201526084015b60405180910390fd5b60408051606080820183528351825260208085015163ffffffff9081168285019081529286015115158486019081529585015167ffffffffffffffff166000908152600890925293902091518255516001918201805494511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff000000000090951691909316179290921790550161065c565b507f1889010d2535a0ab1643678d1da87fbbe8b87b2f585b47ddb72ec622aef9ee5682826040516107e2929190613bd5565b60405180910390a15050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf00000000000000000000000000000000000000000000000000000000148061088157507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b806108cd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff811660009081526007602052604090206004018054606091906108fe90613c5c565b80601f016020809104026020016040519081016040528092919081815260200182805461092a90613c5c565b80156109775780601f1061094c57610100808354040283529160200191610977565b820191906000526020600020905b81548152906001019060200180831161095a57829003601f168201915b50505050509050919050565b6040805160208101909152600081526109a361099e83613d5a565b611a84565b60006109b260c0840184613e4f565b8101906109bf9190613eb4565b905060006109d060e0850185613e4f565b8101906109dd9190613ef3565b90506109ed816000015183611cb5565b805160208201516040517f57ecfd2800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016926357ecfd2892610a6492600401613f84565b6020604051808303816000875af1158015610a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa79190613fa9565b610add576040517fbf969f2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b2273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016336060870135611e66565b610b326060850160408601613679565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f08660600135604051610b9491815260200190565b60405180910390a35050604080516020810190915260609092013582525090565b610bbd611a01565b610c2a84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611ef392505050565b50505050565b610c38611a01565b610c4183610e9c565b610c83576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610711565b67ffffffffffffffff831660009081526007602052604081206004018054610caa90613c5c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cd690613c5c565b8015610d235780601f10610cf857610100808354040283529160200191610d23565b820191906000526020600020905b815481529060010190602001808311610d0657829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610d5283858361400e565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610d9193929190614172565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610711565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b60006108cd600567ffffffffffffffff84166120a9565b6040805180820190915260608082526020820152610ed8610ed3836141a2565b6120c4565b6000600881610eed60408601602087016135ae565b67ffffffffffffffff168152602080820192909252604090810160002081516060810183528154815260019091015463ffffffff81169382019390935264010000000090920460ff161515908201819052909150610f9457610f5560408401602085016135ae565b6040517fd201c48a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610711565b610f9e8380613e4f565b9050602014610fe557610fb18380613e4f565b6040517fa3c8cf09000000000000000000000000000000000000000000000000000000008152600401610711929190614246565b602081015181516040517ff856ddb60000000000000000000000000000000000000000000000000000000081526060860135600482015263ffffffff90921660248301526044820181905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116606484015260848301919091526000917f00000000000000000000000000000000000000000000000000000000000000009091169063f856ddb69060a4016020604051808303816000875af11580156110c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e9919061425a565b6040516060860135815290915033907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a260405180604001604052806111468660200160208101906104c791906135ae565b815260408051808201825267ffffffffffffffff851680825263ffffffff7f00000000000000000000000000000000000000000000000000000000000000008116602093840190815284518085019390935251169281019290925290910190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529052949350505050565b60606111ec600261228e565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260039091015480841660608301529190910490911660808201526108cd9061229b565b67ffffffffffffffff811660009081526007602052604090206005018054606091906108fe90613c5c565b6112f9611a01565b73ffffffffffffffffffffffffffffffffffffffff8116611346576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f168491016107e2565b606060006113d3600561228e565b90506000815167ffffffffffffffff8111156113f1576113f1613946565b60405190808252806020026020018201604052801561141a578160200160208202803683370190505b50905060005b82518110156114765782818151811061143b5761143b613b18565b602002602001015182828151811061145557611455613b18565b67ffffffffffffffff90921660209283029190910190910152600101611420565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff1615159482019490945260019091015480841660608301529190910490911660808201526108cd9061229b565b611557611a01565b61156283838361234d565b505050565b61156f611a01565b60005b8181101561156257600083838381811061158e5761158e613b18565b90506020028101906115a09190614277565b6115a9906142b5565b90506115be8160800151826020015115612437565b6115d18160a00151826020015115612437565b8060200151156118cd5780516115f39060059067ffffffffffffffff16612570565b6116385780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610711565b604081015151158061164d5750606081015151155b15611684576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c179091169615150295909517909855908101519401519381169316909102919091176003820155915190919060048201906118659082614369565b506060820151600582019061187a9082614369565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506118c09493929190614483565b60405180910390a16119e4565b80516118e59060059067ffffffffffffffff1661257c565b61192a5780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610711565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff000000000000000000000000000000000000000000908116825560018201839055600282018054909116905560038101829055906119936004830182613483565b6119a1600583016000613483565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101611572565b6119f5611a01565b6119fe81612588565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a82576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610711565b565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611b195760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610711565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611beb9190613fa9565b15611c22576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c2f816020015161267d565b6000611c3e82602001516108d3565b9050805160001480611c62575080805190602001208260a001518051906020012014155b15611c9f578160a001516040517f24eb47e50000000000000000000000000000000000000000000000000000000081526004016107119190613639565b611cb1826020015183606001516127a3565b5050565b600482015163ffffffff811615611d00576040517f68d2f8d600000000000000000000000000000000000000000000000000000000815263ffffffff82166004820152602401610711565b6008830151600c8401516014850151602085015163ffffffff808516911614611d6b5760208501516040517fe366a11700000000000000000000000000000000000000000000000000000000815263ffffffff91821660048201529084166024820152604401610711565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168263ffffffff1614611e00576040517f77e4802600000000000000000000000000000000000000000000000000000000815263ffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015283166024820152604401610711565b845167ffffffffffffffff828116911614611e5e5784516040517ff917ffea00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff91821660048201529082166024820152604401610711565b505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526115629084906127ea565b7f0000000000000000000000000000000000000000000000000000000000000000611f4a576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8251811015611fe0576000838281518110611f6a57611f6a613b18565b60200260200101519050611f888160026128f690919063ffffffff16565b15611fd75760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101611f4d565b5060005b815181101561156257600082828151811061200157612001613b18565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361204557506120a1565b612050600282612918565b1561209f5760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b600101611fe4565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081169116146121595760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610711565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015612207573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222b9190613fa9565b15612262576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61226f816040015161293a565b61227c81602001516129b9565b6119fe81602001518260600151612b07565b606060006120bd83612b4b565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915261232982606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff164261230d919061454b565b85608001516fffffffffffffffffffffffffffffffff16612ba6565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b61235683610e9c565b612398576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610711565b6123a3826000612437565b67ffffffffffffffff831660009081526007602052604090206123c69083612bd0565b6123d1816000612437565b67ffffffffffffffff831660009081526007602052604090206123f79060020182612bd0565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b83838360405161242a9392919061455e565b60405180910390a1505050565b8151156124fe5781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff1610158061248d575060408201516fffffffffffffffffffffffffffffffff16155b156124c657816040517f8020d12400000000000000000000000000000000000000000000000000000000815260040161071191906145e1565b8015611cb1576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff16151580612537575060208201516fffffffffffffffffffffffffffffffff1615155b15611cb157816040517fd68af9cc00000000000000000000000000000000000000000000000000000000815260040161071191906145e1565b60006120bd8383612d72565b60006120bd8383612dc1565b3373ffffffffffffffffffffffffffffffffffffffff821603612607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610711565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61268681610e9c565b6126c8576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610711565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa158015612747573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276b9190613fa9565b6119fe576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610711565b67ffffffffffffffff82166000908152600760205260409020611cb190600201827f0000000000000000000000000000000000000000000000000000000000000000612eb4565b600061284c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132379092919063ffffffff16565b805190915015611562578080602001905181019061286a9190613fa9565b611562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610711565b60006120bd8373ffffffffffffffffffffffffffffffffffffffff8416612dc1565b60006120bd8373ffffffffffffffffffffffffffffffffffffffff8416612d72565b7f0000000000000000000000000000000000000000000000000000000000000000156119fe5761296b600282613246565b6119fe576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610711565b6129c281610e9c565b612a04576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610711565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612a7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aa1919061461d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146119fe576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610711565b67ffffffffffffffff82166000908152600760205260409020611cb190827f0000000000000000000000000000000000000000000000000000000000000000612eb4565b60608160000180548060200260200160405190810160405280929190818152602001828054801561097757602002820191906000526020600020905b815481526020019060010190808311612b875750505050509050919050565b6000612bc585612bb6848661463a565b612bc09087614651565b613275565b90505b949350505050565b8154600090612bf990700100000000000000000000000000000000900463ffffffff164261454b565b90508015612c9b5760018301548354612c41916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612ba6565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612cc1916fffffffffffffffffffffffffffffffff9081169116613275565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061242a9084906145e1565b6000818152600183016020526040812054612db9575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108cd565b5060006108cd565b60008181526001830160205260408120548015612eaa576000612de560018361454b565b8554909150600090612df99060019061454b565b9050818114612e5e576000866000018281548110612e1957612e19613b18565b9060005260206000200154905080876000018481548110612e3c57612e3c613b18565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612e6f57612e6f614664565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108cd565b60009150506108cd565b825474010000000000000000000000000000000000000000900460ff161580612edb575081155b15612ee557505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612f2b90700100000000000000000000000000000000900463ffffffff164261454b565b90508015612feb5781831115612f6d576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154612fa79083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612ba6565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156130a25773ffffffffffffffffffffffffffffffffffffffff841661304a576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610711565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610711565b848310156131b55760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906130e6908261454b565b6130f0878a61454b565b6130fa9190614651565b6131049190614693565b905073ffffffffffffffffffffffffffffffffffffffff861661315d576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610711565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610711565b6131bf858461454b565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6060612bc8848460008561328b565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156120bd565b600081831061328457816120bd565b5090919050565b60608247101561331d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610711565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161334691906146ce565b60006040518083038185875af1925050503d8060008114613383576040519150601f19603f3d011682016040523d82523d6000602084013e613388565b606091505b5091509150613399878383876133a4565b979650505050505050565b6060831561343a5782516000036134335773ffffffffffffffffffffffffffffffffffffffff85163b613433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610711565b5081612bc8565b612bc8838381511561344f5781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107119190613639565b50805461348f90613c5c565b6000825580601f1061349f575050565b601f0160209004906000526020600020908101906119fe91905b808211156134cd57600081556001016134b9565b5090565b600080602083850312156134e457600080fd5b823567ffffffffffffffff808211156134fc57600080fd5b818501915085601f83011261351057600080fd5b81358181111561351f57600080fd5b8660208260071b850101111561353457600080fd5b60209290920196919550909350505050565b60006020828403121561355857600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146120bd57600080fd5b67ffffffffffffffff811681146119fe57600080fd5b80356135a981613588565b919050565b6000602082840312156135c057600080fd5b81356120bd81613588565b60005b838110156135e65781810151838201526020016135ce565b50506000910152565b600081518084526136078160208601602086016135cb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006120bd60208301846135ef565b73ffffffffffffffffffffffffffffffffffffffff811681146119fe57600080fd5b80356135a98161364c565b60006020828403121561368b57600080fd5b81356120bd8161364c565b6000602082840312156136a857600080fd5b813567ffffffffffffffff8111156136bf57600080fd5b820161010081850312156120bd57600080fd5b60008083601f8401126136e457600080fd5b50813567ffffffffffffffff8111156136fc57600080fd5b6020830191508360208260051b850101111561371757600080fd5b9250929050565b6000806000806040858703121561373457600080fd5b843567ffffffffffffffff8082111561374c57600080fd5b613758888389016136d2565b9096509450602087013591508082111561377157600080fd5b5061377e878288016136d2565b95989497509550505050565b60008060006040848603121561379f57600080fd5b83356137aa81613588565b9250602084013567ffffffffffffffff808211156137c757600080fd5b818601915086601f8301126137db57600080fd5b8135818111156137ea57600080fd5b8760208285010111156137fc57600080fd5b6020830194508093505050509250925092565b60006020828403121561382157600080fd5b813567ffffffffffffffff81111561383857600080fd5b820160a081850312156120bd57600080fd5b60208152600082516040602084015261386660608401826135ef565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526138a182826135ef565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156138f857835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016138c6565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156138f857835167ffffffffffffffff1683529284019291840191600101613920565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff8111828210171561399957613999613946565b60405290565b6040805190810167ffffffffffffffff8111828210171561399957613999613946565b60405160c0810167ffffffffffffffff8111828210171561399957613999613946565b80151581146119fe57600080fd5b80356135a9816139e5565b80356fffffffffffffffffffffffffffffffff811681146135a957600080fd5b600060608284031215613a3057600080fd5b6040516060810181811067ffffffffffffffff82111715613a5357613a53613946565b6040529050808235613a64816139e5565b8152613a72602084016139fe565b6020820152613a83604084016139fe565b60408201525092915050565b600080600060e08486031215613aa457600080fd5b8335613aaf81613588565b9250613abe8560208601613a1e565b9150613acd8560808601613a1e565b90509250925092565b60008060208385031215613ae957600080fd5b823567ffffffffffffffff811115613b0057600080fd5b613b0c858286016136d2565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b803563ffffffff811681146135a957600080fd5b600060808284031215613b6d57600080fd5b6040516080810181811067ffffffffffffffff82111715613b9057613b90613946565b60405282358152613ba360208401613b47565b60208201526040830135613bb681613588565b60408201526060830135613bc9816139e5565b60608201529392505050565b6020808252818101839052600090604080840186845b87811015613c4f578135835263ffffffff613c07868401613b47565b168584015283820135613c1981613588565b67ffffffffffffffff1683850152606082810135613c36816139e5565b1515908401526080928301929190910190600101613beb565b5090979650505050505050565b600181811c90821680613c7057607f821691505b602082108103613ca9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f830112613cc057600080fd5b813567ffffffffffffffff80821115613cdb57613cdb613946565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613d2157613d21613946565b81604052838152866020858801011115613d3a57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006101008236031215613d6d57600080fd5b613d75613975565b823567ffffffffffffffff80821115613d8d57600080fd5b613d9936838701613caf565b8352613da76020860161359e565b6020840152613db86040860161366e565b604084015260608501356060840152613dd36080860161366e565b608084015260a0850135915080821115613dec57600080fd5b613df836838701613caf565b60a084015260c0850135915080821115613e1157600080fd5b613e1d36838701613caf565b60c084015260e0850135915080821115613e3657600080fd5b50613e4336828601613caf565b60e08301525092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613e8457600080fd5b83018035915067ffffffffffffffff821115613e9f57600080fd5b60200191503681900382131561371757600080fd5b600060408284031215613ec657600080fd5b613ece61399f565b8235613ed981613588565b8152613ee760208401613b47565b60208201529392505050565b600060208284031215613f0557600080fd5b813567ffffffffffffffff80821115613f1d57600080fd5b9083019060408286031215613f3157600080fd5b613f3961399f565b823582811115613f4857600080fd5b613f5487828601613caf565b825250602083013582811115613f6957600080fd5b613f7587828601613caf565b60208301525095945050505050565b604081526000613f9760408301856135ef565b82810360208401526138a181856135ef565b600060208284031215613fbb57600080fd5b81516120bd816139e5565b601f821115611562576000816000526020600020601f850160051c81016020861015613fef5750805b601f850160051c820191505b81811015611e5e57828155600101613ffb565b67ffffffffffffffff83111561402657614026613946565b61403a836140348354613c5c565b83613fc6565b6000601f84116001811461408c57600085156140565750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b178355614122565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156140db57868501358255602094850194600190920191016140bb565b5086821015614116577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b60408152600061418560408301866135ef565b8281036020840152614198818587614129565b9695505050505050565b600060a082360312156141b457600080fd5b60405160a0810167ffffffffffffffff82821081831117156141d8576141d8613946565b8160405284359150808211156141ed57600080fd5b506141fa36828601613caf565b825250602083013561420b81613588565b6020820152604083013561421e8161364c565b604082015260608381013590820152608083013561423b8161364c565b608082015292915050565b602081526000612bc8602083018486614129565b60006020828403121561426c57600080fd5b81516120bd81613588565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec18336030181126142ab57600080fd5b9190910192915050565b600061014082360312156142c857600080fd5b6142d06139c2565b6142d98361359e565b81526142e7602084016139f3565b6020820152604083013567ffffffffffffffff8082111561430757600080fd5b61431336838701613caf565b6040840152606085013591508082111561432c57600080fd5b5061433936828601613caf565b60608301525061434c3660808501613a1e565b608082015261435e3660e08501613a1e565b60a082015292915050565b815167ffffffffffffffff81111561438357614383613946565b614397816143918454613c5c565b84613fc6565b602080601f8311600181146143ea57600084156143b45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611e5e565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561443757888601518255948401946001909101908401614418565b508582101561447357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff871683528060208401526144a7818401876135ef565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506144e59050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e08301526138a1565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156108cd576108cd61451c565b67ffffffffffffffff8416815260e081016145aa60208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152612bc8565b606081016108cd82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006020828403121561462f57600080fd5b81516120bd8161364c565b80820281158282048414176108cd576108cd61451c565b808201808211156108cd576108cd61451c565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000826146c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600082516142ab8184602087016135cb56fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"contractITokenMessenger\",\"name\":\"tokenMessenger\",\"type\":\"address\"},{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"allowlist\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AllowListNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerIsNotARampOnRouter\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainAlreadyExists\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"DisabledNonZeroRateLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"got\",\"type\":\"uint32\"}],\"name\":\"InvalidDestinationDomain\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"allowedCaller\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"domainIdentifier\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structUSDCTokenPool.DomainUpdate\",\"name\":\"domain\",\"type\":\"tuple\"}],\"name\":\"InvalidDomain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"InvalidMessageVersion\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"}],\"name\":\"InvalidNonce\",\"type\":\"error\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"InvalidRateLimitRate\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"}],\"name\":\"InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"expected\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"got\",\"type\":\"uint32\"}],\"name\":\"InvalidSourceDomain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidSourcePoolAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"InvalidToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"version\",\"type\":\"uint32\"}],\"name\":\"InvalidTokenMessengerVersion\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"NonExistentChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RateLimitMustBeDisabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SenderNotAllowed\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"domain\",\"type\":\"uint64\"}],\"name\":\"UnknownDomain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnlockingUSDCFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListAdd\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"AllowListRemove\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Burned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remoteToken\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"tokenMessenger\",\"type\":\"address\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"allowedCaller\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"domainIdentifier\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structUSDCTokenPool.DomainUpdate[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"name\":\"DomainsSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Locked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Minted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"Released\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"previousPoolAddress\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"RemotePoolSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRouter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"RouterUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"SUPPORTED_USDC_VERSION\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"removes\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"adds\",\"type\":\"address[]\"}],\"name\":\"applyAllowListUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"remoteTokenAddress\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundRateLimiterConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundRateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structTokenPool.ChainUpdate[]\",\"name\":\"chains\",\"type\":\"tuple[]\"}],\"name\":\"applyChainUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowList\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentInboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getCurrentOutboundRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getDomain\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"allowedCaller\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"domainIdentifier\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structUSDCTokenPool.Domain\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRateLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemotePool\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getRemoteToken\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRmnProxy\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRouter\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedChains\",\"outputs\":[{\"internalType\":\"uint64[]\",\"name\":\"\",\"type\":\"uint64[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getToken\",\"outputs\":[{\"internalType\":\"contractIERC20\",\"name\":\"token\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_localDomainIdentifier\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_messageTransmitter\",\"outputs\":[{\"internalType\":\"contractIMessageTransmitter\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_tokenMessenger\",\"outputs\":[{\"internalType\":\"contractITokenMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"isSupportedChain\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"isSupportedToken\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structPool.LockOrBurnInV1\",\"name\":\"lockOrBurnIn\",\"type\":\"tuple\"}],\"name\":\"lockOrBurn\",\"outputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destPoolData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.LockOrBurnOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes\",\"name\":\"originalSender\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"sourcePoolData\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"offchainTokenData\",\"type\":\"bytes\"}],\"internalType\":\"structPool.ReleaseOrMintInV1\",\"name\":\"releaseOrMintIn\",\"type\":\"tuple\"}],\"name\":\"releaseOrMint\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"destinationAmount\",\"type\":\"uint256\"}],\"internalType\":\"structPool.ReleaseOrMintOutV1\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"outboundConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"inboundConfig\",\"type\":\"tuple\"}],\"name\":\"setChainRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"allowedCaller\",\"type\":\"bytes32\"},{\"internalType\":\"uint32\",\"name\":\"domainIdentifier\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"internalType\":\"structUSDCTokenPool.DomainUpdate[]\",\"name\":\"domains\",\"type\":\"tuple[]\"}],\"name\":\"setDomains\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"rateLimitAdmin\",\"type\":\"address\"}],\"name\":\"setRateLimitAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"remotePoolAddress\",\"type\":\"bytes\"}],\"name\":\"setRemotePool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newRouter\",\"type\":\"address\"}],\"name\":\"setRouter\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x6101406040523480156200001257600080fd5b506040516200562038038062005620833981016040819052620000359162000b4c565b838383833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c3816200041b565b5050506001600160a01b0384161580620000e457506001600160a01b038116155b80620000f757506001600160a01b038216155b1562000116576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0384811660805282811660a052600480546001600160a01b031916918316919091179055825115801560c0526200016957604080516000815260208101909152620001699084620004c6565b5050506001600160a01b038616905062000196576040516306b7c75960e31b815260040160405180910390fd5b6000856001600160a01b0316632c1219216040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001d7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001fd919062000c72565b90506000816001600160a01b03166354fd4d506040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000240573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000266919062000c99565b905063ffffffff81161562000297576040516334697c6b60e11b815263ffffffff8216600482015260240162000087565b6000876001600160a01b0316639cdbb1816040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002d8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002fe919062000c99565b905063ffffffff8116156200032f576040516316ba39c560e31b815263ffffffff8216600482015260240162000087565b6001600160a01b0380891660e05283166101008190526040805163234d8e3d60e21b81529051638d3638f4916004808201926020929091908290030181865afa15801562000381573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003a7919062000c99565b63ffffffff166101205260e051608051620003d1916001600160a01b039091169060001962000623565b6040516001600160a01b03891681527f2e902d38f15b233cbb63711add0fca4545334d3a169d60c0a616494d7eea95449060200160405180910390a1505050505050505062000de6565b336001600160a01b03821603620004755760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60c051620004e7576040516335f4a7b360e01b815260040160405180910390fd5b60005b8251811015620005725760008382815181106200050b576200050b62000cc1565b602090810291909101015190506200052560028262000709565b1562000568576040516001600160a01b03821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101620004ea565b5060005b81518110156200061e57600082828151811062000597576200059762000cc1565b6020026020010151905060006001600160a01b0316816001600160a01b031603620005c3575062000615565b620005d060028262000729565b1562000613576040516001600160a01b03821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010162000576565b505050565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000675573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200069b919062000cd7565b620006a7919062000d07565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000703918691906200074016565b50505050565b600062000720836001600160a01b03841662000811565b90505b92915050565b600062000720836001600160a01b03841662000915565b6040805180820190915260208082527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564908201526000906200078f906001600160a01b03851690849062000967565b8051909150156200061e5780806020019051810190620007b0919062000d1d565b6200061e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840162000087565b600081815260018301602052604081205480156200090a5760006200083860018362000d41565b85549091506000906200084e9060019062000d41565b9050818114620008ba57600086600001828154811062000872576200087262000cc1565b906000526020600020015490508087600001848154811062000898576200089862000cc1565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620008ce57620008ce62000d57565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000723565b600091505062000723565b60008181526001830160205260408120546200095e5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000723565b50600062000723565b606062000978848460008562000980565b949350505050565b606082471015620009e35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840162000087565b600080866001600160a01b0316858760405162000a01919062000d93565b60006040518083038185875af1925050503d806000811462000a40576040519150601f19603f3d011682016040523d82523d6000602084013e62000a45565b606091505b50909250905062000a598783838762000a64565b979650505050505050565b6060831562000ad857825160000362000ad0576001600160a01b0385163b62000ad05760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000087565b508162000978565b62000978838381511562000aef5781518083602001fd5b8060405162461bcd60e51b815260040162000087919062000db1565b6001600160a01b038116811462000b2157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b805162000b478162000b0b565b919050565b600080600080600060a0868803121562000b6557600080fd5b855162000b728162000b0b565b8095505060208087015162000b878162000b0b565b60408801519095506001600160401b038082111562000ba557600080fd5b818901915089601f83011262000bba57600080fd5b81518181111562000bcf5762000bcf62000b24565b8060051b604051601f19603f8301168101818110858211171562000bf75762000bf762000b24565b60405291825284820192508381018501918c83111562000c1657600080fd5b938501935b8285101562000c3f5762000c2f8562000b3a565b8452938501939285019262000c1b565b80985050505050505062000c566060870162000b3a565b915062000c666080870162000b3a565b90509295509295909350565b60006020828403121562000c8557600080fd5b815162000c928162000b0b565b9392505050565b60006020828403121562000cac57600080fd5b815163ffffffff8116811462000c9257600080fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121562000cea57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b8082018082111562000723576200072362000cf1565b60006020828403121562000d3057600080fd5b8151801515811462000c9257600080fd5b8181038181111562000723576200072362000cf1565b634e487b7160e01b600052603160045260246000fd5b60005b8381101562000d8a57818101518382015260200162000d70565b50506000910152565b6000825162000da781846020870162000d6d565b9190910192915050565b602081526000825180602084015262000dd281604085016020870162000d6d565b601f01601f19169190910160400192915050565b60805160a05160c05160e051610100516101205161477a62000ea660003960008181610382015281816111ab01528181611e230152611e810152600081816106760152610a7801526000818161035b01526110bf01526000818161063a01528181611fab01526129f201526000818161057601528181611c21015261226101526000818161028f015281816102e401528181610b3e0152818161108c01528181611b41015281816121810152818161287c0152612bdd015261477a6000f3fe608060405234801561001057600080fd5b50600436106101ef5760003560e01c80639a4575b91161010f578063c75eea9c116100a2578063dfadfa3511610071578063dfadfa351461059a578063e0351e1314610638578063f2fde38b1461065e578063fbf84dd71461067157600080fd5b8063c75eea9c1461053b578063cf7401f31461054e578063db6327dc14610561578063dc0bd9711461057457600080fd5b8063b0f479a1116100de578063b0f479a1146104e2578063b794658014610500578063c0d7865514610513578063c4bffe2b1461052657600080fd5b80639a4575b9146104365780639fdf13ff14610456578063a7cd63b71461045e578063af58d59f1461047357600080fd5b80636155cda01161018757806379ba50971161015657806379ba5097146103ea5780637d54534e146103f25780638926f54f146104055780638da5cb5b1461041857600080fd5b80636155cda0146103565780636b716b0d1461037d5780636d3d1a58146103b957806378a010b2146103d757600080fd5b806321df0da7116101c357806321df0da71461028d578063240028e8146102d4578063390775371461032157806354c8a4f31461034357600080fd5b806241d3c1146101f457806301ffc9a7146102095780630a2fd49314610231578063181f5a7714610251575b600080fd5b610207610202366004613587565b610698565b005b61021c6102173660046135fc565b610835565b60405190151581526020015b60405180910390f35b61024461023f366004613664565b61091a565b60405161022891906136ef565b6102446040518060400160405280601381526020017f55534443546f6b656e506f6f6c20312e342e300000000000000000000000000081525081565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610228565b61021c6102e236600461372f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161490565b61033461032f36600461374c565b6109ca565b60405190518152602001610228565b6102076103513660046137d4565b610bfc565b6102af7f000000000000000000000000000000000000000000000000000000000000000081565b6103a47f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff9091168152602001610228565b60085473ffffffffffffffffffffffffffffffffffffffff166102af565b6102076103e5366004613840565b610c77565b610207610de6565b61020761040036600461372f565b610ee3565b61021c610413366004613664565b610f32565b60005473ffffffffffffffffffffffffffffffffffffffff166102af565b6104496104443660046138c5565b610f49565b6040516102289190613900565b6103a4600081565b610466611225565b6040516102289190613960565b610486610481366004613664565b611236565b604051610228919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60045473ffffffffffffffffffffffffffffffffffffffff166102af565b61024461050e366004613664565b61130b565b61020761052136600461372f565b611336565b61052e61140a565b60405161022891906139ba565b610486610549366004613664565b6114c2565b61020761055c366004613b45565b611594565b61020761056f366004613b8c565b61161d565b7f00000000000000000000000000000000000000000000000000000000000000006102af565b61060e6105a8366004613664565b60408051606080820183526000808352602080840182905292840181905267ffffffffffffffff949094168452600982529282902082519384018352805484526001015463ffffffff811691840191909152640100000000900460ff1615159082015290565b604080518251815260208084015163ffffffff169082015291810151151590820152606001610228565b7f000000000000000000000000000000000000000000000000000000000000000061021c565b61020761066c36600461372f565b611aa3565b6102af7f000000000000000000000000000000000000000000000000000000000000000081565b6106a0611ab7565b60005b818110156107f75760008383838181106106bf576106bf613bce565b9050608002018036038101906106d59190613c11565b805190915015806106f25750604081015167ffffffffffffffff16155b1561076157604080517fa087bd2900000000000000000000000000000000000000000000000000000000815282516004820152602083015163ffffffff1660248201529082015167ffffffffffffffff1660448201526060820151151560648201526084015b60405180910390fd5b60408051606080820183528351825260208085015163ffffffff9081168285019081529286015115158486019081529585015167ffffffffffffffff166000908152600990925293902091518255516001918201805494511515640100000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000009095169190931617929092179055016106a3565b507f1889010d2535a0ab1643678d1da87fbbe8b87b2f585b47ddb72ec622aef9ee568282604051610829929190613c8b565b60405180910390a15050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167faff2afbf0000000000000000000000000000000000000000000000000000000014806108c857507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e64dd2900000000000000000000000000000000000000000000000000000000145b8061091457507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b67ffffffffffffffff8116600090815260076020526040902060040180546060919061094590613d12565b80601f016020809104026020016040519081016040528092919081815260200182805461097190613d12565b80156109be5780601f10610993576101008083540402835291602001916109be565b820191906000526020600020905b8154815290600101906020018083116109a157829003601f168201915b50505050509050919050565b6040805160208101909152600081526109ea6109e583613e10565b611b3a565b60006109f960c0840184613f05565b810190610a069190613f6a565b90506000610a1760e0850185613f05565b810190610a249190613fa9565b9050610a34816000015183611d6b565b805160208201516040517f57ecfd2800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016926357ecfd2892610aab9260040161403a565b6020604051808303816000875af1158015610aca573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aee919061405f565b610b24576040517fbf969f2200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b6973ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016336060870135611f1c565b610b79606085016040860161372f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9d228d69b5fdb8d273a2336f8fb8612d039631024ea9bf09c424a9503aa078f08660600135604051610bdb91815260200190565b60405180910390a35050604080516020810190915260609092013582525090565b610c04611ab7565b610c7184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611fa992505050565b50505050565b610c7f611ab7565b610c8883610f32565b610cca576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610758565b67ffffffffffffffff831660009081526007602052604081206004018054610cf190613d12565b80601f0160208091040260200160405190810160405280929190818152602001828054610d1d90613d12565b8015610d6a5780601f10610d3f57610100808354040283529160200191610d6a565b820191906000526020600020905b815481529060010190602001808311610d4d57829003601f168201915b5050505067ffffffffffffffff8616600090815260076020526040902091925050600401610d998385836140c4565b508367ffffffffffffffff167fdb4d6220746a38cbc5335f7e108f7de80f482f4d23350253dfd0917df75a14bf828585604051610dd8939291906141df565b60405180910390a250505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e6572000000000000000000006044820152606401610758565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610eeb611ab7565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6000610914600567ffffffffffffffff841661215f565b6040805180820190915260608082526020820152610f6e610f6983614243565b61217a565b6000600981610f836040860160208701613664565b67ffffffffffffffff168152602080820192909252604090810160002081516060810183528154815260019091015463ffffffff81169382019390935264010000000090920460ff16151590820181905290915061102a57610feb6040840160208501613664565b6040517fd201c48a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610758565b602081015181516040517ff856ddb60000000000000000000000000000000000000000000000000000000081526060860135600482015263ffffffff90921660248301526044820181905273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116606484015260848301919091526000917f00000000000000000000000000000000000000000000000000000000000000009091169063f856ddb69060a4016020604051808303816000875af115801561110a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112e91906142e7565b6040516060860135815290915033907f696de425f79f4a40bc6d2122ca50507f0efbeabbff86a84871b7196ab8ea8df79060200160405180910390a2604051806040016040528061118b86602001602081019061050e9190613664565b815260408051808201825267ffffffffffffffff851680825263ffffffff7f00000000000000000000000000000000000000000000000000000000000000008116602093840190815284518085019390935251169281019290925290910190606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190529052949350505050565b60606112316002612344565b905090565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845260028201546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600390910154808416606083015291909104909116608082015261091490612351565b67ffffffffffffffff8116600090815260076020526040902060050180546060919061094590613d12565b61133e611ab7565b73ffffffffffffffffffffffffffffffffffffffff811661138b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f02dc5c233404867c793b749c6d644beb2277536d18a7e7974d3f238e4c6f16849101610829565b606060006114186005612344565b90506000815167ffffffffffffffff811115611436576114366139fc565b60405190808252806020026020018201604052801561145f578160200160208202803683370190505b50905060005b82518110156114bb5782818151811061148057611480613bce565b602002602001015182828151811061149a5761149a613bce565b67ffffffffffffffff90921660209283029190910190910152600101611465565b5092915050565b6040805160a08101825260008082526020820181905291810182905260608101829052608081019190915267ffffffffffffffff8216600090815260076020908152604091829020825160a08101845281546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff16958401959095527401000000000000000000000000000000000000000090910460ff16151594820194909452600190910154808416606083015291909104909116608082015261091490612351565b60085473ffffffffffffffffffffffffffffffffffffffff1633148015906115d4575060005473ffffffffffffffffffffffffffffffffffffffff163314155b1561160d576040517f8e4a23d6000000000000000000000000000000000000000000000000000000008152336004820152602401610758565b611618838383612403565b505050565b611625611ab7565b60005b8181101561161857600083838381811061164457611644613bce565b90506020028101906116569190614304565b61165f90614342565b905061167481608001518260200151156124ed565b6116878160a001518260200151156124ed565b8060200151156119835780516116a99060059067ffffffffffffffff16612626565b6116ee5780516040517f1d5ad3c500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610758565b60408101515115806117035750606081015151155b1561173a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805161012081018252608083810180516020908101516fffffffffffffffffffffffffffffffff9081168486019081524263ffffffff90811660a0808901829052865151151560c08a01528651860151851660e08a015295518901518416610100890152918752875180860189529489018051850151841686528585019290925281515115158589015281518401518316606080870191909152915188015183168587015283870194855288880151878901908152828a015183890152895167ffffffffffffffff1660009081526007865289902088518051825482890151838e01519289167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316177001000000000000000000000000000000009188168202177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff90811674010000000000000000000000000000000000000000941515850217865584890151948d0151948a16948a168202949094176001860155995180516002860180549b8301519f830151918b169b9093169a909a179d9096168a029c909c1790911696151502959095179098559081015194015193811693169091029190911760038201559151909190600482019061191b90826143f6565b506060820151600582019061193090826143f6565b505081516060830151608084015160a08501516040517f8d340f17e19058004c20453540862a9c62778504476f6756755cb33bcd6c38c295506119769493929190614510565b60405180910390a1611a9a565b805161199b9060059067ffffffffffffffff16612632565b6119e05780516040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610758565b805167ffffffffffffffff16600090815260076020526040812080547fffffffffffffffffffffff00000000000000000000000000000000000000000090811682556001820183905560028201805490911690556003810182905590611a496004830182613539565b611a57600583016000613539565b5050805160405167ffffffffffffffff90911681527f5204aec90a3c794d8e90fded8b46ae9c7c552803e7e832e0c1d358396d8599169060200160405180910390a15b50600101611628565b611aab611ab7565b611ab48161263e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610758565b565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff908116911614611bcf5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610758565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa158015611c7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca1919061405f565b15611cd8576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ce58160200151612733565b6000611cf4826020015161091a565b9050805160001480611d18575080805190602001208260a001518051906020012014155b15611d55578160a001516040517f24eb47e500000000000000000000000000000000000000000000000000000000815260040161075891906136ef565b611d6782602001518360600151612859565b5050565b600482015163ffffffff811615611db6576040517f68d2f8d600000000000000000000000000000000000000000000000000000000815263ffffffff82166004820152602401610758565b6008830151600c8401516014850151602085015163ffffffff808516911614611e215760208501516040517fe366a11700000000000000000000000000000000000000000000000000000000815263ffffffff91821660048201529084166024820152604401610758565b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff168263ffffffff1614611eb6576040517f77e4802600000000000000000000000000000000000000000000000000000000815263ffffffff7f00000000000000000000000000000000000000000000000000000000000000008116600483015283166024820152604401610758565b845167ffffffffffffffff828116911614611f145784516040517ff917ffea00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff91821660048201529082166024820152604401610758565b505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526116189084906128a0565b7f0000000000000000000000000000000000000000000000000000000000000000612000576040517f35f4a7b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b825181101561209657600083828151811061202057612020613bce565b6020026020010151905061203e8160026129ac90919063ffffffff16565b1561208d5760405173ffffffffffffffffffffffffffffffffffffffff821681527f800671136ab6cfee9fbe5ed1fb7ca417811aca3cf864800d127b927adedf75669060200160405180910390a15b50600101612003565b5060005b81518110156116185760008282815181106120b7576120b7613bce565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036120fb5750612157565b6121066002826129ce565b156121555760405173ffffffffffffffffffffffffffffffffffffffff821681527f2640d4d76caf8bf478aabfa982fa4e1c4eb71a37f93cd15e80dbc657911546d89060200160405180910390a15b505b60010161209a565b600081815260018301602052604081205415155b9392505050565b60808101517f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff90811691161461220f5760808101516040517f961c9a4f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610758565b60208101516040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815260809190911b77ffffffffffffffff000000000000000000000000000000001660048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632cbc26bb90602401602060405180830381865afa1580156122bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e1919061405f565b15612318576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61232581604001516129f0565b6123328160200151612a6f565b611ab481602001518260600151612bbd565b6060600061217383612c01565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526123df82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff16426123c391906145d8565b85608001516fffffffffffffffffffffffffffffffff16612c5c565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b61240c83610f32565b61244e576040517f1e670e4b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84166004820152602401610758565b6124598260006124ed565b67ffffffffffffffff8316600090815260076020526040902061247c9083612c86565b6124878160006124ed565b67ffffffffffffffff831660009081526007602052604090206124ad9060020182612c86565b7f0350d63aa5f270e01729d00d627eeb8f3429772b1818c016c66a588a864f912b8383836040516124e0939291906145eb565b60405180910390a1505050565b8151156125b45781602001516fffffffffffffffffffffffffffffffff1682604001516fffffffffffffffffffffffffffffffff16101580612543575060408201516fffffffffffffffffffffffffffffffff16155b1561257c57816040517f8020d124000000000000000000000000000000000000000000000000000000008152600401610758919061466e565b8015611d67576040517f433fc33d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516fffffffffffffffffffffffffffffffff161515806125ed575060208201516fffffffffffffffffffffffffffffffff1615155b15611d6757816040517fd68af9cc000000000000000000000000000000000000000000000000000000008152600401610758919061466e565b60006121738383612e28565b60006121738383612e77565b3373ffffffffffffffffffffffffffffffffffffffff8216036126bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610758565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b61273c81610f32565b61277e576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610758565b600480546040517f83826b2b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925233602483015273ffffffffffffffffffffffffffffffffffffffff16906383826b2b90604401602060405180830381865afa1580156127fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612821919061405f565b611ab4576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610758565b67ffffffffffffffff82166000908152600760205260409020611d6790600201827f0000000000000000000000000000000000000000000000000000000000000000612f6a565b6000612902826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166132ed9092919063ffffffff16565b8051909150156116185780806020019051810190612920919061405f565b611618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610758565b60006121738373ffffffffffffffffffffffffffffffffffffffff8416612e77565b60006121738373ffffffffffffffffffffffffffffffffffffffff8416612e28565b7f000000000000000000000000000000000000000000000000000000000000000015611ab457612a216002826132fc565b611ab4576040517fd0d2597600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152602401610758565b612a7881610f32565b612aba576040517fa9902c7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff82166004820152602401610758565b600480546040517fa8d87a3b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff84169281019290925273ffffffffffffffffffffffffffffffffffffffff169063a8d87a3b90602401602060405180830381865afa158015612b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b5791906146aa565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ab4576040517f728fe07b000000000000000000000000000000000000000000000000000000008152336004820152602401610758565b67ffffffffffffffff82166000908152600760205260409020611d6790827f0000000000000000000000000000000000000000000000000000000000000000612f6a565b6060816000018054806020026020016040519081016040528092919081815260200182805480156109be57602002820191906000526020600020905b815481526020019060010190808311612c3d5750505050509050919050565b6000612c7b85612c6c84866146c7565b612c7690876146de565b61332b565b90505b949350505050565b8154600090612caf90700100000000000000000000000000000000900463ffffffff16426145d8565b90508015612d515760018301548354612cf7916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612c5c565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b60208201518354612d77916fffffffffffffffffffffffffffffffff908116911661332b565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906124e090849061466e565b6000818152600183016020526040812054612e6f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610914565b506000610914565b60008181526001830160205260408120548015612f60576000612e9b6001836145d8565b8554909150600090612eaf906001906145d8565b9050818114612f14576000866000018281548110612ecf57612ecf613bce565b9060005260206000200154905080876000018481548110612ef257612ef2613bce565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612f2557612f256146f1565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610914565b6000915050610914565b825474010000000000000000000000000000000000000000900460ff161580612f91575081155b15612f9b57505050565b825460018401546fffffffffffffffffffffffffffffffff80831692911690600090612fe190700100000000000000000000000000000000900463ffffffff16426145d8565b905080156130a15781831115613023576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461305d9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612c5c565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156131585773ffffffffffffffffffffffffffffffffffffffff8416613100576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610758565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610758565b8483101561326b5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1690600090829061319c90826145d8565b6131a6878a6145d8565b6131b091906146de565b6131ba9190614720565b905073ffffffffffffffffffffffffffffffffffffffff8616613213576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610758565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610758565b61327585846145d8565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6060612c7e8484600085613341565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515612173565b600081831061333a5781612173565b5090919050565b6060824710156133d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610758565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516133fc919061475b565b60006040518083038185875af1925050503d8060008114613439576040519150601f19603f3d011682016040523d82523d6000602084013e61343e565b606091505b509150915061344f8783838761345a565b979650505050505050565b606083156134f05782516000036134e95773ffffffffffffffffffffffffffffffffffffffff85163b6134e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610758565b5081612c7e565b612c7e83838151156135055781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075891906136ef565b50805461354590613d12565b6000825580601f10613555575050565b601f016020900490600052602060002090810190611ab491905b80821115613583576000815560010161356f565b5090565b6000806020838503121561359a57600080fd5b823567ffffffffffffffff808211156135b257600080fd5b818501915085601f8301126135c657600080fd5b8135818111156135d557600080fd5b8660208260071b85010111156135ea57600080fd5b60209290920196919550909350505050565b60006020828403121561360e57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461217357600080fd5b67ffffffffffffffff81168114611ab457600080fd5b803561365f8161363e565b919050565b60006020828403121561367657600080fd5b81356121738161363e565b60005b8381101561369c578181015183820152602001613684565b50506000910152565b600081518084526136bd816020860160208601613681565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061217360208301846136a5565b73ffffffffffffffffffffffffffffffffffffffff81168114611ab457600080fd5b803561365f81613702565b60006020828403121561374157600080fd5b813561217381613702565b60006020828403121561375e57600080fd5b813567ffffffffffffffff81111561377557600080fd5b8201610100818503121561217357600080fd5b60008083601f84011261379a57600080fd5b50813567ffffffffffffffff8111156137b257600080fd5b6020830191508360208260051b85010111156137cd57600080fd5b9250929050565b600080600080604085870312156137ea57600080fd5b843567ffffffffffffffff8082111561380257600080fd5b61380e88838901613788565b9096509450602087013591508082111561382757600080fd5b5061383487828801613788565b95989497509550505050565b60008060006040848603121561385557600080fd5b83356138608161363e565b9250602084013567ffffffffffffffff8082111561387d57600080fd5b818601915086601f83011261389157600080fd5b8135818111156138a057600080fd5b8760208285010111156138b257600080fd5b6020830194508093505050509250925092565b6000602082840312156138d757600080fd5b813567ffffffffffffffff8111156138ee57600080fd5b820160a0818503121561217357600080fd5b60208152600082516040602084015261391c60608401826136a5565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084830301604085015261395782826136a5565b95945050505050565b6020808252825182820181905260009190848201906040850190845b818110156139ae57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161397c565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156139ae57835167ffffffffffffffff16835292840192918401916001016139d6565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051610100810167ffffffffffffffff81118282101715613a4f57613a4f6139fc565b60405290565b6040805190810167ffffffffffffffff81118282101715613a4f57613a4f6139fc565b60405160c0810167ffffffffffffffff81118282101715613a4f57613a4f6139fc565b8015158114611ab457600080fd5b803561365f81613a9b565b80356fffffffffffffffffffffffffffffffff8116811461365f57600080fd5b600060608284031215613ae657600080fd5b6040516060810181811067ffffffffffffffff82111715613b0957613b096139fc565b6040529050808235613b1a81613a9b565b8152613b2860208401613ab4565b6020820152613b3960408401613ab4565b60408201525092915050565b600080600060e08486031215613b5a57600080fd5b8335613b658161363e565b9250613b748560208601613ad4565b9150613b838560808601613ad4565b90509250925092565b60008060208385031215613b9f57600080fd5b823567ffffffffffffffff811115613bb657600080fd5b613bc285828601613788565b90969095509350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b803563ffffffff8116811461365f57600080fd5b600060808284031215613c2357600080fd5b6040516080810181811067ffffffffffffffff82111715613c4657613c466139fc565b60405282358152613c5960208401613bfd565b60208201526040830135613c6c8161363e565b60408201526060830135613c7f81613a9b565b60608201529392505050565b6020808252818101839052600090604080840186845b87811015613d05578135835263ffffffff613cbd868401613bfd565b168584015283820135613ccf8161363e565b67ffffffffffffffff1683850152606082810135613cec81613a9b565b1515908401526080928301929190910190600101613ca1565b5090979650505050505050565b600181811c90821680613d2657607f821691505b602082108103613d5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600082601f830112613d7657600080fd5b813567ffffffffffffffff80821115613d9157613d916139fc565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715613dd757613dd76139fc565b81604052838152866020858801011115613df057600080fd5b836020870160208301376000602085830101528094505050505092915050565b60006101008236031215613e2357600080fd5b613e2b613a2b565b823567ffffffffffffffff80821115613e4357600080fd5b613e4f36838701613d65565b8352613e5d60208601613654565b6020840152613e6e60408601613724565b604084015260608501356060840152613e8960808601613724565b608084015260a0850135915080821115613ea257600080fd5b613eae36838701613d65565b60a084015260c0850135915080821115613ec757600080fd5b613ed336838701613d65565b60c084015260e0850135915080821115613eec57600080fd5b50613ef936828601613d65565b60e08301525092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613f3a57600080fd5b83018035915067ffffffffffffffff821115613f5557600080fd5b6020019150368190038213156137cd57600080fd5b600060408284031215613f7c57600080fd5b613f84613a55565b8235613f8f8161363e565b8152613f9d60208401613bfd565b60208201529392505050565b600060208284031215613fbb57600080fd5b813567ffffffffffffffff80821115613fd357600080fd5b9083019060408286031215613fe757600080fd5b613fef613a55565b823582811115613ffe57600080fd5b61400a87828601613d65565b82525060208301358281111561401f57600080fd5b61402b87828601613d65565b60208301525095945050505050565b60408152600061404d60408301856136a5565b828103602084015261395781856136a5565b60006020828403121561407157600080fd5b815161217381613a9b565b601f821115611618576000816000526020600020601f850160051c810160208610156140a55750805b601f850160051c820191505b81811015611f14578281556001016140b1565b67ffffffffffffffff8311156140dc576140dc6139fc565b6140f0836140ea8354613d12565b8361407c565b6000601f841160018114614142576000851561410c5750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556141d8565b6000838152602090207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0861690835b828110156141915786850135825560209485019460019092019101614171565b50868210156141cc577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6040815260006141f260408301866136a5565b82810360208401528381528385602083013760006020858301015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f860116820101915050949350505050565b600060a0823603121561425557600080fd5b60405160a0810167ffffffffffffffff8282108183111715614279576142796139fc565b81604052843591508082111561428e57600080fd5b5061429b36828601613d65565b82525060208301356142ac8161363e565b602082015260408301356142bf81613702565b60408201526060838101359082015260808301356142dc81613702565b608082015292915050565b6000602082840312156142f957600080fd5b81516121738161363e565b600082357ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec183360301811261433857600080fd5b9190910192915050565b6000610140823603121561435557600080fd5b61435d613a78565b61436683613654565b815261437460208401613aa9565b6020820152604083013567ffffffffffffffff8082111561439457600080fd5b6143a036838701613d65565b604084015260608501359150808211156143b957600080fd5b506143c636828601613d65565b6060830152506143d93660808501613ad4565b60808201526143eb3660e08501613ad4565b60a082015292915050565b815167ffffffffffffffff811115614410576144106139fc565b6144248161441e8454613d12565b8461407c565b602080601f83116001811461447757600084156144415750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555611f14565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156144c4578886015182559484019460019091019084016144a5565b508582101561450057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b600061010067ffffffffffffffff87168352806020840152614534818401876136a5565b8551151560408581019190915260208701516fffffffffffffffffffffffffffffffff90811660608701529087015116608085015291506145729050565b8251151560a083015260208301516fffffffffffffffffffffffffffffffff90811660c084015260408401511660e0830152613957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b81810381811115610914576109146145a9565b67ffffffffffffffff8416815260e0810161463760208301858051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b82511515608083015260208301516fffffffffffffffffffffffffffffffff90811660a084015260408401511660c0830152612c7e565b6060810161091482848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000602082840312156146bc57600080fd5b815161217381613702565b8082028115828204841417610914576109146145a9565b80820180821115610914576109146145a9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600082614756577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000825161433881846020870161368156fea164736f6c6343000818000a",
}
var USDCTokenPoolABI = USDCTokenPoolMetaData.ABI
@@ -367,6 +367,28 @@ func (_USDCTokenPool *USDCTokenPoolCallerSession) GetDomain(chainSelector uint64
return _USDCTokenPool.Contract.GetDomain(&_USDCTokenPool.CallOpts, chainSelector)
}
+func (_USDCTokenPool *USDCTokenPoolCaller) GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _USDCTokenPool.contract.Call(opts, &out, "getRateLimitAdmin")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_USDCTokenPool *USDCTokenPoolSession) GetRateLimitAdmin() (common.Address, error) {
+ return _USDCTokenPool.Contract.GetRateLimitAdmin(&_USDCTokenPool.CallOpts)
+}
+
+func (_USDCTokenPool *USDCTokenPoolCallerSession) GetRateLimitAdmin() (common.Address, error) {
+ return _USDCTokenPool.Contract.GetRateLimitAdmin(&_USDCTokenPool.CallOpts)
+}
+
func (_USDCTokenPool *USDCTokenPoolCaller) GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error) {
var out []interface{}
err := _USDCTokenPool.contract.Call(opts, &out, "getRemotePool", remoteChainSelector)
@@ -759,6 +781,18 @@ func (_USDCTokenPool *USDCTokenPoolTransactorSession) SetDomains(domains []USDCT
return _USDCTokenPool.Contract.SetDomains(&_USDCTokenPool.TransactOpts, domains)
}
+func (_USDCTokenPool *USDCTokenPoolTransactor) SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _USDCTokenPool.contract.Transact(opts, "setRateLimitAdmin", rateLimitAdmin)
+}
+
+func (_USDCTokenPool *USDCTokenPoolSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _USDCTokenPool.Contract.SetRateLimitAdmin(&_USDCTokenPool.TransactOpts, rateLimitAdmin)
+}
+
+func (_USDCTokenPool *USDCTokenPoolTransactorSession) SetRateLimitAdmin(rateLimitAdmin common.Address) (*types.Transaction, error) {
+ return _USDCTokenPool.Contract.SetRateLimitAdmin(&_USDCTokenPool.TransactOpts, rateLimitAdmin)
+}
+
func (_USDCTokenPool *USDCTokenPoolTransactor) SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error) {
return _USDCTokenPool.contract.Transact(opts, "setRemotePool", remoteChainSelector, remotePoolAddress)
}
@@ -3029,6 +3063,8 @@ type USDCTokenPoolInterface interface {
GetDomain(opts *bind.CallOpts, chainSelector uint64) (USDCTokenPoolDomain, error)
+ GetRateLimitAdmin(opts *bind.CallOpts) (common.Address, error)
+
GetRemotePool(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
GetRemoteToken(opts *bind.CallOpts, remoteChainSelector uint64) ([]byte, error)
@@ -3071,6 +3107,8 @@ type USDCTokenPoolInterface interface {
SetDomains(opts *bind.TransactOpts, domains []USDCTokenPoolDomainUpdate) (*types.Transaction, error)
+ SetRateLimitAdmin(opts *bind.TransactOpts, rateLimitAdmin common.Address) (*types.Transaction, error)
+
SetRemotePool(opts *bind.TransactOpts, remoteChainSelector uint64, remotePoolAddress []byte) (*types.Transaction, error)
SetRouter(opts *bind.TransactOpts, newRouter common.Address) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 7c584cc9dd..63ec39c74c 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -1,10 +1,10 @@
GETH_VERSION: 1.13.8
arm_contract: ../../../contracts/solc/v0.8.24/RMN/RMN.abi ../../../contracts/solc/v0.8.24/RMN/RMN.bin 1a0abacf84def916519013f713b667f106434a091af8b9f441e12cc90aa2cdf8
arm_proxy_contract: ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.abi ../../../contracts/solc/v0.8.24/ARMProxy/ARMProxy.bin b048d8e752e3c41113ebb305c1efa06737ad36b4907b93e627fb0a3113023454
-burn_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.bin d0708a0ae657eb7df01a5177ff4d5850c5823c821f5f6bbd0a468b3982330b13
-burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin fcb85edfc871504a5146db2e3951193c2de089fe491dd7a2fbc755fd92725cac
-burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 17bcd03828f43f50028bc4d66fdfb0cf576aaf28895d8f86c6ff598159a0cd64
-burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 6f40135e1488097eafa843839a719fe9a3c21354565b64eb377a24a0a55782ef
+burn_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool/BurnFromMintTokenPool.bin 62d9963a998b8e5c4b9bfa537e916559c167863329c40e9a75eb4defebceb810
+burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin 1bbffb552c3256097fbe61a430de408073816f40e17b17b102b793527d44f046
+burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 5be8832498c8aab49957bfff94fbb1d22373833d1d56f5d8ace259343b27fc24
+burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 9215cb5efe441e9893f871de31b4a5d4171c479f276aac4084046514990f1bd6
ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c06c1cf1d004a803585a2c9d7a71ee5997b5fca86c2e111335cb8b930d9e3b5a
ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 02be3227883ca4b69383892d27ba7a9af747151a06f4815d18ccd8aaf89b4fb9
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51
@@ -12,10 +12,10 @@ commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitSto
ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 25a7bf3aa46252844c7afabc15db1051e7b6a717e296fc4c6e2f2f93d16033c5
evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin 9478aedc9f0072fbdafb54a6f82248de1efbcd7bdff18a90d8556b9aaff67455
-evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin 6a3ae8f29cfc5aa52b5e4438b3196be8a542a952e828065b964fd8156dd3d96e
-evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin 116d5cb8447a1af61664a8d1db2d76086c042a3228337bc5cd49b9abd3e815f7
-lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin 95a93517b01f51c35d82711a0015995f4804820ed67f6b46b785c4c94815df93
-lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin 05e308151b5adc9ba8d33385b8f82d55aad638652fe50e3ea8b09b1d0bbfd367
+evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin bca94c29d523e7679db6ef86ffffcc52864a7499e9f0c51807c901bcc1927fda
+evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin bf1a3090a2f8d1632b82a6d45200cf6f3833a1e27303745405c1ed13ffc0cf83
+lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin f049909cfef0aa3b8158c85e7b64516b9d7b32f4930705574090e5b9cab534b1
+lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin d897366aa5c58f426eaf3fc748d9def8f78111d9ac8c122e390952f640de22fc
maybe_revert_message_receiver: ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.abi ../../../contracts/solc/v0.8.24/MaybeRevertMessageReceiver/MaybeRevertMessageReceiver.bin d73956c26232ebcc4a5444429fa99cbefed960e323be9b5a24925885c2e477d5
message_hasher: ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.abi ../../../contracts/solc/v0.8.24/MessageHasher/MessageHasher.bin 1d5146d43e1b99cd2d6f9f06475be19087e4349f7cee0fdbbf134ba65e967c93
mock_arm_contract: ../../../contracts/solc/v0.8.24/MockRMN1_0/MockRMN.abi ../../../contracts/solc/v0.8.24/MockRMN1_0/MockRMN.bin e7a3a6c3eda5fb882e16bcc2b4340f78523acb67907bcdcaf3c8ffc51488688e
@@ -27,12 +27,12 @@ multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Help
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d
ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 1588313bb5e781d181a825247d30828f59007700f36b4b9b00391592b06ff4b4
-price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 09cdd37920d6f605c8a264f805bdba183813517169b2b5df4547e995d9ce73f7
+price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 955eeb1da5f001fa01dc9914bf8a02b7e3b58e080ee775424261dcd97f88d70d
registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 7b2a47349d3fdb8d8b4e206d68577219deca7fabd1e893686fa8f118ad980d2d
report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3
router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290
self_funded_ping_pong: ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.abi ../../../contracts/solc/v0.8.24/SelfFundedPingPong/SelfFundedPingPong.bin 86e169636e5633854ed0b709c804066b615040bceba25aa5137450fbe6f76fa3
token_admin_registry: ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.abi ../../../contracts/solc/v0.8.24/TokenAdminRegistry/TokenAdminRegistry.bin fb06d2cf5f7476e512c6fb7aab8eab43545efd7f0f6ca133c64ff4e3963902c4
-token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 47a83e91b28ad1381a2a5882e2adfe168809a63a8f533ab1631f174550c64bed
-usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin a54136ed9bffc74fff830c5066dbfcee6db1f31d636795317267d6baf1e0427a
+token_pool: ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.abi ../../../contracts/solc/v0.8.24/TokenPool/TokenPool.bin 7c01fd89f5153baa4d7409d14beabb3f861abfbf8880d3c6d06802cc398570f9
+usdc_token_pool: ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.abi ../../../contracts/solc/v0.8.24/USDCTokenPool/USDCTokenPool.bin e259cffee304678cfce3632f122cf96ecc06b4ab01905940cd0111f2fd50e4d8
weth9: ../../../contracts/solc/v0.8.24/WETH9/WETH9.abi ../../../contracts/solc/v0.8.24/WETH9/WETH9.bin 2970d79a0ca6dd6279cde130de45e56c8790ed695eae477fb5ba4c1bb75b720d
diff --git a/core/services/ocr2/plugins/ccip/integration_test.go b/core/services/ocr2/plugins/ccip/integration_test.go
index 202d2ef230..b4c7d35616 100644
--- a/core/services/ocr2/plugins/ccip/integration_test.go
+++ b/core/services/ocr2/plugins/ccip/integration_test.go
@@ -629,8 +629,6 @@ func TestIntegration_CCIP(t *testing.T) {
PriceRegistry: ccipTH.Dest.PriceRegistry.Address(),
MaxDataBytes: 1e5,
MaxNumberOfTokensPerMsg: 5,
- MaxPoolReleaseOrMintGas: 200_000,
- MaxTokenTransferGas: 100_000,
})
node.EventuallyNodeUsesUpdatedPriceRegistry(t, ccipTH)
}
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go
index 9cfe3f628c..506028f3db 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/onramp_reader_test.go
@@ -351,8 +351,7 @@ func setupOnRampV1_5_0(t *testing.T, user *bind.TransactOpts, bc *client.Simulat
MaxDataBytes: 0,
MaxPerMsgGasLimit: 0,
DefaultTokenFeeUSDCents: 50,
- DefaultTokenDestGasOverhead: 34_000,
- DefaultTokenDestBytesOverhead: 500,
+ DefaultTokenDestGasOverhead: 125_000,
}
rateLimiterConfig := evm_2_evm_onramp.RateLimiterConfig{
IsEnabled: false,
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go
index cac61c6787..15f52bd713 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/offramp.go
@@ -43,9 +43,7 @@ func (d ExecOnchainConfig) AbiString() string {
{"name": "maxDataBytes", "type": "uint32"},
{"name": "maxNumberOfTokensPerMsg", "type": "uint16"},
{"name": "router", "type": "address"},
- {"name": "priceRegistry", "type": "address"},
- {"name": "maxPoolReleaseOrMintGas", "type": "uint32"},
- {"name": "maxTokenTransferGas", "type": "uint32"}
+ {"name": "priceRegistry", "type": "address"}
],
"type": "tuple"
}
@@ -65,12 +63,6 @@ func (d ExecOnchainConfig) Validate() error {
if d.MaxNumberOfTokensPerMsg == 0 {
return errors.New("must set MaxNumberOfTokensPerMsg")
}
- if d.MaxPoolReleaseOrMintGas == 0 {
- return errors.New("must set MaxPoolReleaseOrMintGas")
- }
- if d.MaxTokenTransferGas == 0 {
- return errors.New("must set MaxTokenTransferGas")
- }
return nil
}
diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go
index 3ca360c8ff..0f09f2190b 100644
--- a/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go
+++ b/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0/onramp_test.go
@@ -158,8 +158,7 @@ func setupOnRampV1_5_0(t testing.TB, user *bind.TransactOpts, bc *client.Simulat
MaxDataBytes: 0,
MaxPerMsgGasLimit: 0,
DefaultTokenFeeUSDCents: 50,
- DefaultTokenDestGasOverhead: 34_000,
- DefaultTokenDestBytesOverhead: 500,
+ DefaultTokenDestGasOverhead: 125_000,
}
rateLimiterConfig := evm_2_evm_onramp.RateLimiterConfig{
IsEnabled: false,
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
index 805c49d91a..1f745df9d5 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
@@ -124,23 +124,13 @@ type ExecOnchainConfig struct {
v1_5_0.ExecOnchainConfig
}
-func NewExecOnchainConfig(
- PermissionLessExecutionThresholdSeconds uint32,
- Router common.Address,
- PriceRegistry common.Address,
- MaxNumberOfTokensPerMsg uint16,
- MaxDataBytes uint32,
- MaxPoolReleaseOrMintGas uint32,
- MaxTokenTransferGas uint32,
-) ExecOnchainConfig {
+func NewExecOnchainConfig(PermissionLessExecutionThresholdSeconds uint32, Router common.Address, PriceRegistry common.Address, MaxNumberOfTokensPerMsg uint16, MaxDataBytes uint32) ExecOnchainConfig {
return ExecOnchainConfig{v1_5_0.ExecOnchainConfig{
PermissionLessExecutionThresholdSeconds: PermissionLessExecutionThresholdSeconds,
Router: Router,
PriceRegistry: PriceRegistry,
MaxNumberOfTokensPerMsg: MaxNumberOfTokensPerMsg,
MaxDataBytes: MaxDataBytes,
- MaxPoolReleaseOrMintGas: MaxPoolReleaseOrMintGas,
- MaxTokenTransferGas: MaxTokenTransferGas,
}}
}
@@ -323,8 +313,7 @@ func (c *CCIPContracts) DeployNewOnRamp(t *testing.T) {
MaxDataBytes: 1e5,
MaxPerMsgGasLimit: 4_000_000,
DefaultTokenFeeUSDCents: 50,
- DefaultTokenDestGasOverhead: 34_000,
- DefaultTokenDestBytesOverhead: 500,
+ DefaultTokenDestGasOverhead: DefaultTokenDestGasOverhead,
},
evm_2_evm_onramp.RateLimiterConfig{
IsEnabled: true,
@@ -353,7 +342,7 @@ func (c *CCIPContracts) DeployNewOnRamp(t *testing.T) {
MinFeeUSDCents: 50, // $0.5
MaxFeeUSDCents: 1_000_000_00, // $ 1 million
DeciBps: 5_0, // 5 bps
- DestGasOverhead: 34_000,
+ DestGasOverhead: 110_000,
DestBytesOverhead: 32,
AggregateRateLimitEnabled: true,
},
@@ -1048,8 +1037,7 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh
MaxDataBytes: 1e5,
MaxPerMsgGasLimit: 4_000_000,
DefaultTokenFeeUSDCents: 50,
- DefaultTokenDestGasOverhead: 34_000,
- DefaultTokenDestBytesOverhead: 500,
+ DefaultTokenDestGasOverhead: DefaultTokenDestGasOverhead,
},
evm_2_evm_onramp.RateLimiterConfig{
IsEnabled: true,
@@ -1078,7 +1066,7 @@ func SetupCCIPContracts(t *testing.T, sourceChainID, sourceChainSelector, destCh
MinFeeUSDCents: 50, // $0.5
MaxFeeUSDCents: 1_000_000_00, // $ 1 million
DeciBps: 5_0, // 5 bps
- DestGasOverhead: 34_000,
+ DestGasOverhead: 350_000,
DestBytesOverhead: 32,
AggregateRateLimitEnabled: true,
},
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/config.go b/core/services/ocr2/plugins/ccip/testhelpers/config.go
index f70f1954f1..4e2f358835 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/config.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/config.go
@@ -15,6 +15,10 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ccip/internal/ccipdata/v1_5_0"
)
+const (
+ DefaultTokenDestGasOverhead = 125_000
+)
+
var PermissionLessExecutionThresholdSeconds = uint32(FirstBlockAge.Seconds())
func (c *CCIPContracts) CreateDefaultCommitOnchainConfig(t *testing.T) []byte {
@@ -49,8 +53,6 @@ func (c *CCIPContracts) CreateDefaultExecOnchainConfig(t *testing.T) []byte {
PriceRegistry: c.Dest.PriceRegistry.Address(),
MaxDataBytes: 1e5,
MaxNumberOfTokensPerMsg: 5,
- MaxPoolReleaseOrMintGas: 200_000,
- MaxTokenTransferGas: 100_000,
})
require.NoError(t, err)
return config
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/helpers.go b/core/services/ocr3/plugins/ccip_integration_tests/helpers.go
index 10431e794a..142337480e 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/helpers.go
+++ b/core/services/ocr3/plugins/ccip_integration_tests/helpers.go
@@ -688,7 +688,7 @@ func defaultPriceRegistryDestChainConfig(t *testing.T) price_registry.PriceRegis
DestDataAvailabilityOverheadGas: 0,
DestGasPerDataAvailabilityByte: 100,
DestDataAvailabilityMultiplierBps: 1,
- DefaultTokenDestGasOverhead: 50_000,
+ DefaultTokenDestGasOverhead: 125_000,
DefaultTokenDestBytesOverhead: 32,
DefaultTxGasLimit: 200_000,
GasMultiplierWeiPerEth: 1,
diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go
index 9d3fc42999..94b4de984c 100644
--- a/integration-tests/ccip-tests/actions/ccip_helpers.go
+++ b/integration-tests/ccip-tests/actions/ccip_helpers.go
@@ -83,7 +83,7 @@ const (
ChaosGroupNetworkBCCIPGeth = "CCIPNetworkBGeth"
defaultUSDCDestBytesOverhead = 640
- defaultUSDCDestGasOverhead = 120_000
+ defaultUSDCDestGasOverhead = 150_000
DefaultDestinationGasLimit = 600_000
// DefaultResubscriptionTimeout denotes the max backoff duration for resubscription for various watch events
// if the subscription keeps failing even after this duration, the test will fail
@@ -3764,7 +3764,6 @@ func SetOCR2Config(
DefaultMaxNoOfTokensInMsg,
MaxDataBytes,
200_000,
- 50_000,
)
if err != nil {
return fmt.Errorf("failed to create exec onchain config: %w", err)
diff --git a/integration-tests/ccip-tests/contracts/contract_deployer.go b/integration-tests/ccip-tests/contracts/contract_deployer.go
index 0f0bfd4ab5..57d96e5cb6 100644
--- a/integration-tests/ccip-tests/contracts/contract_deployer.go
+++ b/integration-tests/ccip-tests/contracts/contract_deployer.go
@@ -1043,8 +1043,7 @@ func (e *CCIPContractsDeployer) DeployOnRamp(
MaxDataBytes: 50000,
MaxPerMsgGasLimit: 4_000_000,
DefaultTokenFeeUSDCents: 50,
- DefaultTokenDestGasOverhead: 34_000,
- DefaultTokenDestBytesOverhead: 500,
+ DefaultTokenDestGasOverhead: 125_000,
},
evm_2_evm_onramp.RateLimiterConfig{
Capacity: opts.Capacity,
@@ -1445,19 +1444,10 @@ func NewExecOnchainConfig(
MaxNumberOfTokensPerMsg uint16,
MaxDataBytes uint32,
MaxPoolReleaseOrMintGas uint32,
- MaxTokenTransferGas uint32,
) (abihelpers.AbiDefined, error) {
switch VersionMap[OffRampContract] {
case Latest:
- return testhelpers.NewExecOnchainConfig(
- PermissionLessExecutionThresholdSeconds,
- Router,
- PriceRegistry,
- MaxNumberOfTokensPerMsg,
- MaxDataBytes,
- MaxPoolReleaseOrMintGas,
- MaxTokenTransferGas,
- ), nil
+ return testhelpers.NewExecOnchainConfig(PermissionLessExecutionThresholdSeconds, Router, PriceRegistry, MaxNumberOfTokensPerMsg, MaxDataBytes), nil
case V1_2_0:
return testhelpers_1_4_0.NewExecOnchainConfig(
PermissionLessExecutionThresholdSeconds,
diff --git a/integration-tests/ccip-tests/contracts/contract_models.go b/integration-tests/ccip-tests/contracts/contract_models.go
index 661761ed27..0ec55a1e54 100644
--- a/integration-tests/ccip-tests/contracts/contract_models.go
+++ b/integration-tests/ccip-tests/contracts/contract_models.go
@@ -97,7 +97,7 @@ const (
CommitStoreContract Name = "CommitStore"
defaultDestByteOverhead = uint32(32)
- defaultDestGasOverhead = uint32(29_000)
+ defaultDestGasOverhead = uint32(125_000)
)
var (
From 0518b922e737f57d8b07936f7ff5302b36b8624f Mon Sep 17 00:00:00 2001
From: Agustina Aldasoro
Date: Thu, 1 Aug 2024 13:45:47 -0300
Subject: [PATCH 15/28] Avoid sending already verified signatures when
transmitting (#1224)
## Motivation
Exec plugin submits reports which do not have their signatures checked
on chain. This is to save gas, because signature checking is expensive
and executions can only be for committed data which is already
authenticated. It is executed using a OCR2 plugin as it handles the turn
taking functionality.
Gas can be saved by not even submitting the signatures as calldata. Each
signature is about 64 bytes and it costs 16 per non-zero byte of
calldata.
## Solution
In the Exec Provider, configure the Transmitter to skip sending the
signatures.
The exec provider was modified in
https://github.com/smartcontractkit/chainlink/pull/13761
---
core/services/relay/evm/evm.go | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/core/services/relay/evm/evm.go b/core/services/relay/evm/evm.go
index 73a3aed4a1..fe84949903 100644
--- a/core/services/relay/evm/evm.go
+++ b/core/services/relay/evm/evm.go
@@ -509,7 +509,7 @@ func (r *Relayer) NewCCIPExecProvider(rargs commontypes.RelayArgs, pargs commont
subjectID := chainToUUID(configWatcher.chain.ID())
contractTransmitter, err := newOnChainContractTransmitter(ctx, r.lggr, rargs, r.ks.Eth(), configWatcher, configTransmitterOpts{
subjectID: &subjectID,
- }, OCR2AggregatorTransmissionContractABI, WithReportToEthMetadata(fn), WithRetention(0))
+ }, OCR2AggregatorTransmissionContractABI, WithReportToEthMetadata(fn), WithRetention(0), WithExcludeSignatures())
if err != nil {
return nil, err
}
From 274e93302d84f21d37869fc255ec7e13d9731811 Mon Sep 17 00:00:00 2001
From: chainchad <96362174+chainchad@users.noreply.github.com>
Date: Thu, 1 Aug 2024 14:22:39 -0400
Subject: [PATCH 16/28] Remove old CRIB PR label from argo cd (#1186)
## Motivation
Argo CD + CRIB is not used.
## Solution
Get rid of this since it's not used.
---
.../scripts/crib/lib/check-route53-records.js | 91 --
.github/scripts/crib/package.json | 20 -
.github/scripts/crib/pnpm-lock.yaml | 1206 -----------------
.github/scripts/crib/pr-comment-crib-env.js | 145 --
.github/scripts/crib/test.js | 13 -
.github/workflows/pr-labels.yml | 47 -
6 files changed, 1522 deletions(-)
delete mode 100644 .github/scripts/crib/lib/check-route53-records.js
delete mode 100644 .github/scripts/crib/package.json
delete mode 100644 .github/scripts/crib/pnpm-lock.yaml
delete mode 100755 .github/scripts/crib/pr-comment-crib-env.js
delete mode 100644 .github/scripts/crib/test.js
delete mode 100644 .github/workflows/pr-labels.yml
diff --git a/.github/scripts/crib/lib/check-route53-records.js b/.github/scripts/crib/lib/check-route53-records.js
deleted file mode 100644
index f35762ec88..0000000000
--- a/.github/scripts/crib/lib/check-route53-records.js
+++ /dev/null
@@ -1,91 +0,0 @@
-import { setTimeout } from "node:timers/promises";
-import {
- Route53Client,
- ListResourceRecordSetsCommand,
-} from "@aws-sdk/client-route-53";
-
-// us-east-1 is the global region used by Route 53.
-const route53Client = new Route53Client({ region: "us-east-1" });
-
-async function paginateListResourceRecordSets(route53Client, params) {
- let isTruncated = true;
- let nextRecordName, nextRecordType;
- let allRecordSets = [];
-
- while (isTruncated) {
- const response = await route53Client.send(
- new ListResourceRecordSetsCommand({
- ...params,
- ...(nextRecordName && { StartRecordName: nextRecordName }),
- ...(nextRecordType && { StartRecordType: nextRecordType }),
- })
- );
-
- allRecordSets = allRecordSets.concat(response.ResourceRecordSets);
- isTruncated = response.IsTruncated;
- if (isTruncated) {
- nextRecordName = response.NextRecordName;
- nextRecordType = response.NextRecordType;
- }
- }
-
- return allRecordSets;
-}
-
-/**
- * Check if Route 53 records exist for a given Route 53 zone.
- *
- * @param {string} hostedZoneId The ID of the hosted zone.
- * @param {string[]} recordNames An array of record names to check.
- * @param {number} maxRetries The maximum number of retries.
- * @param {number} initialBackoffMs The initial backoff time in milliseconds.
- * @returns {Promise} True if records exist, false otherwise.
- */
-export async function route53RecordsExist(
- hostedZoneId,
- recordNames,
- maxRetries = 8,
- initialBackoffMs = 2000
-) {
- let attempts = 0;
-
- // We try to gather all records within a specified time limit.
- // We issue retries due to an indeterminate amount of time required
- // for record propagation.
- console.info("Checking DNS records in Route 53...");
- while (attempts < maxRetries) {
- try {
- const allRecordSets = await paginateListResourceRecordSets(
- route53Client,
- {
- HostedZoneId: hostedZoneId,
- MaxItems: "300",
- }
- );
-
- const recordExists = recordNames.every((name) =>
- allRecordSets.some((r) => r.Name.includes(name))
- );
-
- if (recordExists) {
- console.info("All records found in Route 53.");
- return true;
- }
-
- // If any record is not found, throw an error to trigger a retry
- throw new Error(
- "One or more DNS records not found in Route 53, retrying..."
- );
- } catch (error) {
- console.error(`Attempt ${attempts + 1}:`, error.message);
- if (attempts === maxRetries - 1) {
- return false; // Return false after the last attempt
- }
- // Exponential backoff
- await setTimeout(initialBackoffMs * 2 ** attempts);
- attempts++;
- }
- }
- // Should not reach here if retries are exhausted
- return false;
-}
diff --git a/.github/scripts/crib/package.json b/.github/scripts/crib/package.json
deleted file mode 100644
index b009d63f38..0000000000
--- a/.github/scripts/crib/package.json
+++ /dev/null
@@ -1,20 +0,0 @@
-{
- "name": "crib",
- "version": "1.0.0",
- "description": "",
- "main": "pr-comment-crib-env.js",
- "type": "module",
- "keywords": [],
- "author": "",
- "license": "MIT",
- "engines": {
- "node": ">=18",
- "pnpm": ">=9"
- },
- "dependencies": {
- "@actions/core": "^1.10.1",
- "@actions/github": "^6.0.0",
- "@aws-sdk/client-route-53": "^3.525.0",
- "@octokit/rest": "^20.0.2"
- }
-}
diff --git a/.github/scripts/crib/pnpm-lock.yaml b/.github/scripts/crib/pnpm-lock.yaml
deleted file mode 100644
index a65caf8355..0000000000
--- a/.github/scripts/crib/pnpm-lock.yaml
+++ /dev/null
@@ -1,1206 +0,0 @@
-lockfileVersion: '9.0'
-
-settings:
- autoInstallPeers: true
- excludeLinksFromLockfile: false
-
-importers:
-
- .:
- dependencies:
- '@actions/core':
- specifier: ^1.10.1
- version: 1.10.1
- '@actions/github':
- specifier: ^6.0.0
- version: 6.0.0
- '@aws-sdk/client-route-53':
- specifier: ^3.525.0
- version: 3.529.1
- '@octokit/rest':
- specifier: ^20.0.2
- version: 20.0.2
-
-packages:
-
- '@actions/core@1.10.1':
- resolution: {integrity: sha512-3lBR9EDAY+iYIpTnTIXmWcNbX3T2kCkAEQGIQx4NVQ0575nk2k3GRZDTPQG+vVtS2izSLmINlxXf0uLtnrTP+g==}
-
- '@actions/github@6.0.0':
- resolution: {integrity: sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g==}
-
- '@actions/http-client@2.2.1':
- resolution: {integrity: sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==}
-
- '@aws-crypto/crc32@3.0.0':
- resolution: {integrity: sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==}
-
- '@aws-crypto/ie11-detection@3.0.0':
- resolution: {integrity: sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==}
-
- '@aws-crypto/sha256-browser@3.0.0':
- resolution: {integrity: sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==}
-
- '@aws-crypto/sha256-js@3.0.0':
- resolution: {integrity: sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==}
-
- '@aws-crypto/supports-web-crypto@3.0.0':
- resolution: {integrity: sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==}
-
- '@aws-crypto/util@3.0.0':
- resolution: {integrity: sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==}
-
- '@aws-sdk/client-route-53@3.529.1':
- resolution: {integrity: sha512-osra30V5ILwEBeE1DUZreY7HYWQGco+WcQ1qg1UDSh/C0Nyxlu+8bVpwB/bjaldmy5Fi9MRv8SQsMdiAJFNp+w==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/client-sso-oidc@3.529.1':
- resolution: {integrity: sha512-bimxCWAvRnVcluWEQeadXvHyzWlBWsuGVligsaVZaGF0TLSn0eLpzpN9B1EhHzTf7m0Kh/wGtPSH1JxO6PpB+A==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- '@aws-sdk/credential-provider-node': ^3.529.1
-
- '@aws-sdk/client-sso@3.529.1':
- resolution: {integrity: sha512-KT1U/ZNjDhVv2ZgjzaeAn9VM7l667yeSguMrRYC8qk5h91/61MbjZypi6eOuKuVM+0fsQvzKScTQz0Lio0eYag==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/client-sts@3.529.1':
- resolution: {integrity: sha512-Rvk2Sr3MACQTOtngUU+omlf4E17k47dRVXR7OFRD6Ow5iGgC9tkN2q/ExDPW/ktPOmM0lSgzWyQ6/PC/Zq3HUg==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- '@aws-sdk/credential-provider-node': ^3.529.1
-
- '@aws-sdk/core@3.529.1':
- resolution: {integrity: sha512-Sj42sYPfaL9PHvvciMICxhyrDZjqnnvFbPKDmQL5aFKyXy122qx7RdVqUOQERDmMQfvJh6+0W1zQlLnre89q4Q==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/credential-provider-env@3.523.0':
- resolution: {integrity: sha512-Y6DWdH6/OuMDoNKVzZlNeBc6f1Yjk1lYMjANKpIhMbkRCvLJw/PYZKOZa8WpXbTYdgg9XLjKybnLIb3ww3uuzA==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/credential-provider-http@3.525.0':
- resolution: {integrity: sha512-RNWQGuSBQZhl3iqklOslUEfQ4br1V3DCPboMpeqFtddUWJV3m2u2extFur9/4Uy+1EHVF120IwZUKtd8dF+ibw==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/credential-provider-ini@3.529.1':
- resolution: {integrity: sha512-RjHsuTvHIwXG7a/3ERexemiD3c9riKMCZQzY2/b0Gg0ButEVbBcMfERtUzWmQ0V4ufe/PEZjP68MH1gupcoF9A==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/credential-provider-node@3.529.1':
- resolution: {integrity: sha512-mvY7F3dMmk/0dZOCfl5sUI1bG0osureBjxhELGCF0KkJqhWI0hIzh8UnPkYytSg3vdc97CMv7pTcozxrdA3b0g==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/credential-provider-process@3.523.0':
- resolution: {integrity: sha512-f0LP9KlFmMvPWdKeUKYlZ6FkQAECUeZMmISsv6NKtvPCI9e4O4cLTeR09telwDK8P0HrgcRuZfXM7E30m8re0Q==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/credential-provider-sso@3.529.1':
- resolution: {integrity: sha512-KFMKkaoTGDgSJG+o9Ii7AglWG5JQeF6IFw9cXLMwDdIrp3KUmRcUIqe0cjOoCqeQEDGy0VHsimHmKKJ3894i/A==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/credential-provider-web-identity@3.529.1':
- resolution: {integrity: sha512-AGuZDOKN+AttjwTjrF47WLqzeEut2YynyxjkXZhxZF/xn8i5Y51kUAUdXsXw1bgR25pAeXQIdhsrQlRa1Pm5kw==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/middleware-host-header@3.523.0':
- resolution: {integrity: sha512-4g3q7Ta9sdD9TMUuohBAkbx/e3I/juTqfKi7TPgP+8jxcYX72MOsgemAMHuP6CX27eyj4dpvjH+w4SIVDiDSmg==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/middleware-logger@3.523.0':
- resolution: {integrity: sha512-PeDNJNhfiaZx54LBaLTXzUaJ9LXFwDFFIksipjqjvxMafnoVcQwKbkoPUWLe5ytT4nnL1LogD3s55mERFUsnwg==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/middleware-recursion-detection@3.523.0':
- resolution: {integrity: sha512-nZ3Vt7ehfSDYnrcg/aAfjjvpdE+61B3Zk68i6/hSUIegT3IH9H1vSW67NDKVp+50hcEfzWwM2HMPXxlzuyFyrw==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/middleware-sdk-route53@3.523.0':
- resolution: {integrity: sha512-d+SKqDBM3XCVkF/crRWwJD1WuS4PBY/CaTGwIyND1Z3o3ZCMhyo4f2ni19U+7ZtEULW50ZGznhB2F4GJHqpDUg==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/middleware-user-agent@3.525.0':
- resolution: {integrity: sha512-4al/6uO+t/QIYXK2OgqzDKQzzLAYJza1vWFS+S0lJ3jLNGyLB5BMU5KqWjDzevYZ4eCnz2Nn7z0FveUTNz8YdQ==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/region-config-resolver@3.525.0':
- resolution: {integrity: sha512-8kFqXk6UyKgTMi7N7QlhA6qM4pGPWbiUXqEY2RgUWngtxqNFGeM9JTexZeuavQI+qLLe09VPShPNX71fEDcM6w==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/token-providers@3.529.1':
- resolution: {integrity: sha512-NpgMjsfpqiugbxrYGXtta914N43Mx/H0niidqv8wKMTgWQEtsJvYtOni+kuLXB+LmpjaMFNlpadooFU/bK4buA==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/types@3.523.0':
- resolution: {integrity: sha512-AqGIu4u+SxPiUuNBp2acCVcq80KDUFjxe6e3cMTvKWTzCbrVk1AXv0dAaJnCmdkWIha6zJDWxpIk/aL4EGhZ9A==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/util-endpoints@3.525.0':
- resolution: {integrity: sha512-DIW7WWU5tIGkeeKX6NJUyrEIdWMiqjLQG3XBzaUj+ufIENwNjdAHhlD8l2vX7Yr3JZRT6yN/84wBCj7Tw1xd1g==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/util-locate-window@3.495.0':
- resolution: {integrity: sha512-MfaPXT0kLX2tQaR90saBT9fWQq2DHqSSJRzW+MZWsmF+y5LGCOhO22ac/2o6TKSQm7h0HRc2GaADqYYYor62yg==}
- engines: {node: '>=14.0.0'}
-
- '@aws-sdk/util-user-agent-browser@3.523.0':
- resolution: {integrity: sha512-6ZRNdGHX6+HQFqTbIA5+i8RWzxFyxsZv8D3soRfpdyWIKkzhSz8IyRKXRciwKBJDaC7OX2jzGE90wxRQft27nA==}
-
- '@aws-sdk/util-user-agent-node@3.525.0':
- resolution: {integrity: sha512-88Wjt4efyUSBGcyIuh1dvoMqY1k15jpJc5A/3yi67clBQEFsu9QCodQCQPqmRjV3VRcMtBOk+jeCTiUzTY5dRQ==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- aws-crt: '>=1.0.0'
- peerDependenciesMeta:
- aws-crt:
- optional: true
-
- '@aws-sdk/util-utf8-browser@3.259.0':
- resolution: {integrity: sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==}
-
- '@aws-sdk/xml-builder@3.523.0':
- resolution: {integrity: sha512-wfvyVymj2TUw7SuDor9IuFcAzJZvWRBZotvY/wQJOlYa3UP3Oezzecy64N4FWfBJEsZdrTN+HOZFl+IzTWWnUA==}
- engines: {node: '>=14.0.0'}
-
- '@fastify/busboy@2.1.1':
- resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==}
- engines: {node: '>=14'}
-
- '@octokit/auth-token@4.0.0':
- resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==}
- engines: {node: '>= 18'}
-
- '@octokit/core@5.1.0':
- resolution: {integrity: sha512-BDa2VAMLSh3otEiaMJ/3Y36GU4qf6GI+VivQ/P41NC6GHcdxpKlqV0ikSZ5gdQsmS3ojXeRx5vasgNTinF0Q4g==}
- engines: {node: '>= 18'}
-
- '@octokit/endpoint@9.0.4':
- resolution: {integrity: sha512-DWPLtr1Kz3tv8L0UvXTDP1fNwM0S+z6EJpRcvH66orY6Eld4XBMCSYsaWp4xIm61jTWxK68BrR7ibO+vSDnZqw==}
- engines: {node: '>= 18'}
-
- '@octokit/graphql@7.0.2':
- resolution: {integrity: sha512-OJ2iGMtj5Tg3s6RaXH22cJcxXRi7Y3EBqbHTBRq+PQAqfaS8f/236fUrWhfSn8P4jovyzqucxme7/vWSSZBX2Q==}
- engines: {node: '>= 18'}
-
- '@octokit/openapi-types@20.0.0':
- resolution: {integrity: sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==}
-
- '@octokit/plugin-paginate-rest@9.2.1':
- resolution: {integrity: sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw==}
- engines: {node: '>= 18'}
- peerDependencies:
- '@octokit/core': '5'
-
- '@octokit/plugin-request-log@4.0.1':
- resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==}
- engines: {node: '>= 18'}
- peerDependencies:
- '@octokit/core': '5'
-
- '@octokit/plugin-rest-endpoint-methods@10.4.1':
- resolution: {integrity: sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==}
- engines: {node: '>= 18'}
- peerDependencies:
- '@octokit/core': '5'
-
- '@octokit/request-error@5.0.1':
- resolution: {integrity: sha512-X7pnyTMV7MgtGmiXBwmO6M5kIPrntOXdyKZLigNfQWSEQzVxR4a4vo49vJjTWX70mPndj8KhfT4Dx+2Ng3vnBQ==}
- engines: {node: '>= 18'}
-
- '@octokit/request@8.2.0':
- resolution: {integrity: sha512-exPif6x5uwLqv1N1irkLG1zZNJkOtj8bZxuVHd71U5Ftuxf2wGNvAJyNBcPbPC+EBzwYEbBDdSFb8EPcjpYxPQ==}
- engines: {node: '>= 18'}
-
- '@octokit/rest@20.0.2':
- resolution: {integrity: sha512-Ux8NDgEraQ/DMAU1PlAohyfBBXDwhnX2j33Z1nJNziqAfHi70PuxkFYIcIt8aIAxtRE7KVuKp8lSR8pA0J5iOQ==}
- engines: {node: '>= 18'}
-
- '@octokit/types@12.6.0':
- resolution: {integrity: sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==}
-
- '@smithy/abort-controller@2.1.4':
- resolution: {integrity: sha512-66HO817oIZ2otLIqy06R5muapqZjkgF1jfU0wyNko8cuqZNu8nbS9ljlhcRYw/M/uWRJzB9ih81DLSHhYbBLlQ==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/config-resolver@2.1.5':
- resolution: {integrity: sha512-LcBB5JQC3Tx2ZExIJzfvWaajhFIwHrUNQeqxhred2r5nnqrdly9uoCrvM1sxOOdghYuWWm2Kr8tBCDOmxsgeTA==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/core@1.3.8':
- resolution: {integrity: sha512-6cFhQ9ChU7MxvOXJn6nuUSONacpNsGHWhfueROQuM/0vibDdZA9FWEdNbVkuVuc+BFI5BnaX3ltERUlpUirpIA==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/credential-provider-imds@2.2.6':
- resolution: {integrity: sha512-+xQe4Pite0kdk9qn0Vyw5BRVh0iSlj+T4TEKRXr4E1wZKtVgIzGlkCrfICSjiPVFkPxk4jMpVboMYdEiiA88/w==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/eventstream-codec@2.1.4':
- resolution: {integrity: sha512-UkiieTztP7adg8EuqZvB0Y4LewdleZCJU7Kgt9RDutMsRYqO32fMpWeQHeTHaIMosmzcRZUykMRrhwGJe9mP3A==}
-
- '@smithy/fetch-http-handler@2.4.5':
- resolution: {integrity: sha512-FR1IMGdo0yRFs1tk71zRGSa1MznVLQOVNaPjyNtx6dOcy/u0ovEnXN5NVz6slw5KujFlg3N1w4+UbO8F3WyYUg==}
-
- '@smithy/hash-node@2.1.4':
- resolution: {integrity: sha512-uvCcpDLXaTTL0X/9ezF8T8sS77UglTfZVQaUOBiCvR0QydeSyio3t0Hj3QooVdyFsKTubR8gCk/ubLk3vAyDng==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/invalid-dependency@2.1.4':
- resolution: {integrity: sha512-QzlNBl6jt3nb9jNnE51wTegReVvUdozyMMrFEyb/rc6AzPID1O+qMJYjAAoNw098y0CZVfCpEnoK2+mfBOd8XA==}
-
- '@smithy/is-array-buffer@2.1.1':
- resolution: {integrity: sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/middleware-content-length@2.1.4':
- resolution: {integrity: sha512-C6VRwfcr0w9qRFhDGCpWMVhlEIBFlmlPRP1aX9Cv9xDj9SUwlDrNvoV1oP1vjRYuLxCDgovBBynCwwcluS2wLw==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/middleware-endpoint@2.4.6':
- resolution: {integrity: sha512-AsXtUXHPOAS0EGZUSFOsVJvc7p0KL29PGkLxLfycPOcFVLru/oinYB6yvyL73ZZPX2OB8sMYUMrj7eH2kI7V/w==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/middleware-retry@2.1.7':
- resolution: {integrity: sha512-8fOP/cJN4oMv+5SRffZC8RkqfWxHqGgn/86JPINY/1DnTRegzf+G5GT9lmIdG1YasuSbU7LISfW9PXil3isPVw==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/middleware-serde@2.2.1':
- resolution: {integrity: sha512-VAWRWqnNjgccebndpyK94om4ZTYzXLQxUmNCXYzM/3O9MTfQjTNBgtFtQwyIIez6z7LWcCsXmnKVIOE9mLqAHQ==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/middleware-stack@2.1.4':
- resolution: {integrity: sha512-Qqs2ba8Ax1rGKOSGJS2JN23fhhox2WMdRuzx0NYHtXzhxbJOIMmz9uQY6Hf4PY8FPteBPp1+h0j5Fmr+oW12sg==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/node-config-provider@2.2.5':
- resolution: {integrity: sha512-CxPf2CXhjO79IypHJLBATB66Dw6suvr1Yc2ccY39hpR6wdse3pZ3E8RF83SODiNH0Wjmkd0ze4OF8exugEixgA==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/node-http-handler@2.4.3':
- resolution: {integrity: sha512-bD5zRdEl1u/4vAAMeQnGEUNbH1seISV2Z0Wnn7ltPRl/6B2zND1R9XzTfsOnH1R5jqghpochF/mma8u7uXz0qQ==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/property-provider@2.1.4':
- resolution: {integrity: sha512-nWaY/MImj1BiXZ9WY65h45dcxOx8pl06KYoHxwojDxDL+Q9yLU1YnZpgv8zsHhEftlj9KhePENjQTlNowWVyug==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/protocol-http@3.2.2':
- resolution: {integrity: sha512-xYBlllOQcOuLoxzhF2u8kRHhIFGQpDeTQj/dBSnw4kfI29WMKL5RnW1m9YjnJAJ49miuIvrkJR+gW5bCQ+Mchw==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/querystring-builder@2.1.4':
- resolution: {integrity: sha512-LXSL0J/nRWvGT+jIj+Fip3j0J1ZmHkUyBFRzg/4SmPNCLeDrtVu7ptKOnTboPsFZu5BxmpYok3kJuQzzRdrhbw==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/querystring-parser@2.1.4':
- resolution: {integrity: sha512-U2b8olKXgZAs0eRo7Op11jTNmmcC/sqYmsA7vN6A+jkGnDvJlEl7AetUegbBzU8q3D6WzC5rhR/joIy8tXPzIg==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/service-error-classification@2.1.4':
- resolution: {integrity: sha512-JW2Hthy21evnvDmYYk1kItOmbp3X5XI5iqorXgFEunb6hQfSDZ7O1g0Clyxg7k/Pcr9pfLk5xDIR2To/IohlsQ==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/shared-ini-file-loader@2.3.5':
- resolution: {integrity: sha512-oI99+hOvsM8oAJtxAGmoL/YCcGXtbP0fjPseYGaNmJ4X5xOFTer0KPk7AIH3AL6c5AlYErivEi1X/X78HgTVIw==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/signature-v4@2.1.4':
- resolution: {integrity: sha512-gnu9gCn0qQ8IdhNjs6o3QVCXzUs33znSDYwVMWo3nX4dM6j7z9u6FC302ShYyVWfO4MkVMuGCCJ6nl3PcH7V1Q==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/smithy-client@2.4.5':
- resolution: {integrity: sha512-igXOM4kPXPo6b5LZXTUqTnrGk20uVd8OXoybC3f89gczzGfziLK4yUNOmiHSdxY9OOMOnnhVe5MpTm01MpFqvA==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/types@2.11.0':
- resolution: {integrity: sha512-AR0SXO7FuAskfNhyGfSTThpLRntDI5bOrU0xrpVYU0rZyjl3LBXInZFMTP/NNSd7IS6Ksdtar0QvnrPRIhVrLQ==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/url-parser@2.1.4':
- resolution: {integrity: sha512-1hTy6UYRYqOZlHKH2/2NzdNQ4NNmW2Lp0sYYvztKy+dEQuLvZL9w88zCzFQqqFer3DMcscYOshImxkJTGdV+rg==}
-
- '@smithy/util-base64@2.2.1':
- resolution: {integrity: sha512-troGfokrpoqv8TGgsb8p4vvM71vqor314514jyQ0i9Zae3qs0jUVbSMCIBB1tseVynXFRcZJAZ9hPQYlifLD5A==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-body-length-browser@2.1.1':
- resolution: {integrity: sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==}
-
- '@smithy/util-body-length-node@2.2.2':
- resolution: {integrity: sha512-U7DooaT1SfW7XHrOcxthYJnQ+WMaefRrFPxW5Qmypw38Ivv+TKvfVuVHA9V162h8BeW9rzOJwOunjgXd0DdB4w==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-buffer-from@2.1.1':
- resolution: {integrity: sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-config-provider@2.2.1':
- resolution: {integrity: sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-defaults-mode-browser@2.1.7':
- resolution: {integrity: sha512-vvIpWsysEdY77R0Qzr6+LRW50ye7eii7AyHM0OJnTi0isHYiXo5M/7o4k8gjK/b1upQJdfjzSBoJVa2SWrI+2g==}
- engines: {node: '>= 10.0.0'}
-
- '@smithy/util-defaults-mode-node@2.2.7':
- resolution: {integrity: sha512-qzXkSDyU6Th+rNNcNkG4a7Ix7m5HlMOtSCPxTVKlkz7eVsqbSSPggegbFeQJ2MVELBB4wnzNPsVPJIrpIaJpXA==}
- engines: {node: '>= 10.0.0'}
-
- '@smithy/util-endpoints@1.1.5':
- resolution: {integrity: sha512-tgDpaUNsUtRvNiBulKU1VnpoXU1GINMfZZXunRhUXOTBEAufG1Wp79uDXLau2gg1RZ4dpAR6lXCkrmddihCGUg==}
- engines: {node: '>= 14.0.0'}
-
- '@smithy/util-hex-encoding@2.1.1':
- resolution: {integrity: sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-middleware@2.1.4':
- resolution: {integrity: sha512-5yYNOgCN0DL0OplME0pthoUR/sCfipnROkbTO7m872o0GHCVNJj5xOFJ143rvHNA54+pIPMLum4z2DhPC2pVGA==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-retry@2.1.4':
- resolution: {integrity: sha512-JRZwhA3fhkdenSEYIWatC8oLwt4Bdf2LhHbNQApqb7yFoIGMl4twcYI3BcJZ7YIBZrACA9jGveW6tuCd836XzQ==}
- engines: {node: '>= 14.0.0'}
-
- '@smithy/util-stream@2.1.5':
- resolution: {integrity: sha512-FqvBFeTgx+QC4+i8USHqU8Ifs9nYRpW/OBfksojtgkxPIQ2H7ypXDEbnQRAV7PwoNHWcSwPomLYi0svmQQG5ow==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-uri-escape@2.1.1':
- resolution: {integrity: sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-utf8@2.2.0':
- resolution: {integrity: sha512-hBsKr5BqrDrKS8qy+YcV7/htmMGxriA1PREOf/8AGBhHIZnfilVv1Waf1OyKhSbFW15U/8+gcMUQ9/Kk5qwpHQ==}
- engines: {node: '>=14.0.0'}
-
- '@smithy/util-waiter@2.1.4':
- resolution: {integrity: sha512-AK17WaC0hx1wR9juAOsQkJ6DjDxBGEf5TrKhpXtNFEn+cVto9Li3MVsdpAO97AF7bhFXSyC8tJA3F4ThhqwCdg==}
- engines: {node: '>=14.0.0'}
-
- before-after-hook@2.2.3:
- resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==}
-
- bowser@2.11.0:
- resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==}
-
- deprecation@2.3.1:
- resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==}
-
- fast-xml-parser@4.2.5:
- resolution: {integrity: sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==}
- hasBin: true
-
- once@1.4.0:
- resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-
- strnum@1.0.5:
- resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
-
- tslib@1.14.1:
- resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-
- tslib@2.6.2:
- resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
-
- tunnel@0.0.6:
- resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==}
- engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'}
-
- undici@5.28.3:
- resolution: {integrity: sha512-3ItfzbrhDlINjaP0duwnNsKpDQk3acHI3gVJ1z4fmwMK31k5G9OVIAMLSIaP6w4FaGkaAkN6zaQO9LUvZ1t7VA==}
- engines: {node: '>=14.0'}
-
- universal-user-agent@6.0.1:
- resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==}
-
- uuid@8.3.2:
- resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
- hasBin: true
-
- wrappy@1.0.2:
- resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
-snapshots:
-
- '@actions/core@1.10.1':
- dependencies:
- '@actions/http-client': 2.2.1
- uuid: 8.3.2
-
- '@actions/github@6.0.0':
- dependencies:
- '@actions/http-client': 2.2.1
- '@octokit/core': 5.1.0
- '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.1.0)
- '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.1.0)
-
- '@actions/http-client@2.2.1':
- dependencies:
- tunnel: 0.0.6
- undici: 5.28.3
-
- '@aws-crypto/crc32@3.0.0':
- dependencies:
- '@aws-crypto/util': 3.0.0
- '@aws-sdk/types': 3.523.0
- tslib: 1.14.1
-
- '@aws-crypto/ie11-detection@3.0.0':
- dependencies:
- tslib: 1.14.1
-
- '@aws-crypto/sha256-browser@3.0.0':
- dependencies:
- '@aws-crypto/ie11-detection': 3.0.0
- '@aws-crypto/sha256-js': 3.0.0
- '@aws-crypto/supports-web-crypto': 3.0.0
- '@aws-crypto/util': 3.0.0
- '@aws-sdk/types': 3.523.0
- '@aws-sdk/util-locate-window': 3.495.0
- '@aws-sdk/util-utf8-browser': 3.259.0
- tslib: 1.14.1
-
- '@aws-crypto/sha256-js@3.0.0':
- dependencies:
- '@aws-crypto/util': 3.0.0
- '@aws-sdk/types': 3.523.0
- tslib: 1.14.1
-
- '@aws-crypto/supports-web-crypto@3.0.0':
- dependencies:
- tslib: 1.14.1
-
- '@aws-crypto/util@3.0.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@aws-sdk/util-utf8-browser': 3.259.0
- tslib: 1.14.1
-
- '@aws-sdk/client-route-53@3.529.1':
- dependencies:
- '@aws-crypto/sha256-browser': 3.0.0
- '@aws-crypto/sha256-js': 3.0.0
- '@aws-sdk/client-sts': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/core': 3.529.1
- '@aws-sdk/credential-provider-node': 3.529.1
- '@aws-sdk/middleware-host-header': 3.523.0
- '@aws-sdk/middleware-logger': 3.523.0
- '@aws-sdk/middleware-recursion-detection': 3.523.0
- '@aws-sdk/middleware-sdk-route53': 3.523.0
- '@aws-sdk/middleware-user-agent': 3.525.0
- '@aws-sdk/region-config-resolver': 3.525.0
- '@aws-sdk/types': 3.523.0
- '@aws-sdk/util-endpoints': 3.525.0
- '@aws-sdk/util-user-agent-browser': 3.523.0
- '@aws-sdk/util-user-agent-node': 3.525.0
- '@aws-sdk/xml-builder': 3.523.0
- '@smithy/config-resolver': 2.1.5
- '@smithy/core': 1.3.8
- '@smithy/fetch-http-handler': 2.4.5
- '@smithy/hash-node': 2.1.4
- '@smithy/invalid-dependency': 2.1.4
- '@smithy/middleware-content-length': 2.1.4
- '@smithy/middleware-endpoint': 2.4.6
- '@smithy/middleware-retry': 2.1.7
- '@smithy/middleware-serde': 2.2.1
- '@smithy/middleware-stack': 2.1.4
- '@smithy/node-config-provider': 2.2.5
- '@smithy/node-http-handler': 2.4.3
- '@smithy/protocol-http': 3.2.2
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- '@smithy/url-parser': 2.1.4
- '@smithy/util-base64': 2.2.1
- '@smithy/util-body-length-browser': 2.1.1
- '@smithy/util-body-length-node': 2.2.2
- '@smithy/util-defaults-mode-browser': 2.1.7
- '@smithy/util-defaults-mode-node': 2.2.7
- '@smithy/util-endpoints': 1.1.5
- '@smithy/util-middleware': 2.1.4
- '@smithy/util-retry': 2.1.4
- '@smithy/util-utf8': 2.2.0
- '@smithy/util-waiter': 2.1.4
- tslib: 2.6.2
- transitivePeerDependencies:
- - aws-crt
-
- '@aws-sdk/client-sso-oidc@3.529.1(@aws-sdk/credential-provider-node@3.529.1)':
- dependencies:
- '@aws-crypto/sha256-browser': 3.0.0
- '@aws-crypto/sha256-js': 3.0.0
- '@aws-sdk/client-sts': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/core': 3.529.1
- '@aws-sdk/credential-provider-node': 3.529.1
- '@aws-sdk/middleware-host-header': 3.523.0
- '@aws-sdk/middleware-logger': 3.523.0
- '@aws-sdk/middleware-recursion-detection': 3.523.0
- '@aws-sdk/middleware-user-agent': 3.525.0
- '@aws-sdk/region-config-resolver': 3.525.0
- '@aws-sdk/types': 3.523.0
- '@aws-sdk/util-endpoints': 3.525.0
- '@aws-sdk/util-user-agent-browser': 3.523.0
- '@aws-sdk/util-user-agent-node': 3.525.0
- '@smithy/config-resolver': 2.1.5
- '@smithy/core': 1.3.8
- '@smithy/fetch-http-handler': 2.4.5
- '@smithy/hash-node': 2.1.4
- '@smithy/invalid-dependency': 2.1.4
- '@smithy/middleware-content-length': 2.1.4
- '@smithy/middleware-endpoint': 2.4.6
- '@smithy/middleware-retry': 2.1.7
- '@smithy/middleware-serde': 2.2.1
- '@smithy/middleware-stack': 2.1.4
- '@smithy/node-config-provider': 2.2.5
- '@smithy/node-http-handler': 2.4.3
- '@smithy/protocol-http': 3.2.2
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- '@smithy/url-parser': 2.1.4
- '@smithy/util-base64': 2.2.1
- '@smithy/util-body-length-browser': 2.1.1
- '@smithy/util-body-length-node': 2.2.2
- '@smithy/util-defaults-mode-browser': 2.1.7
- '@smithy/util-defaults-mode-node': 2.2.7
- '@smithy/util-endpoints': 1.1.5
- '@smithy/util-middleware': 2.1.4
- '@smithy/util-retry': 2.1.4
- '@smithy/util-utf8': 2.2.0
- tslib: 2.6.2
- transitivePeerDependencies:
- - aws-crt
-
- '@aws-sdk/client-sso@3.529.1':
- dependencies:
- '@aws-crypto/sha256-browser': 3.0.0
- '@aws-crypto/sha256-js': 3.0.0
- '@aws-sdk/core': 3.529.1
- '@aws-sdk/middleware-host-header': 3.523.0
- '@aws-sdk/middleware-logger': 3.523.0
- '@aws-sdk/middleware-recursion-detection': 3.523.0
- '@aws-sdk/middleware-user-agent': 3.525.0
- '@aws-sdk/region-config-resolver': 3.525.0
- '@aws-sdk/types': 3.523.0
- '@aws-sdk/util-endpoints': 3.525.0
- '@aws-sdk/util-user-agent-browser': 3.523.0
- '@aws-sdk/util-user-agent-node': 3.525.0
- '@smithy/config-resolver': 2.1.5
- '@smithy/core': 1.3.8
- '@smithy/fetch-http-handler': 2.4.5
- '@smithy/hash-node': 2.1.4
- '@smithy/invalid-dependency': 2.1.4
- '@smithy/middleware-content-length': 2.1.4
- '@smithy/middleware-endpoint': 2.4.6
- '@smithy/middleware-retry': 2.1.7
- '@smithy/middleware-serde': 2.2.1
- '@smithy/middleware-stack': 2.1.4
- '@smithy/node-config-provider': 2.2.5
- '@smithy/node-http-handler': 2.4.3
- '@smithy/protocol-http': 3.2.2
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- '@smithy/url-parser': 2.1.4
- '@smithy/util-base64': 2.2.1
- '@smithy/util-body-length-browser': 2.1.1
- '@smithy/util-body-length-node': 2.2.2
- '@smithy/util-defaults-mode-browser': 2.1.7
- '@smithy/util-defaults-mode-node': 2.2.7
- '@smithy/util-endpoints': 1.1.5
- '@smithy/util-middleware': 2.1.4
- '@smithy/util-retry': 2.1.4
- '@smithy/util-utf8': 2.2.0
- tslib: 2.6.2
- transitivePeerDependencies:
- - aws-crt
-
- '@aws-sdk/client-sts@3.529.1(@aws-sdk/credential-provider-node@3.529.1)':
- dependencies:
- '@aws-crypto/sha256-browser': 3.0.0
- '@aws-crypto/sha256-js': 3.0.0
- '@aws-sdk/core': 3.529.1
- '@aws-sdk/credential-provider-node': 3.529.1
- '@aws-sdk/middleware-host-header': 3.523.0
- '@aws-sdk/middleware-logger': 3.523.0
- '@aws-sdk/middleware-recursion-detection': 3.523.0
- '@aws-sdk/middleware-user-agent': 3.525.0
- '@aws-sdk/region-config-resolver': 3.525.0
- '@aws-sdk/types': 3.523.0
- '@aws-sdk/util-endpoints': 3.525.0
- '@aws-sdk/util-user-agent-browser': 3.523.0
- '@aws-sdk/util-user-agent-node': 3.525.0
- '@smithy/config-resolver': 2.1.5
- '@smithy/core': 1.3.8
- '@smithy/fetch-http-handler': 2.4.5
- '@smithy/hash-node': 2.1.4
- '@smithy/invalid-dependency': 2.1.4
- '@smithy/middleware-content-length': 2.1.4
- '@smithy/middleware-endpoint': 2.4.6
- '@smithy/middleware-retry': 2.1.7
- '@smithy/middleware-serde': 2.2.1
- '@smithy/middleware-stack': 2.1.4
- '@smithy/node-config-provider': 2.2.5
- '@smithy/node-http-handler': 2.4.3
- '@smithy/protocol-http': 3.2.2
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- '@smithy/url-parser': 2.1.4
- '@smithy/util-base64': 2.2.1
- '@smithy/util-body-length-browser': 2.1.1
- '@smithy/util-body-length-node': 2.2.2
- '@smithy/util-defaults-mode-browser': 2.1.7
- '@smithy/util-defaults-mode-node': 2.2.7
- '@smithy/util-endpoints': 1.1.5
- '@smithy/util-middleware': 2.1.4
- '@smithy/util-retry': 2.1.4
- '@smithy/util-utf8': 2.2.0
- tslib: 2.6.2
- transitivePeerDependencies:
- - aws-crt
-
- '@aws-sdk/core@3.529.1':
- dependencies:
- '@smithy/core': 1.3.8
- '@smithy/protocol-http': 3.2.2
- '@smithy/signature-v4': 2.1.4
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- fast-xml-parser: 4.2.5
- tslib: 2.6.2
-
- '@aws-sdk/credential-provider-env@3.523.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/property-provider': 2.1.4
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/credential-provider-http@3.525.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/fetch-http-handler': 2.4.5
- '@smithy/node-http-handler': 2.4.3
- '@smithy/property-provider': 2.1.4
- '@smithy/protocol-http': 3.2.2
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- '@smithy/util-stream': 2.1.5
- tslib: 2.6.2
-
- '@aws-sdk/credential-provider-ini@3.529.1(@aws-sdk/credential-provider-node@3.529.1)':
- dependencies:
- '@aws-sdk/client-sts': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/credential-provider-env': 3.523.0
- '@aws-sdk/credential-provider-process': 3.523.0
- '@aws-sdk/credential-provider-sso': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/credential-provider-web-identity': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/types': 3.523.0
- '@smithy/credential-provider-imds': 2.2.6
- '@smithy/property-provider': 2.1.4
- '@smithy/shared-ini-file-loader': 2.3.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
- transitivePeerDependencies:
- - '@aws-sdk/credential-provider-node'
- - aws-crt
-
- '@aws-sdk/credential-provider-node@3.529.1':
- dependencies:
- '@aws-sdk/credential-provider-env': 3.523.0
- '@aws-sdk/credential-provider-http': 3.525.0
- '@aws-sdk/credential-provider-ini': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/credential-provider-process': 3.523.0
- '@aws-sdk/credential-provider-sso': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/credential-provider-web-identity': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/types': 3.523.0
- '@smithy/credential-provider-imds': 2.2.6
- '@smithy/property-provider': 2.1.4
- '@smithy/shared-ini-file-loader': 2.3.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
- transitivePeerDependencies:
- - aws-crt
-
- '@aws-sdk/credential-provider-process@3.523.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/property-provider': 2.1.4
- '@smithy/shared-ini-file-loader': 2.3.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/credential-provider-sso@3.529.1(@aws-sdk/credential-provider-node@3.529.1)':
- dependencies:
- '@aws-sdk/client-sso': 3.529.1
- '@aws-sdk/token-providers': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/types': 3.523.0
- '@smithy/property-provider': 2.1.4
- '@smithy/shared-ini-file-loader': 2.3.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
- transitivePeerDependencies:
- - '@aws-sdk/credential-provider-node'
- - aws-crt
-
- '@aws-sdk/credential-provider-web-identity@3.529.1(@aws-sdk/credential-provider-node@3.529.1)':
- dependencies:
- '@aws-sdk/client-sts': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/types': 3.523.0
- '@smithy/property-provider': 2.1.4
- '@smithy/types': 2.11.0
- tslib: 2.6.2
- transitivePeerDependencies:
- - '@aws-sdk/credential-provider-node'
- - aws-crt
-
- '@aws-sdk/middleware-host-header@3.523.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/protocol-http': 3.2.2
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/middleware-logger@3.523.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/middleware-recursion-detection@3.523.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/protocol-http': 3.2.2
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/middleware-sdk-route53@3.523.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/middleware-user-agent@3.525.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@aws-sdk/util-endpoints': 3.525.0
- '@smithy/protocol-http': 3.2.2
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/region-config-resolver@3.525.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/node-config-provider': 2.2.5
- '@smithy/types': 2.11.0
- '@smithy/util-config-provider': 2.2.1
- '@smithy/util-middleware': 2.1.4
- tslib: 2.6.2
-
- '@aws-sdk/token-providers@3.529.1(@aws-sdk/credential-provider-node@3.529.1)':
- dependencies:
- '@aws-sdk/client-sso-oidc': 3.529.1(@aws-sdk/credential-provider-node@3.529.1)
- '@aws-sdk/types': 3.523.0
- '@smithy/property-provider': 2.1.4
- '@smithy/shared-ini-file-loader': 2.3.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
- transitivePeerDependencies:
- - '@aws-sdk/credential-provider-node'
- - aws-crt
-
- '@aws-sdk/types@3.523.0':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/util-endpoints@3.525.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/types': 2.11.0
- '@smithy/util-endpoints': 1.1.5
- tslib: 2.6.2
-
- '@aws-sdk/util-locate-window@3.495.0':
- dependencies:
- tslib: 2.6.2
-
- '@aws-sdk/util-user-agent-browser@3.523.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/types': 2.11.0
- bowser: 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/util-user-agent-node@3.525.0':
- dependencies:
- '@aws-sdk/types': 3.523.0
- '@smithy/node-config-provider': 2.2.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@aws-sdk/util-utf8-browser@3.259.0':
- dependencies:
- tslib: 2.6.2
-
- '@aws-sdk/xml-builder@3.523.0':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@fastify/busboy@2.1.1': {}
-
- '@octokit/auth-token@4.0.0': {}
-
- '@octokit/core@5.1.0':
- dependencies:
- '@octokit/auth-token': 4.0.0
- '@octokit/graphql': 7.0.2
- '@octokit/request': 8.2.0
- '@octokit/request-error': 5.0.1
- '@octokit/types': 12.6.0
- before-after-hook: 2.2.3
- universal-user-agent: 6.0.1
-
- '@octokit/endpoint@9.0.4':
- dependencies:
- '@octokit/types': 12.6.0
- universal-user-agent: 6.0.1
-
- '@octokit/graphql@7.0.2':
- dependencies:
- '@octokit/request': 8.2.0
- '@octokit/types': 12.6.0
- universal-user-agent: 6.0.1
-
- '@octokit/openapi-types@20.0.0': {}
-
- '@octokit/plugin-paginate-rest@9.2.1(@octokit/core@5.1.0)':
- dependencies:
- '@octokit/core': 5.1.0
- '@octokit/types': 12.6.0
-
- '@octokit/plugin-request-log@4.0.1(@octokit/core@5.1.0)':
- dependencies:
- '@octokit/core': 5.1.0
-
- '@octokit/plugin-rest-endpoint-methods@10.4.1(@octokit/core@5.1.0)':
- dependencies:
- '@octokit/core': 5.1.0
- '@octokit/types': 12.6.0
-
- '@octokit/request-error@5.0.1':
- dependencies:
- '@octokit/types': 12.6.0
- deprecation: 2.3.1
- once: 1.4.0
-
- '@octokit/request@8.2.0':
- dependencies:
- '@octokit/endpoint': 9.0.4
- '@octokit/request-error': 5.0.1
- '@octokit/types': 12.6.0
- universal-user-agent: 6.0.1
-
- '@octokit/rest@20.0.2':
- dependencies:
- '@octokit/core': 5.1.0
- '@octokit/plugin-paginate-rest': 9.2.1(@octokit/core@5.1.0)
- '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.1.0)
- '@octokit/plugin-rest-endpoint-methods': 10.4.1(@octokit/core@5.1.0)
-
- '@octokit/types@12.6.0':
- dependencies:
- '@octokit/openapi-types': 20.0.0
-
- '@smithy/abort-controller@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/config-resolver@2.1.5':
- dependencies:
- '@smithy/node-config-provider': 2.2.5
- '@smithy/types': 2.11.0
- '@smithy/util-config-provider': 2.2.1
- '@smithy/util-middleware': 2.1.4
- tslib: 2.6.2
-
- '@smithy/core@1.3.8':
- dependencies:
- '@smithy/middleware-endpoint': 2.4.6
- '@smithy/middleware-retry': 2.1.7
- '@smithy/middleware-serde': 2.2.1
- '@smithy/protocol-http': 3.2.2
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- '@smithy/util-middleware': 2.1.4
- tslib: 2.6.2
-
- '@smithy/credential-provider-imds@2.2.6':
- dependencies:
- '@smithy/node-config-provider': 2.2.5
- '@smithy/property-provider': 2.1.4
- '@smithy/types': 2.11.0
- '@smithy/url-parser': 2.1.4
- tslib: 2.6.2
-
- '@smithy/eventstream-codec@2.1.4':
- dependencies:
- '@aws-crypto/crc32': 3.0.0
- '@smithy/types': 2.11.0
- '@smithy/util-hex-encoding': 2.1.1
- tslib: 2.6.2
-
- '@smithy/fetch-http-handler@2.4.5':
- dependencies:
- '@smithy/protocol-http': 3.2.2
- '@smithy/querystring-builder': 2.1.4
- '@smithy/types': 2.11.0
- '@smithy/util-base64': 2.2.1
- tslib: 2.6.2
-
- '@smithy/hash-node@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
- '@smithy/util-buffer-from': 2.1.1
- '@smithy/util-utf8': 2.2.0
- tslib: 2.6.2
-
- '@smithy/invalid-dependency@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/is-array-buffer@2.1.1':
- dependencies:
- tslib: 2.6.2
-
- '@smithy/middleware-content-length@2.1.4':
- dependencies:
- '@smithy/protocol-http': 3.2.2
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/middleware-endpoint@2.4.6':
- dependencies:
- '@smithy/middleware-serde': 2.2.1
- '@smithy/node-config-provider': 2.2.5
- '@smithy/shared-ini-file-loader': 2.3.5
- '@smithy/types': 2.11.0
- '@smithy/url-parser': 2.1.4
- '@smithy/util-middleware': 2.1.4
- tslib: 2.6.2
-
- '@smithy/middleware-retry@2.1.7':
- dependencies:
- '@smithy/node-config-provider': 2.2.5
- '@smithy/protocol-http': 3.2.2
- '@smithy/service-error-classification': 2.1.4
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- '@smithy/util-middleware': 2.1.4
- '@smithy/util-retry': 2.1.4
- tslib: 2.6.2
- uuid: 8.3.2
-
- '@smithy/middleware-serde@2.2.1':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/middleware-stack@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/node-config-provider@2.2.5':
- dependencies:
- '@smithy/property-provider': 2.1.4
- '@smithy/shared-ini-file-loader': 2.3.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/node-http-handler@2.4.3':
- dependencies:
- '@smithy/abort-controller': 2.1.4
- '@smithy/protocol-http': 3.2.2
- '@smithy/querystring-builder': 2.1.4
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/property-provider@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/protocol-http@3.2.2':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/querystring-builder@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
- '@smithy/util-uri-escape': 2.1.1
- tslib: 2.6.2
-
- '@smithy/querystring-parser@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/service-error-classification@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
-
- '@smithy/shared-ini-file-loader@2.3.5':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/signature-v4@2.1.4':
- dependencies:
- '@smithy/eventstream-codec': 2.1.4
- '@smithy/is-array-buffer': 2.1.1
- '@smithy/types': 2.11.0
- '@smithy/util-hex-encoding': 2.1.1
- '@smithy/util-middleware': 2.1.4
- '@smithy/util-uri-escape': 2.1.1
- '@smithy/util-utf8': 2.2.0
- tslib: 2.6.2
-
- '@smithy/smithy-client@2.4.5':
- dependencies:
- '@smithy/middleware-endpoint': 2.4.6
- '@smithy/middleware-stack': 2.1.4
- '@smithy/protocol-http': 3.2.2
- '@smithy/types': 2.11.0
- '@smithy/util-stream': 2.1.5
- tslib: 2.6.2
-
- '@smithy/types@2.11.0':
- dependencies:
- tslib: 2.6.2
-
- '@smithy/url-parser@2.1.4':
- dependencies:
- '@smithy/querystring-parser': 2.1.4
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/util-base64@2.2.1':
- dependencies:
- '@smithy/util-buffer-from': 2.1.1
- '@smithy/util-utf8': 2.2.0
- tslib: 2.6.2
-
- '@smithy/util-body-length-browser@2.1.1':
- dependencies:
- tslib: 2.6.2
-
- '@smithy/util-body-length-node@2.2.2':
- dependencies:
- tslib: 2.6.2
-
- '@smithy/util-buffer-from@2.1.1':
- dependencies:
- '@smithy/is-array-buffer': 2.1.1
- tslib: 2.6.2
-
- '@smithy/util-config-provider@2.2.1':
- dependencies:
- tslib: 2.6.2
-
- '@smithy/util-defaults-mode-browser@2.1.7':
- dependencies:
- '@smithy/property-provider': 2.1.4
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- bowser: 2.11.0
- tslib: 2.6.2
-
- '@smithy/util-defaults-mode-node@2.2.7':
- dependencies:
- '@smithy/config-resolver': 2.1.5
- '@smithy/credential-provider-imds': 2.2.6
- '@smithy/node-config-provider': 2.2.5
- '@smithy/property-provider': 2.1.4
- '@smithy/smithy-client': 2.4.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/util-endpoints@1.1.5':
- dependencies:
- '@smithy/node-config-provider': 2.2.5
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/util-hex-encoding@2.1.1':
- dependencies:
- tslib: 2.6.2
-
- '@smithy/util-middleware@2.1.4':
- dependencies:
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/util-retry@2.1.4':
- dependencies:
- '@smithy/service-error-classification': 2.1.4
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- '@smithy/util-stream@2.1.5':
- dependencies:
- '@smithy/fetch-http-handler': 2.4.5
- '@smithy/node-http-handler': 2.4.3
- '@smithy/types': 2.11.0
- '@smithy/util-base64': 2.2.1
- '@smithy/util-buffer-from': 2.1.1
- '@smithy/util-hex-encoding': 2.1.1
- '@smithy/util-utf8': 2.2.0
- tslib: 2.6.2
-
- '@smithy/util-uri-escape@2.1.1':
- dependencies:
- tslib: 2.6.2
-
- '@smithy/util-utf8@2.2.0':
- dependencies:
- '@smithy/util-buffer-from': 2.1.1
- tslib: 2.6.2
-
- '@smithy/util-waiter@2.1.4':
- dependencies:
- '@smithy/abort-controller': 2.1.4
- '@smithy/types': 2.11.0
- tslib: 2.6.2
-
- before-after-hook@2.2.3: {}
-
- bowser@2.11.0: {}
-
- deprecation@2.3.1: {}
-
- fast-xml-parser@4.2.5:
- dependencies:
- strnum: 1.0.5
-
- once@1.4.0:
- dependencies:
- wrappy: 1.0.2
-
- strnum@1.0.5: {}
-
- tslib@1.14.1: {}
-
- tslib@2.6.2: {}
-
- tunnel@0.0.6: {}
-
- undici@5.28.3:
- dependencies:
- '@fastify/busboy': 2.1.1
-
- universal-user-agent@6.0.1: {}
-
- uuid@8.3.2: {}
-
- wrappy@1.0.2: {}
diff --git a/.github/scripts/crib/pr-comment-crib-env.js b/.github/scripts/crib/pr-comment-crib-env.js
deleted file mode 100755
index cc36a9deb7..0000000000
--- a/.github/scripts/crib/pr-comment-crib-env.js
+++ /dev/null
@@ -1,145 +0,0 @@
-#!/usr/bin/env node
-
-import * as core from "@actions/core";
-import * as github from "@actions/github";
-import { route53RecordsExist } from "./lib/check-route53-records.js";
-
-function generateSubdomains(subdomainPrefix, prNumber) {
- const subDomainSuffixes = [
- "node1",
- "node2",
- "node3",
- "node4",
- "node5",
- "geth-1337-http",
- "geth-1337-ws",
- "geth-2337-http",
- "geth-2337-ws",
- "mockserver",
- ];
- return subDomainSuffixes.map(
- (suffix) => `${subdomainPrefix}-${prNumber}-${suffix}`
- );
-}
-
-async function commentExists(octokit, owner, repo, prNumber, uniqueIdentifier) {
- // This will automatically paginate through all comments
- const comments = await octokit.paginate(octokit.rest.issues.listComments, {
- owner,
- repo,
- issue_number: prNumber,
- });
-
- // Check each comment for the unique identifier
- return comments.some((comment) => comment.body.includes(uniqueIdentifier));
-}
-
-async function run() {
- try {
- const token = process.env.GITHUB_TOKEN;
- const route53ZoneId = process.env.ROUTE53_ZONE_ID;
- const subdomainPrefix = process.env.SUBDOMAIN_PREFIX || "crib-chainlink";
-
- // Check for the existence of GITHUB_TOKEN and ROUTE53_ZONE_ID
- if (!token || !route53ZoneId) {
- core.setFailed(
- "Error: Missing required environment variables: GITHUB_TOKEN or ROUTE53_ZONE_ID."
- );
- return;
- }
-
- const octokit = github.getOctokit(token);
- const context = github.context;
-
- const labelsToCheck = ["crib"];
- const { owner, repo } = context.repo;
- const prNumber = context.issue.number;
-
- if (!prNumber) {
- core.setFailed("Error: Could not get PR number from context");
- return;
- }
-
- // List labels on the PR
- const { data: labels } = await octokit.rest.issues.listLabelsOnIssue({
- owner,
- repo,
- issue_number: prNumber,
- });
-
- // Check if any label matches the labelsToCheck
- const labelMatches = labels.some((label) =>
- labelsToCheck.includes(label.name)
- );
-
- if (!labelMatches) {
- core.info("No 'crib' PR label found. Proceeding.");
- return;
- }
-
- const subdomains = generateSubdomains(subdomainPrefix, prNumber);
- core.debug("Subdomains:", subdomains);
-
- // Comment header and unique identifier
- const commentHeader = "## CRIB Environment Details";
-
- // Check if the comment already exists
- if (await commentExists(octokit, owner, repo, prNumber, commentHeader)) {
- core.info("CRIB environment comment already exists. Skipping.");
- return;
- }
-
- // Check if DNS records exist in Route 53 before printing out the subdomains.
- try {
- const maxRetries = 8;
- const recordsExist = await route53RecordsExist(
- route53ZoneId,
- subdomains,
- maxRetries
- );
- if (recordsExist) {
- core.info("Route 53 DNS records exist.");
- } else {
- core.setFailed(
- "Route 53 DNS records do not exist. Please check the Route 53 hosted zone."
- );
- return;
- }
- } catch (error) {
- core.setFailed(error.message);
- return;
- }
-
- const subdomainsFormatted = subdomains
- .map((subdomain) => `- ${subdomain}.`)
- .join("\n");
-
- // Construct the comment
- const comment = `${commentHeader} :information_source:
-
-CRIB activated via the 'crib' label. To destroy the environment, remove the 'crib' PR label or close the PR.
-
-Please review the following details:
-
-### Subdomains
-
-_Use these subdomains to access the CRIB environment. They are prefixes to the internal base domain which work over the VPN._
-
-${subdomainsFormatted}
-
-**NOTE:** If you have trouble resolving these subdomains, please try to reset your VPN DNS and/or local DNS.
-`;
-
- // Create a comment on the PR
- await octokit.rest.issues.createComment({
- owner,
- repo,
- issue_number: prNumber,
- body: comment,
- });
- } catch (error) {
- core.setFailed(error.message);
- }
-}
-
-run();
diff --git a/.github/scripts/crib/test.js b/.github/scripts/crib/test.js
deleted file mode 100644
index be804a8d46..0000000000
--- a/.github/scripts/crib/test.js
+++ /dev/null
@@ -1,13 +0,0 @@
-import { route53RecordsExist } from "./lib/check-route53-records.js";
-
-// Example usage
-const hostedZoneId = "Z0701115F9JUQY0J2ISL"; // Your hosted zone ID here
-const recordNames = [
- "cname-crib-chainlink-11635-geth-ws.",
- "crib-chainlink-11635-node4.",
-]; // DNS record names you want to check
-const maxRetries = 3; // Maximum number of retries
-
-route53RecordsExist(hostedZoneId, recordNames, maxRetries)
- .then((result) => console.log("Records exist:", result))
- .catch((error) => console.error("Error:", error));
diff --git a/.github/workflows/pr-labels.yml b/.github/workflows/pr-labels.yml
deleted file mode 100644
index 766218bfa2..0000000000
--- a/.github/workflows/pr-labels.yml
+++ /dev/null
@@ -1,47 +0,0 @@
-name: PR Labels
-
-on:
- pull_request:
- types: [labeled]
-
-jobs:
- crib:
- runs-on: ubuntu-latest
- permissions:
- # For AWS assume role.
- id-token: write
- contents: read
- # To comment on PR's.
- issues: write
- pull-requests: write
- steps:
- - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2
-
- - uses: pnpm/action-setup@a3252b78c470c02df07e9d59298aecedc3ccdd6d # v3.0.0
- with:
- version: ^9.0.0
-
- - uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2
- with:
- node-version: 20
- cache: pnpm
- cache-dependency-path: ./.github/scripts/crib/pnpm-lock.yaml
-
- - run: pnpm install
- working-directory: ./.github/scripts/crib
-
- - name: Assume role capable of dispatching action
- uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2
- with:
- role-to-assume: ${{ secrets.AWS_OIDC_CRIB_ROLE_ARN_SAND }}
- aws-region: ${{ secrets.AWS_REGION }}
- role-duration-seconds: 900
- mask-aws-account-id: true
- role-session-name: pr-labels.crib
-
- - name: Comment CRIB details on PR
- run: ./.github/scripts/crib/pr-comment-crib-env.js
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- ROUTE53_ZONE_ID: ${{ secrets.ROUTE53_ZONE_ID_SAND }}
- SUBDOMAIN_PREFIX: crib-ccip
From 59ac4e4581be5b33c8b34a984cbfab94e292e0f1 Mon Sep 17 00:00:00 2001
From: Ryan <80392855+RayXpub@users.noreply.github.com>
Date: Thu, 1 Aug 2024 22:50:37 +0400
Subject: [PATCH 17/28] Add missing type and version (#1243)
## Motivation
`NonceManager` and `MultiAggregateRateLimiter` contracts were missing
`typeAndVersion`.
## Solution
Add `ITypeAndVersion` inheritance to both contracts.
---
contracts/gas-snapshots/ccip.gas-snapshot | 57 ++++++++++---------
.../v0.8/ccip/MultiAggregateRateLimiter.sol | 5 +-
contracts/src/v0.8/ccip/NonceManager.sol | 5 +-
.../src/v0.8/ccip/test/NonceManager.t.sol | 13 +++++
.../MultiAggregateRateLimiter.t.sol | 1 +
.../multi_aggregate_rate_limiter.go | 28 ++++++++-
.../generated/nonce_manager/nonce_manager.go | 28 ++++++++-
...rapper-dependency-versions-do-not-edit.txt | 4 +-
8 files changed, 105 insertions(+), 36 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 1fdf7e27d9..9d31647634 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -142,8 +142,8 @@ EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 15662)
EVM2EVMMultiOffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 67195)
EVM2EVMMultiOffRamp_commit:test_InvalidInterval_Revert() (gas: 59698)
EVM2EVMMultiOffRamp_commit:test_InvalidRootRevert() (gas: 58778)
-EVM2EVMMultiOffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6394741)
-EVM2EVMMultiOffRamp_commit:test_NoConfig_Revert() (gas: 5977968)
+EVM2EVMMultiOffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6394807)
+EVM2EVMMultiOffRamp_commit:test_NoConfig_Revert() (gas: 5978034)
EVM2EVMMultiOffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 106229)
EVM2EVMMultiOffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 116228)
EVM2EVMMultiOffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 106272)
@@ -156,7 +156,7 @@ EVM2EVMMultiOffRamp_commit:test_StaleReportWithRoot_Success() (gas: 227807)
EVM2EVMMultiOffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 117527)
EVM2EVMMultiOffRamp_commit:test_Unhealthy_Revert() (gas: 77605)
EVM2EVMMultiOffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 207057)
-EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6389130)
+EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6389196)
EVM2EVMMultiOffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 47785)
EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5980336)
EVM2EVMMultiOffRamp_constructor:test_SourceChainSelector_Revert() (gas: 157326)
@@ -169,12 +169,12 @@ EVM2EVMMultiOffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17280)
EVM2EVMMultiOffRamp_execute:test_LargeBatch_Success() (gas: 1559406)
EVM2EVMMultiOffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 342924)
EVM2EVMMultiOffRamp_execute:test_MultipleReports_Success() (gas: 260178)
-EVM2EVMMultiOffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6445247)
-EVM2EVMMultiOffRamp_execute:test_NoConfig_Revert() (gas: 6028193)
+EVM2EVMMultiOffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6445313)
+EVM2EVMMultiOffRamp_execute:test_NoConfig_Revert() (gas: 6028259)
EVM2EVMMultiOffRamp_execute:test_NonArray_Revert() (gas: 27681)
EVM2EVMMultiOffRamp_execute:test_SingleReport_Success() (gas: 165181)
EVM2EVMMultiOffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 149137)
-EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6807322)
+EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6807388)
EVM2EVMMultiOffRamp_execute:test_ZeroReports_Revert() (gas: 17154)
EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18413)
EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 249346)
@@ -526,42 +526,42 @@ MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfi
MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_UpdateExistingConfig_Success() (gas: 53092)
MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroChainSelector_Revert() (gas: 17019)
MultiAggregateRateLimiter_applyRateLimiterConfigUpdates:test_ZeroConfigs_Success() (gas: 12295)
-MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 1971805)
-MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2085252)
+MultiAggregateRateLimiter_constructor:test_ConstructorNoAuthorizedCallers_Success() (gas: 2006714)
+MultiAggregateRateLimiter_constructor:test_Constructor_Success() (gas: 2122927)
MultiAggregateRateLimiter_getTokenBucket:test_GetTokenBucket_Success() (gas: 30248)
MultiAggregateRateLimiter_getTokenBucket:test_Refill_Success() (gas: 47358)
MultiAggregateRateLimiter_getTokenBucket:test_TimeUnderflow_Revert() (gas: 15821)
-MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 19668)
-MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21253)
+MultiAggregateRateLimiter_getTokenValue:test_GetTokenValue_Success() (gas: 19690)
+MultiAggregateRateLimiter_getTokenValue:test_NoTokenPrice_Reverts() (gas: 21275)
MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 14527)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 189450)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 59927)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 189472)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 59949)
MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 17593)
MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitDisabled_Success() (gas: 44895)
MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitExceeded_Revert() (gas: 50598)
MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithRateLimitReset_Success() (gas: 78780)
-MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 263510)
+MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 263532)
MultiAggregateRateLimiter_onInboundMessage:test_ValidateMessageWithTokens_Success() (gas: 54784)
MultiAggregateRateLimiter_onOutboundMessage:test_RateLimitValueDifferentLanes_Success() (gas: 9223372036854754743)
MultiAggregateRateLimiter_onOutboundMessage:test_ValidateMessageWithNoTokens_Success() (gas: 19104)
MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageFromUnauthorizedCaller_Revert() (gas: 15778)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 189438)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 61662)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDifferentTokensOnDifferentChains_Success() (gas: 189460)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithDisabledRateLimitToken_Success() (gas: 61684)
MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitDisabled_Success() (gas: 46683)
MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitExceeded_Revert() (gas: 52371)
MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithRateLimitReset_Success() (gas: 79845)
-MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 263724)
+MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokensOnDifferentChains_Success() (gas: 263746)
MultiAggregateRateLimiter_onOutboundMessage:test_onOutboundMessage_ValidateMessageWithTokens_Success() (gas: 56541)
-MultiAggregateRateLimiter_setPriceRegistry:test_OnlyOwner_Revert() (gas: 11336)
-MultiAggregateRateLimiter_setPriceRegistry:test_Owner_Success() (gas: 19124)
-MultiAggregateRateLimiter_setPriceRegistry:test_ZeroAddress_Revert() (gas: 10608)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 16085)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 225643)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 200192)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 162053)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 28509)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 17430)
-MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 17485)
+MultiAggregateRateLimiter_setPriceRegistry:test_OnlyOwner_Revert() (gas: 11358)
+MultiAggregateRateLimiter_setPriceRegistry:test_Owner_Success() (gas: 19146)
+MultiAggregateRateLimiter_setPriceRegistry:test_ZeroAddress_Revert() (gas: 10630)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_NonOwner_Revert() (gas: 16107)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensMultipleChains_Success() (gas: 225533)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokensSingleChain_Success() (gas: 200148)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_AddsAndRemoves_Success() (gas: 162036)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_UpdateRateLimitTokens_RemoveNonExistentToken_Success() (gas: 28465)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroDestToken_Revert() (gas: 17452)
+MultiAggregateRateLimiter_updateRateLimitTokens:test_ZeroSourceToken_Revert() (gas: 17507)
MultiOCR3Base_setOCR3Configs:test_FMustBePositive_Revert() (gas: 59331)
MultiOCR3Base_setOCR3Configs:test_FTooHigh_Revert() (gas: 44298)
MultiOCR3Base_setOCR3Configs:test_RepeatSignerAddress_Revert() (gas: 283711)
@@ -609,12 +609,13 @@ NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas
NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 237762)
NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 125070)
NonceManager_OnRampUpgrade:test_Upgrade_Success() (gas: 125923)
-NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 122899)
+NonceManager_applyPreviousRampsUpdates:test_MultipleRampsUpdates() (gas: 122943)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOffRamp_Revert() (gas: 42959)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRampAndOffRamp_Revert() (gas: 64282)
NonceManager_applyPreviousRampsUpdates:test_PreviousRampAlreadySetOnRamp_Revert() (gas: 42823)
-NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66548)
+NonceManager_applyPreviousRampsUpdates:test_SingleRampUpdate() (gas: 66570)
NonceManager_applyPreviousRampsUpdates:test_ZeroInput() (gas: 12025)
+NonceManager_typeAndVersion:test_typeAndVersion() (gas: 9675)
OCR2BaseNoChecks_setOCR2Config:test_FMustBePositive_Revert() (gas: 12171)
OCR2BaseNoChecks_setOCR2Config:test_RepeatAddress_Revert() (gas: 42233)
OCR2BaseNoChecks_setOCR2Config:test_SetConfigSuccess_gas() (gas: 84124)
diff --git a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
index 2a9d087a26..4252d0defd 100644
--- a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
+++ b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
+import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol";
import {IMessageInterceptor} from "./interfaces/IMessageInterceptor.sol";
import {IPriceRegistry} from "./interfaces/IPriceRegistry.sol";
@@ -17,7 +18,7 @@ import {EnumerableSet} from "./../vendor/openzeppelin-solidity/v4.7.3/contracts/
/// token transfers, using a price registry to convert to a numeraire asset (e.g. USD).
/// The contract is a standalone multi-lane message validator contract, which can be called by authorized
/// ramp contracts to apply rate limit changes to lanes, and revert when the rate limits get breached.
-contract MultiAggregateRateLimiter is IMessageInterceptor, AuthorizedCallers {
+contract MultiAggregateRateLimiter is IMessageInterceptor, AuthorizedCallers, ITypeAndVersion {
using RateLimiter for RateLimiter.TokenBucket;
using USDPriceWith18Decimals for uint224;
using EnumerableMapAddresses for EnumerableMapAddresses.AddressToBytes32Map;
@@ -57,6 +58,8 @@ contract MultiAggregateRateLimiter is IMessageInterceptor, AuthorizedCallers {
RateLimiter.TokenBucket outboundLaneBucket; // Bucket for the outbound lane (local -> remote)
}
+ string public constant override typeAndVersion = "MultiAggregateRateLimiter 1.6.0-dev";
+
/// @dev Tokens that should be included in Aggregate Rate Limiting (from local chain (this chain) -> remote),
/// grouped per-remote chain.
mapping(uint64 remoteChainSelector => EnumerableMapAddresses.AddressToBytes32Map tokensLocalToRemote) internal
diff --git a/contracts/src/v0.8/ccip/NonceManager.sol b/contracts/src/v0.8/ccip/NonceManager.sol
index 2cfcbbe9e2..de9b9ce4a3 100644
--- a/contracts/src/v0.8/ccip/NonceManager.sol
+++ b/contracts/src/v0.8/ccip/NonceManager.sol
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.24;
+import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol";
import {IEVM2AnyOnRamp} from "./interfaces/IEVM2AnyOnRamp.sol";
import {INonceManager} from "./interfaces/INonceManager.sol";
@@ -8,7 +9,7 @@ import {AuthorizedCallers} from "../shared/access/AuthorizedCallers.sol";
/// @title NonceManager
/// @notice NonceManager contract that manages sender nonces for the on/off ramps
-contract NonceManager is INonceManager, AuthorizedCallers {
+contract NonceManager is INonceManager, AuthorizedCallers, ITypeAndVersion {
error PreviousRampAlreadySet();
event PreviousRampsUpdated(uint64 indexed remoteChainSelector, PreviousRamps prevRamp);
@@ -27,6 +28,8 @@ contract NonceManager is INonceManager, AuthorizedCallers {
PreviousRamps prevRamps; // Previous on/off ramps
}
+ string public constant override typeAndVersion = "NonceManager 1.6.0-dev";
+
/// @dev previous ramps
mapping(uint64 chainSelector => PreviousRamps previousRamps) private s_previousRamps;
/// @dev The current outbound nonce per sender used on the onramp
diff --git a/contracts/src/v0.8/ccip/test/NonceManager.t.sol b/contracts/src/v0.8/ccip/test/NonceManager.t.sol
index 92ea1f221d..6ba08597ca 100644
--- a/contracts/src/v0.8/ccip/test/NonceManager.t.sol
+++ b/contracts/src/v0.8/ccip/test/NonceManager.t.sol
@@ -18,6 +18,19 @@ import {EVM2EVMOnRampHelper} from "./helpers/EVM2EVMOnRampHelper.sol";
import {MockCommitStore} from "./mocks/MockCommitStore.sol";
import {EVM2EVMMultiOffRampSetup} from "./offRamp/EVM2EVMMultiOffRampSetup.t.sol";
import {EVM2EVMMultiOnRampSetup} from "./onRamp/EVM2EVMMultiOnRampSetup.t.sol";
+import {Test} from "forge-std/Test.sol";
+
+contract NonceManager_typeAndVersion is Test {
+ NonceManager private s_nonceManager;
+
+ function setUp() public {
+ s_nonceManager = new NonceManager(new address[](0));
+ }
+
+ function test_typeAndVersion() public {
+ assertEq(s_nonceManager.typeAndVersion(), "NonceManager 1.6.0-dev");
+ }
+}
contract NonceManager_NonceIncrementation is BaseTest {
NonceManager private s_nonceManager;
diff --git a/contracts/src/v0.8/ccip/test/rateLimiter/MultiAggregateRateLimiter.t.sol b/contracts/src/v0.8/ccip/test/rateLimiter/MultiAggregateRateLimiter.t.sol
index 2bd31452f0..dd1698288b 100644
--- a/contracts/src/v0.8/ccip/test/rateLimiter/MultiAggregateRateLimiter.t.sol
+++ b/contracts/src/v0.8/ccip/test/rateLimiter/MultiAggregateRateLimiter.t.sol
@@ -136,6 +136,7 @@ contract MultiAggregateRateLimiter_constructor is MultiAggregateRateLimiterSetup
assertEq(OWNER, s_rateLimiter.owner());
assertEq(address(s_priceRegistry), s_rateLimiter.getPriceRegistry());
+ assertEq(s_rateLimiter.typeAndVersion(), "MultiAggregateRateLimiter 1.6.0-dev");
}
}
diff --git a/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go b/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go
index 9fca2d1d36..910fbfb76f 100644
--- a/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go
+++ b/core/gethwrappers/ccip/generated/multi_aggregate_rate_limiter/multi_aggregate_rate_limiter.go
@@ -87,8 +87,8 @@ type RateLimiterTokenBucket struct {
}
var MultiAggregateRateLimiterMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"authorizedCallers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"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\":\"newPriceRegistry\",\"type\":\"address\"}],\"name\":\"PriceRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isOutboundLane\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"RateLimiterConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"remoteToken\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isOutboundLane\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structMultiAggregateRateLimiter.RateLimiterConfigArgs[]\",\"name\":\"rateLimiterUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applyRateLimiterConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isOutboundLane\",\"type\":\"bool\"}],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"localTokens\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"remoteTokens\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPriceRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"onInboundMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"onOutboundMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPriceRegistry\",\"type\":\"address\"}],\"name\":\"setPriceRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken\",\"name\":\"localTokenArgs\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"remoteToken\",\"type\":\"bytes32\"}],\"internalType\":\"structMultiAggregateRateLimiter.RateLimitTokenArgs[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60806040523480156200001157600080fd5b5060405162002e2f38038062002e2f833981016040819052620000349162000538565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000102565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620001ad565b50620000fa82620002fc565b50506200066f565b336001600160a01b038216036200015c5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b81518110156200023d576000828281518110620001d657620001d662000621565b60209081029190910101519050620001f060028262000378565b1562000233576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620001b5565b50815160005b8151811015620002f657600082828151811062000264576200026462000621565b6020026020010151905060006001600160a01b0316816001600160a01b031603620002a2576040516342bcdf7f60e11b815260040160405180910390fd5b620002af60028262000398565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000243565b50505050565b6001600160a01b03811662000324576040516342bcdf7f60e11b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fdeaac1a8daeabcc5254b10b54edf3678fdfcd1cea89fe9d364b6285f6ace2df99060200160405180910390a150565b60006200038f836001600160a01b038416620003af565b90505b92915050565b60006200038f836001600160a01b038416620004b3565b60008181526001830160205260408120548015620004a8576000620003d660018362000637565b8554909150600090620003ec9060019062000637565b90508181146200045857600086600001828154811062000410576200041062000621565b906000526020600020015490508087600001848154811062000436576200043662000621565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200046c576200046c62000659565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000392565b600091505062000392565b6000818152600183016020526040812054620004fc5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000392565b50600062000392565b80516001600160a01b03811681146200051d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200054c57600080fd5b620005578362000505565b602084810151919350906001600160401b03808211156200057757600080fd5b818601915086601f8301126200058c57600080fd5b815181811115620005a157620005a162000522565b8060051b604051601f19603f83011681018181108582111715620005c957620005c962000522565b604052918252848201925083810185019189831115620005e857600080fd5b938501935b828510156200061157620006018562000505565b84529385019392850192620005ed565b8096505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b818103818111156200039257634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6127b0806200067f6000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806379ba50971161008c57806391a2749a1161006657806391a2749a14610232578063e0a0e50614610245578063f2fde38b14610258578063fe843cd01461026b57600080fd5b806379ba5097146101f95780637c8b5e9a146102015780638da5cb5b1461021457600080fd5b80632451a627116100bd5780632451a627146101b0578063508ee9de146101c5578063537e304e146101d857600080fd5b806308d450a1146100e45780630a35bcc4146100f95780630d6c107e14610171575b600080fd5b6100f76100f2366004611ef5565b61027e565b005b61010c610107366004611fd5565b61029d565b604051610168919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60405180910390f35b60055473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610168565b6101b8610362565b604051610168919061205a565b6100f76101d336600461206d565b610373565b6101eb6101e6366004612088565b610384565b6040516101689291906120a3565b6100f76104e7565b6100f761020f3660046121c4565b6105e9565b60005473ffffffffffffffffffffffffffffffffffffffff1661018b565b6100f76102403660046122f5565b610838565b6100f7610253366004612386565b610849565b6100f761026636600461206d565b6108be565b6100f76102793660046123fb565b6108cf565b610286610c0e565b61029a816020015182608001516000610c53565b50565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526103596102d58484610d2a565b6040805160a08101825282546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff16151593830193909352600190930154808316606083015292909204166080820152610d5a565b90505b92915050565b606061036e6002610e0c565b905090565b61037b610e20565b61029a81610ea1565b67ffffffffffffffff8116600090815260046020526040812060609182916103ab90610f67565b90508067ffffffffffffffff8111156103c6576103c6611c66565b6040519080825280602002602001820160405280156103ef578160200160208202803683370190505b5092508067ffffffffffffffff81111561040b5761040b611c66565b604051908082528060200260200182016040528015610434578160200160208202803683370190505b50915060005b818110156104e05767ffffffffffffffff8516600090815260046020526040812081906104679084610f72565b915091508186848151811061047e5761047e61252f565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050808584815181106104cb576104cb61252f565b6020908102919091010152505060010161043a565b5050915091565b60015473ffffffffffffffffffffffffffffffffffffffff16331461056d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6105f1610e20565b60005b82518110156106cf5760008382815181106106115761061161252f565b602002602001015160200151905060008483815181106106335761063361252f565b6020908102919091018101515167ffffffffffffffff81166000908152600490925260409091209091506106679083610f90565b156106c5576040805167ffffffffffffffff8316815273ffffffffffffffffffffffffffffffffffffffff841660208201527f530cabd30786b7235e124a6c0db77e0b685ef22813b1fe87554247f404eb8ed6910160405180910390a15b50506001016105f4565b5060005b81518110156108335760008282815181106106f0576106f061252f565b602002602001015160000151905060008383815181106107125761071261252f565b6020026020010151602001519050600082602001519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610762575081155b15610799576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825167ffffffffffffffff811660009081526004602052604090206107bf908385610fb2565b15610824576040805167ffffffffffffffff831681526020810185905273ffffffffffffffffffffffffffffffffffffffff84168183015290517ffd96f5ca8894a9584abba5645131a95480f9340bd5e0046ceff789111ff16c6d9181900360600190a15b505050508060010190506106d3565b505050565b610840610e20565b61029a81610fdd565b610851610c0e565b6108ba82610862604084018461255e565b808060200260200160405190810160405280939291908181526020016000905b828210156108ae5761089f604083028601368190038101906125c6565b81526020019060010190610882565b50505050506001610c53565b5050565b6108c6610e20565b61029a81611169565b6108d7610e20565b60005b81518110156108ba5760008282815181106108f7576108f761252f565b6020908102919091010151604081015181519192509067ffffffffffffffff8116600003610951576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602083015160006109628383610d2a565b8054909150700100000000000000000000000000000000900463ffffffff16600003610bb0576040805160a081018252602080870180516fffffffffffffffffffffffffffffffff908116845263ffffffff421692840192909252875115158385015251811660608301529186015190911660808201528215610ac95767ffffffffffffffff8416600090815260066020908152604091829020835160028201805493860151948601516fffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff00000000000000000000000000000000000000009095169490941770010000000000000000000000000000000063ffffffff9096168602177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000941515949094029390931790925560608401516080850151908316921690920217600390910155610baa565b67ffffffffffffffff84166000908152600660209081526040918290208351815492850151938501516fffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff00000000000000000000000000000000000000009094169390931770010000000000000000000000000000000063ffffffff9095168502177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000093151593909302929092178155606084015160808501519083169216909202176001909101555b50610bba565b610bba818561125e565b8267ffffffffffffffff167ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b978386604051610bf69291906125e2565b60405180910390a250505050508060010190506108da565b610c1960023361140d565b610c51576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610564565b565b6000610c5f8483610d2a565b805490915074010000000000000000000000000000000000000000900460ff1615610d24576000805b8451811015610d0f57610cd3858281518110610ca657610ca661252f565b6020908102919091018101515167ffffffffffffffff89166000908152600490925260409091209061143c565b15610d0757610cfa858281518110610ced57610ced61252f565b602002602001015161145e565b610d049083612655565b91505b600101610c88565b508015610d2257610d228282600061159a565b505b50505050565b67ffffffffffffffff821660009081526006602052604081208215610d5357600201905061035c565b905061035c565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152610de882606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642610dcc9190612668565b85608001516fffffffffffffffffffffffffffffffff1661191d565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60606000610e1983611945565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610564565b73ffffffffffffffffffffffffffffffffffffffff8116610eee576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdeaac1a8daeabcc5254b10b54edf3678fdfcd1cea89fe9d364b6285f6ace2df99060200160405180910390a150565b600061035c826119a1565b6000808080610f8186866119ac565b909450925050505b9250929050565b60006103598373ffffffffffffffffffffffffffffffffffffffff84166119d7565b6000610fd58473ffffffffffffffffffffffffffffffffffffffff8516846119f4565b949350505050565b602081015160005b81518110156110785760008282815181106110025761100261252f565b60200260200101519050611020816002611a1190919063ffffffff16565b1561106f5760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101610fe5565b50815160005b8151811015610d2457600082828151811061109b5761109b61252f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361110b576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611116600282611a33565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010161107e565b3373ffffffffffffffffffffffffffffffffffffffff8216036111e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610564565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b815460009061128790700100000000000000000000000000000000900463ffffffff1642612668565b9050801561132957600183015483546112cf916fffffffffffffffffffffffffffffffff8082169281169185917001000000000000000000000000000000009091041661191d565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461134f916fffffffffffffffffffffffffffffffff9081169116611a55565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061140090849061267b565b60405180910390a1505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610359565b60006103598373ffffffffffffffffffffffffffffffffffffffff8416611a6b565b60055481516040517fd02641a000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526000928392169063d02641a0906024016040805180830381865afa1580156114d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f691906126b7565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811660000361156c5782516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610564565b6020830151610e19907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690611a77565b825474010000000000000000000000000000000000000000900460ff1615806115c1575081155b156115cb57505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061161190700100000000000000000000000000000000900463ffffffff1642612668565b905080156116d15781831115611653576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600186015461168d9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff1661191d565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156117885773ffffffffffffffffffffffffffffffffffffffff8416611730576040517ff94ebcd10000000000000000000000000000000000000000000000000000000081526004810183905260248101869052604401610564565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff85166044820152606401610564565b8483101561189b5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906117cc9082612668565b6117d6878a612668565b6117e09190612655565b6117ea9190612722565b905073ffffffffffffffffffffffffffffffffffffffff8616611843576040517f15279c080000000000000000000000000000000000000000000000000000000081526004810182905260248101869052604401610564565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff87166044820152606401610564565b6118a58584612668565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b600061193c8561192d848661275d565b6119379087612655565b611a55565b95945050505050565b60608160000180548060200260200160405190810160405280929190818152602001828054801561199557602002820191906000526020600020905b815481526020019060010190808311611981575b50505050509050919050565b600061035c82611ab4565b600080806119ba8585611abe565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556103598383611aca565b60008281526002840160205260408120829055610fd58484611ad6565b60006103598373ffffffffffffffffffffffffffffffffffffffff8416611ae2565b60006103598373ffffffffffffffffffffffffffffffffffffffff8416611bd5565b6000818310611a645781610359565b5090919050565b60006103598383611c24565b6000670de0b6b3a7640000611aaa837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff861661275d565b6103599190612722565b600061035c825490565b60006103598383611c3c565b60006103598383611ae2565b60006103598383611bd5565b60008181526001830160205260408120548015611bcb576000611b06600183612668565b8554909150600090611b1a90600190612668565b9050818114611b7f576000866000018281548110611b3a57611b3a61252f565b9060005260206000200154905080876000018481548110611b5d57611b5d61252f565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611b9057611b90612774565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061035c565b600091505061035c565b6000818152600183016020526040812054611c1c5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561035c565b50600061035c565b60008181526001830160205260408120541515610359565b6000826000018281548110611c5357611c5361252f565b9060005260206000200154905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611cb857611cb8611c66565b60405290565b60405160a0810167ffffffffffffffff81118282101715611cb857611cb8611c66565b6040516060810167ffffffffffffffff81118282101715611cb857611cb8611c66565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d4b57611d4b611c66565b604052919050565b803567ffffffffffffffff81168114611d6b57600080fd5b919050565b600082601f830112611d8157600080fd5b813567ffffffffffffffff811115611d9b57611d9b611c66565b611dcc60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d04565b818152846020838601011115611de157600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611e1857611e18611c66565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114611d6b57600080fd5b600060408284031215611e5857600080fd5b611e60611c95565b9050611e6b82611e22565b81526020820135602082015292915050565b600082601f830112611e8e57600080fd5b81356020611ea3611e9e83611dfe565b611d04565b8083825260208201915060208460061b870101935086841115611ec557600080fd5b602086015b84811015611eea57611edc8882611e46565b835291830191604001611eca565b509695505050505050565b600060208284031215611f0757600080fd5b813567ffffffffffffffff80821115611f1f57600080fd5b9083019060a08286031215611f3357600080fd5b611f3b611cbe565b82358152611f4b60208401611d53565b6020820152604083013582811115611f6257600080fd5b611f6e87828601611d70565b604083015250606083013582811115611f8657600080fd5b611f9287828601611d70565b606083015250608083013582811115611faa57600080fd5b611fb687828601611e7d565b60808301525095945050505050565b80358015158114611d6b57600080fd5b60008060408385031215611fe857600080fd5b611ff183611d53565b9150611fff60208401611fc5565b90509250929050565b60008151808452602080850194506020840160005b8381101561204f57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161201d565b509495945050505050565b6020815260006103596020830184612008565b60006020828403121561207f57600080fd5b61035982611e22565b60006020828403121561209a57600080fd5b61035982611d53565b6040815260006120b66040830185612008565b82810360208481019190915284518083528582019282019060005b818110156120ed578451835293830193918301916001016120d1565b5090979650505050505050565b60006040828403121561210c57600080fd5b612114611c95565b905061211f82611d53565b815261212d60208301611e22565b602082015292915050565b600082601f83011261214957600080fd5b81356020612159611e9e83611dfe565b80838252602082019150606060206060860288010194508785111561217d57600080fd5b602087015b858110156120ed5781818a03121561219a5760008081fd5b6121a2611c95565b6121ac8a836120fa565b81526040820135868201528452928401928101612182565b60008060408084860312156121d857600080fd5b833567ffffffffffffffff808211156121f057600080fd5b818601915086601f83011261220457600080fd5b81356020612214611e9e83611dfe565b8083825260208201915060208460061b87010193508a84111561223657600080fd5b6020860195505b8386101561225e5761224f8b876120fa565b8252948601949082019061223d565b9750505050602086013592508083111561227757600080fd5b505061228585828601612138565b9150509250929050565b600082601f8301126122a057600080fd5b813560206122b0611e9e83611dfe565b8083825260208201915060208460051b8701019350868411156122d257600080fd5b602086015b84811015611eea576122e881611e22565b83529183019183016122d7565b60006020828403121561230757600080fd5b813567ffffffffffffffff8082111561231f57600080fd5b908301906040828603121561233357600080fd5b61233b611c95565b82358281111561234a57600080fd5b6123568782860161228f565b82525060208301358281111561236b57600080fd5b6123778782860161228f565b60208301525095945050505050565b6000806040838503121561239957600080fd5b6123a283611d53565b9150602083013567ffffffffffffffff8111156123be57600080fd5b830160a081860312156123d057600080fd5b809150509250929050565b80356fffffffffffffffffffffffffffffffff81168114611d6b57600080fd5b6000602080838503121561240e57600080fd5b823567ffffffffffffffff81111561242557600080fd5b8301601f8101851361243657600080fd5b8035612444611e9e82611dfe565b81815260a0918202830184019184820191908884111561246357600080fd5b938501935b8385101561252357848903818112156124815760008081fd5b612489611ce1565b61249287611d53565b815261249f888801611fc5565b8882015260406060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0850112156124d75760008081fd5b6124df611ce1565b93506124ec828a01611fc5565b84526124f9818a016123db565b8a8501525061250a608089016123db565b8382015281019190915283529384019391850191612468565b50979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261259357600080fd5b83018035915067ffffffffffffffff8211156125ae57600080fd5b6020019150600681901b3603821315610f8957600080fd5b6000604082840312156125d857600080fd5b6103598383611e46565b821515815260808101610e1960208301848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561035c5761035c612626565b8181038181111561035c5761035c612626565b6060810161035c82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b6000604082840312156126c957600080fd5b6126d1611c95565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146126fd57600080fd5b8152602083015163ffffffff8116811461271657600080fd5b60208201529392505050565b600082612758577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761035c5761035c612626565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"authorizedCallers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"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\":\"newPriceRegistry\",\"type\":\"address\"}],\"name\":\"PriceRegistrySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isOutboundLane\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"RateLimiterConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"remoteToken\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isOutboundLane\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"internalType\":\"structMultiAggregateRateLimiter.RateLimiterConfigArgs[]\",\"name\":\"rateLimiterUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applyRateLimiterConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isOutboundLane\",\"type\":\"bool\"}],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"}],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"localTokens\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"remoteTokens\",\"type\":\"bytes32[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getPriceRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"onInboundMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"onOutboundMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newPriceRegistry\",\"type\":\"address\"}],\"name\":\"setPriceRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"localToken\",\"type\":\"address\"}],\"internalType\":\"structMultiAggregateRateLimiter.LocalRateLimitToken\",\"name\":\"localTokenArgs\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"remoteToken\",\"type\":\"bytes32\"}],\"internalType\":\"structMultiAggregateRateLimiter.RateLimitTokenArgs[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x60806040523480156200001157600080fd5b5060405162002efb38038062002efb833981016040819052620000349162000538565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000102565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620001ad565b50620000fa82620002fc565b50506200066f565b336001600160a01b038216036200015c5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b81518110156200023d576000828281518110620001d657620001d662000621565b60209081029190910101519050620001f060028262000378565b1562000233576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620001b5565b50815160005b8151811015620002f657600082828151811062000264576200026462000621565b6020026020010151905060006001600160a01b0316816001600160a01b031603620002a2576040516342bcdf7f60e11b815260040160405180910390fd5b620002af60028262000398565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000243565b50505050565b6001600160a01b03811662000324576040516342bcdf7f60e11b815260040160405180910390fd5b600580546001600160a01b0319166001600160a01b0383169081179091556040519081527fdeaac1a8daeabcc5254b10b54edf3678fdfcd1cea89fe9d364b6285f6ace2df99060200160405180910390a150565b60006200038f836001600160a01b038416620003af565b90505b92915050565b60006200038f836001600160a01b038416620004b3565b60008181526001830160205260408120548015620004a8576000620003d660018362000637565b8554909150600090620003ec9060019062000637565b90508181146200045857600086600001828154811062000410576200041062000621565b906000526020600020015490508087600001848154811062000436576200043662000621565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806200046c576200046c62000659565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000392565b600091505062000392565b6000818152600183016020526040812054620004fc5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000392565b50600062000392565b80516001600160a01b03811681146200051d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600080604083850312156200054c57600080fd5b620005578362000505565b602084810151919350906001600160401b03808211156200057757600080fd5b818601915086601f8301126200058c57600080fd5b815181811115620005a157620005a162000522565b8060051b604051601f19603f83011681018181108582111715620005c957620005c962000522565b604052918252848201925083810185019189831115620005e857600080fd5b938501935b828510156200061157620006018562000505565b84529385019392850192620005ed565b8096505050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b818103818111156200039257634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b61287c806200067f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c806379ba50971161008c57806391a2749a1161006657806391a2749a14610252578063e0a0e50614610265578063f2fde38b14610278578063fe843cd01461028b57600080fd5b806379ba5097146102195780637c8b5e9a146102215780638da5cb5b1461023457600080fd5b8063181f5a77116100c8578063181f5a77146101bb5780632451a627146101d0578063508ee9de146101e5578063537e304e146101f857600080fd5b806308d450a1146100ef5780630a35bcc4146101045780630d6c107e1461017c575b600080fd5b6101026100fd366004611f31565b61029e565b005b610117610112366004612011565b6102bd565b604051610173919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b60405180910390f35b60055473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610173565b6101c3610382565b6040516101739190612044565b6101d861039e565b6040516101739190612103565b6101026101f3366004612116565b6103af565b61020b610206366004612131565b6103c0565b60405161017392919061214c565b610102610523565b61010261022f36600461226d565b610625565b60005473ffffffffffffffffffffffffffffffffffffffff16610196565b61010261026036600461239e565b610874565b61010261027336600461242f565b610885565b610102610286366004612116565b6108fa565b6101026102993660046124a4565b61090b565b6102a6610c4a565b6102ba816020015182608001516000610c8f565b50565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526103796102f58484610d66565b6040805160a08101825282546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff16151593830193909352600190930154808316606083015292909204166080820152610d96565b90505b92915050565b60405180606001604052806023815260200161284d6023913981565b60606103aa6002610e48565b905090565b6103b7610e5c565b6102ba81610edd565b67ffffffffffffffff8116600090815260046020526040812060609182916103e790610fa3565b90508067ffffffffffffffff81111561040257610402611ca2565b60405190808252806020026020018201604052801561042b578160200160208202803683370190505b5092508067ffffffffffffffff81111561044757610447611ca2565b604051908082528060200260200182016040528015610470578160200160208202803683370190505b50915060005b8181101561051c5767ffffffffffffffff8516600090815260046020526040812081906104a39084610fae565b91509150818684815181106104ba576104ba6125d8565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080858481518110610507576105076125d8565b60209081029190910101525050600101610476565b5050915091565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61062d610e5c565b60005b825181101561070b57600083828151811061064d5761064d6125d8565b6020026020010151602001519050600084838151811061066f5761066f6125d8565b6020908102919091018101515167ffffffffffffffff81166000908152600490925260409091209091506106a39083610fcc565b15610701576040805167ffffffffffffffff8316815273ffffffffffffffffffffffffffffffffffffffff841660208201527f530cabd30786b7235e124a6c0db77e0b685ef22813b1fe87554247f404eb8ed6910160405180910390a15b5050600101610630565b5060005b815181101561086f57600082828151811061072c5761072c6125d8565b6020026020010151600001519050600083838151811061074e5761074e6125d8565b6020026020010151602001519050600082602001519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148061079e575081155b156107d5576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825167ffffffffffffffff811660009081526004602052604090206107fb908385610fee565b15610860576040805167ffffffffffffffff831681526020810185905273ffffffffffffffffffffffffffffffffffffffff84168183015290517ffd96f5ca8894a9584abba5645131a95480f9340bd5e0046ceff789111ff16c6d9181900360600190a15b5050505080600101905061070f565b505050565b61087c610e5c565b6102ba81611019565b61088d610c4a565b6108f68261089e6040840184612607565b808060200260200160405190810160405280939291908181526020016000905b828210156108ea576108db6040830286013681900381019061266f565b815260200190600101906108be565b50505050506001610c8f565b5050565b610902610e5c565b6102ba816111a5565b610913610e5c565b60005b81518110156108f6576000828281518110610933576109336125d8565b6020908102919091010151604081015181519192509067ffffffffffffffff811660000361098d576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6020830151600061099e8383610d66565b8054909150700100000000000000000000000000000000900463ffffffff16600003610bec576040805160a081018252602080870180516fffffffffffffffffffffffffffffffff908116845263ffffffff421692840192909252875115158385015251811660608301529186015190911660808201528215610b055767ffffffffffffffff8416600090815260066020908152604091829020835160028201805493860151948601516fffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff00000000000000000000000000000000000000009095169490941770010000000000000000000000000000000063ffffffff9096168602177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000941515949094029390931790925560608401516080850151908316921690920217600390910155610be6565b67ffffffffffffffff84166000908152600660209081526040918290208351815492850151938501516fffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff00000000000000000000000000000000000000009094169390931770010000000000000000000000000000000063ffffffff9095168502177fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000093151593909302929092178155606084015160808501519083169216909202176001909101555b50610bf6565b610bf6818561129a565b8267ffffffffffffffff167ff14a5415ce6988a9e870a85fff0b9d7b7dd79bbc228cb63cad610daf6f7b6b978386604051610c3292919061268b565b60405180910390a25050505050806001019050610916565b610c55600233611449565b610c8d576040517fd86ad9cf0000000000000000000000000000000000000000000000000000000081523360048201526024016105a0565b565b6000610c9b8483610d66565b805490915074010000000000000000000000000000000000000000900460ff1615610d60576000805b8451811015610d4b57610d0f858281518110610ce257610ce26125d8565b6020908102919091018101515167ffffffffffffffff891660009081526004909252604090912090611478565b15610d4357610d36858281518110610d2957610d296125d8565b602002602001015161149a565b610d4090836126fe565b91505b600101610cc4565b508015610d5e57610d5e828260006115d6565b505b50505050565b67ffffffffffffffff821660009081526006602052604081208215610d8f57600201905061037c565b905061037c565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152610e2482606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642610e089190612711565b85608001516fffffffffffffffffffffffffffffffff16611959565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b60606000610e5583611981565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016105a0565b73ffffffffffffffffffffffffffffffffffffffff8116610f2a576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527fdeaac1a8daeabcc5254b10b54edf3678fdfcd1cea89fe9d364b6285f6ace2df99060200160405180910390a150565b600061037c826119dd565b6000808080610fbd86866119e8565b909450925050505b9250929050565b60006103798373ffffffffffffffffffffffffffffffffffffffff8416611a13565b60006110118473ffffffffffffffffffffffffffffffffffffffff851684611a30565b949350505050565b602081015160005b81518110156110b457600082828151811061103e5761103e6125d8565b6020026020010151905061105c816002611a4d90919063ffffffff16565b156110ab5760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101611021565b50815160005b8151811015610d605760008282815181106110d7576110d76125d8565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611147576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611152600282611a6f565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016110ba565b3373ffffffffffffffffffffffffffffffffffffffff821603611224576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016105a0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b81546000906112c390700100000000000000000000000000000000900463ffffffff1642612711565b90508015611365576001830154835461130b916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416611959565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461138b916fffffffffffffffffffffffffffffffff9081169116611a91565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c199061143c908490612724565b60405180910390a1505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610379565b60006103798373ffffffffffffffffffffffffffffffffffffffff8416611aa7565b60055481516040517fd02641a000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff91821660048201526000928392169063d02641a0906024016040805180830381865afa15801561150e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115329190612760565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036115a85782516040517f9a655f7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016105a0565b6020830151610e55907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff831690611ab3565b825474010000000000000000000000000000000000000000900460ff1615806115fd575081155b1561160757505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061164d90700100000000000000000000000000000000900463ffffffff1642612711565b9050801561170d578183111561168f576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546116c99083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16611959565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b848210156117c45773ffffffffffffffffffffffffffffffffffffffff841661176c576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016105a0565b6040517f1a76572a000000000000000000000000000000000000000000000000000000008152600481018390526024810186905273ffffffffffffffffffffffffffffffffffffffff851660448201526064016105a0565b848310156118d75760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169060009082906118089082612711565b611812878a612711565b61181c91906126fe565b61182691906127cb565b905073ffffffffffffffffffffffffffffffffffffffff861661187f576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016105a0565b6040517fd0c8d23a000000000000000000000000000000000000000000000000000000008152600481018290526024810186905273ffffffffffffffffffffffffffffffffffffffff871660448201526064016105a0565b6118e18584612711565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000611978856119698486612806565b61197390876126fe565b611a91565b95945050505050565b6060816000018054806020026020016040519081016040528092919081815260200182805480156119d157602002820191906000526020600020905b8154815260200190600101908083116119bd575b50505050509050919050565b600061037c82611af0565b600080806119f68585611afa565b600081815260029690960160205260409095205494959350505050565b600081815260028301602052604081208190556103798383611b06565b600082815260028401602052604081208290556110118484611b12565b60006103798373ffffffffffffffffffffffffffffffffffffffff8416611b1e565b60006103798373ffffffffffffffffffffffffffffffffffffffff8416611c11565b6000818310611aa05781610379565b5090919050565b60006103798383611c60565b6000670de0b6b3a7640000611ae6837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616612806565b61037991906127cb565b600061037c825490565b60006103798383611c78565b60006103798383611b1e565b60006103798383611c11565b60008181526001830160205260408120548015611c07576000611b42600183612711565b8554909150600090611b5690600190612711565b9050818114611bbb576000866000018281548110611b7657611b766125d8565b9060005260206000200154905080876000018481548110611b9957611b996125d8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611bcc57611bcc61281d565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061037c565b600091505061037c565b6000818152600183016020526040812054611c585750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561037c565b50600061037c565b60008181526001830160205260408120541515610379565b6000826000018281548110611c8f57611c8f6125d8565b9060005260206000200154905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611cf457611cf4611ca2565b60405290565b60405160a0810167ffffffffffffffff81118282101715611cf457611cf4611ca2565b6040516060810167ffffffffffffffff81118282101715611cf457611cf4611ca2565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611d8757611d87611ca2565b604052919050565b803567ffffffffffffffff81168114611da757600080fd5b919050565b600082601f830112611dbd57600080fd5b813567ffffffffffffffff811115611dd757611dd7611ca2565b611e0860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611d40565b818152846020838601011115611e1d57600080fd5b816020850160208301376000918101602001919091529392505050565b600067ffffffffffffffff821115611e5457611e54611ca2565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114611da757600080fd5b600060408284031215611e9457600080fd5b611e9c611cd1565b9050611ea782611e5e565b81526020820135602082015292915050565b600082601f830112611eca57600080fd5b81356020611edf611eda83611e3a565b611d40565b8083825260208201915060208460061b870101935086841115611f0157600080fd5b602086015b84811015611f2657611f188882611e82565b835291830191604001611f06565b509695505050505050565b600060208284031215611f4357600080fd5b813567ffffffffffffffff80821115611f5b57600080fd5b9083019060a08286031215611f6f57600080fd5b611f77611cfa565b82358152611f8760208401611d8f565b6020820152604083013582811115611f9e57600080fd5b611faa87828601611dac565b604083015250606083013582811115611fc257600080fd5b611fce87828601611dac565b606083015250608083013582811115611fe657600080fd5b611ff287828601611eb9565b60808301525095945050505050565b80358015158114611da757600080fd5b6000806040838503121561202457600080fd5b61202d83611d8f565b915061203b60208401612001565b90509250929050565b60006020808352835180602085015260005b8181101561207257858101830151858201604001528201612056565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b60008151808452602080850194506020840160005b838110156120f857815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016120c6565b509495945050505050565b60208152600061037960208301846120b1565b60006020828403121561212857600080fd5b61037982611e5e565b60006020828403121561214357600080fd5b61037982611d8f565b60408152600061215f60408301856120b1565b82810360208481019190915284518083528582019282019060005b818110156121965784518352938301939183019160010161217a565b5090979650505050505050565b6000604082840312156121b557600080fd5b6121bd611cd1565b90506121c882611d8f565b81526121d660208301611e5e565b602082015292915050565b600082601f8301126121f257600080fd5b81356020612202611eda83611e3a565b80838252602082019150606060206060860288010194508785111561222657600080fd5b602087015b858110156121965781818a0312156122435760008081fd5b61224b611cd1565b6122558a836121a3565b8152604082013586820152845292840192810161222b565b600080604080848603121561228157600080fd5b833567ffffffffffffffff8082111561229957600080fd5b818601915086601f8301126122ad57600080fd5b813560206122bd611eda83611e3a565b8083825260208201915060208460061b87010193508a8411156122df57600080fd5b6020860195505b83861015612307576122f88b876121a3565b825294860194908201906122e6565b9750505050602086013592508083111561232057600080fd5b505061232e858286016121e1565b9150509250929050565b600082601f83011261234957600080fd5b81356020612359611eda83611e3a565b8083825260208201915060208460051b87010193508684111561237b57600080fd5b602086015b84811015611f265761239181611e5e565b8352918301918301612380565b6000602082840312156123b057600080fd5b813567ffffffffffffffff808211156123c857600080fd5b90830190604082860312156123dc57600080fd5b6123e4611cd1565b8235828111156123f357600080fd5b6123ff87828601612338565b82525060208301358281111561241457600080fd5b61242087828601612338565b60208301525095945050505050565b6000806040838503121561244257600080fd5b61244b83611d8f565b9150602083013567ffffffffffffffff81111561246757600080fd5b830160a0818603121561247957600080fd5b809150509250929050565b80356fffffffffffffffffffffffffffffffff81168114611da757600080fd5b600060208083850312156124b757600080fd5b823567ffffffffffffffff8111156124ce57600080fd5b8301601f810185136124df57600080fd5b80356124ed611eda82611e3a565b81815260a0918202830184019184820191908884111561250c57600080fd5b938501935b838510156125cc578489038181121561252a5760008081fd5b612532611d1d565b61253b87611d8f565b8152612548888801612001565b8882015260406060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0850112156125805760008081fd5b612588611d1d565b9350612595828a01612001565b84526125a2818a01612484565b8a850152506125b360808901612484565b8382015281019190915283529384019391850191612511565b50979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261263c57600080fd5b83018035915067ffffffffffffffff82111561265757600080fd5b6020019150600681901b3603821315610fc557600080fd5b60006040828403121561268157600080fd5b6103798383611e82565b821515815260808101610e5560208301848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561037c5761037c6126cf565b8181038181111561037c5761037c6126cf565b6060810161037c82848051151582526020808201516fffffffffffffffffffffffffffffffff9081169184019190915260409182015116910152565b60006040828403121561277257600080fd5b61277a611cd1565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146127a657600080fd5b8152602083015163ffffffff811681146127bf57600080fd5b60208201529392505050565b600082612801577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761037c5761037c6126cf565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe4d756c7469416767726567617465526174654c696d6974657220312e362e302d646576a164736f6c6343000818000a",
}
var MultiAggregateRateLimiterABI = MultiAggregateRateLimiterMetaData.ABI
@@ -345,6 +345,28 @@ func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerSession) Owner(
return _MultiAggregateRateLimiter.Contract.Owner(&_MultiAggregateRateLimiter.CallOpts)
}
+func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _MultiAggregateRateLimiter.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterSession) TypeAndVersion() (string, error) {
+ return _MultiAggregateRateLimiter.Contract.TypeAndVersion(&_MultiAggregateRateLimiter.CallOpts)
+}
+
+func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterCallerSession) TypeAndVersion() (string, error) {
+ return _MultiAggregateRateLimiter.Contract.TypeAndVersion(&_MultiAggregateRateLimiter.CallOpts)
+}
+
func (_MultiAggregateRateLimiter *MultiAggregateRateLimiterTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
return _MultiAggregateRateLimiter.contract.Transact(opts, "acceptOwnership")
}
@@ -1754,6 +1776,8 @@ type MultiAggregateRateLimiterInterface interface {
Owner(opts *bind.CallOpts) (common.Address, error)
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go b/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go
index 14979b4fe3..b93daf75c3 100644
--- a/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go
+++ b/core/gethwrappers/ccip/generated/nonce_manager/nonce_manager.go
@@ -46,8 +46,8 @@ type NonceManagerPreviousRampsArgs struct {
}
var NonceManagerMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"authorizedCallers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"PreviousRampAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structNonceManager.PreviousRamps\",\"name\":\"prevRamp\",\"type\":\"tuple\"}],\"name\":\"PreviousRampsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"}],\"internalType\":\"structNonceManager.PreviousRamps\",\"name\":\"prevRamps\",\"type\":\"tuple\"}],\"internalType\":\"structNonceManager.PreviousRampsArgs[]\",\"name\":\"previousRampsArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPreviousRampsUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"getInboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getIncrementedOutboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getOutboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getPreviousRamps\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"}],\"internalType\":\"structNonceManager.PreviousRamps\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expectedNonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"incrementInboundNonce\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x60806040523480156200001157600080fd5b5060405162001ad538038062001ad58339810160408190526200003491620004b0565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000f6565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620001a1565b5050620005d0565b336001600160a01b03821603620001505760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000231576000828281518110620001ca57620001ca62000582565b60209081029190910101519050620001e4600282620002f0565b1562000227576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620001a9565b50815160005b8151811015620002ea57600082828151811062000258576200025862000582565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000296576040516342bcdf7f60e11b815260040160405180910390fd5b620002a360028262000310565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000237565b50505050565b600062000307836001600160a01b03841662000327565b90505b92915050565b600062000307836001600160a01b0384166200042b565b60008181526001830160205260408120548015620004205760006200034e60018362000598565b8554909150600090620003649060019062000598565b9050818114620003d057600086600001828154811062000388576200038862000582565b9060005260206000200154905080876000018481548110620003ae57620003ae62000582565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620003e457620003e4620005ba565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200030a565b60009150506200030a565b600081815260018301602052604081205462000474575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200030a565b5060006200030a565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620004ab57600080fd5b919050565b60006020808385031215620004c457600080fd5b82516001600160401b0380821115620004dc57600080fd5b818501915085601f830112620004f157600080fd5b8151818111156200050657620005066200047d565b8060051b604051601f19603f830116810181811085821117156200052e576200052e6200047d565b6040529182528482019250838101850191888311156200054d57600080fd5b938501935b828510156200057657620005668562000493565b8452938501939285019262000552565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b818103818111156200030a57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6114f580620005e06000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806391a2749a11610081578063e0e03cae1161005b578063e0e03cae14610228578063ea458c0c1461024b578063f2fde38b1461025e57600080fd5b806391a2749a146101d6578063bf18402a146101e9578063c92236251461021557600080fd5b806379ba5097116100b257806379ba50971461019157806384d8acf71461019b5780638da5cb5b146101ae57600080fd5b80632451a627146100ce578063294b5630146100ec575b600080fd5b6100d6610271565b6040516100e39190610f2e565b60405180910390f35b61015d6100fa366004610f9e565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600460209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff9081168452600190910154169082015290565b60408051825173ffffffffffffffffffffffffffffffffffffffff90811682526020938401511692810192909252016100e3565b610199610282565b005b6101996101a9366004610fbb565b610384565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e3565b6101996101e4366004611146565b610560565b6101fc6101f73660046111ed565b610574565b60405167ffffffffffffffff90911681526020016100e3565b6101fc61022336600461126f565b610589565b61023b6102363660046112c4565b6105a0565b60405190151581526020016100e3565b6101fc6102593660046111ed565b6106a9565b61019961026c366004611329565b61073d565b606061027d600261074e565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610308576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61038c61075b565b60005b8181101561055b57368383838181106103aa576103aa611346565b606002919091019150600090506004816103c76020850185610f9e565b67ffffffffffffffff1681526020810191909152604001600020805490915073ffffffffffffffffffffffffffffffffffffffff161515806104225750600181015473ffffffffffffffffffffffffffffffffffffffff1615155b15610459576040517fc6117ae200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104696040830160208401611329565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff919091161781556104b96060830160408401611329565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561050d6020830183610f9e565b67ffffffffffffffff167fa2e43edcbc4fd175ae4bebbe3fd6139871ed1f1783cd4a1ace59b90d302c3319836020016040516105499190611375565b60405180910390a2505060010161038f565b505050565b61056861075b565b610571816107de565b50565b60006105808383610970565b90505b92915050565b6000610596848484610a8d565b90505b9392505050565b60006105aa610bde565b60006105b7868585610a8d565b6105c29060016113ec565b90508467ffffffffffffffff168167ffffffffffffffff1614610626577f606ff8179e5e3c059b82df931acc496b7b6053e8879042f8267f930e0595f69f86868686604051610614949392919061140d565b60405180910390a160009150506106a1565b67ffffffffffffffff86166000908152600660205260409081902090518291906106539087908790611479565b908152604051908190036020019020805467ffffffffffffffff929092167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905550600190505b949350505050565b60006106b3610bde565b60006106bf8484610970565b6106ca9060016113ec565b67ffffffffffffffff808616600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902080549183167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905591505092915050565b61074561075b565b61057181610c21565b6060600061059983610d16565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016102ff565b565b602081015160005b815181101561087957600082828151811061080357610803611346565b60200260200101519050610821816002610d7290919063ffffffff16565b156108705760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b506001016107e6565b50815160005b815181101561096a57600082828151811061089c5761089c611346565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361090c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610917600282610d94565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010161087f565b50505050565b67ffffffffffffffff808316600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120549091168082036105805767ffffffffffffffff841660009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff168015610a85576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015282169063856c824790602401602060405180830381865afa158015610a58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7c9190611489565b92505050610583565b509392505050565b67ffffffffffffffff83166000908152600660205260408082209051829190610ab99086908690611479565b9081526040519081900360200190205467ffffffffffffffff16905060008190036105965767ffffffffffffffff851660009081526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168015610bd55773ffffffffffffffffffffffffffffffffffffffff811663856c8247610b3f86880188611329565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610ba8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bcc9190611489565b92505050610599565b50949350505050565b610be9600233610db6565b6107dc576040517fd86ad9cf0000000000000000000000000000000000000000000000000000000081523360048201526024016102ff565b3373ffffffffffffffffffffffffffffffffffffffff821603610ca0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016102ff565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b606081600001805480602002602001604051908101604052809291908181526020018280548015610d6657602002820191906000526020600020905b815481526020019060010190808311610d52575b50505050509050919050565b60006105808373ffffffffffffffffffffffffffffffffffffffff8416610de5565b60006105808373ffffffffffffffffffffffffffffffffffffffff8416610edf565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610580565b60008181526001830160205260408120548015610ece576000610e096001836114a6565b8554909150600090610e1d906001906114a6565b9050818114610e82576000866000018281548110610e3d57610e3d611346565b9060005260206000200154905080876000018481548110610e6057610e60611346565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610e9357610e936114b9565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610583565b6000915050610583565b5092915050565b6000818152600183016020526040812054610f2657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610583565b506000610583565b6020808252825182820181905260009190848201906040850190845b81811015610f7c57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101610f4a565b50909695505050505050565b67ffffffffffffffff8116811461057157600080fd5b600060208284031215610fb057600080fd5b813561058081610f88565b60008060208385031215610fce57600080fd5b823567ffffffffffffffff80821115610fe657600080fd5b818501915085601f830112610ffa57600080fd5b81358181111561100957600080fd5b86602060608302850101111561101e57600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff8116811461057157600080fd5b600082601f83011261109257600080fd5b8135602067ffffffffffffffff808311156110af576110af611030565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811084821117156110f2576110f2611030565b604052938452602081870181019490810192508785111561111257600080fd5b6020870191505b8482101561113b57813561112c8161105f565b83529183019190830190611119565b979650505050505050565b60006020828403121561115857600080fd5b813567ffffffffffffffff8082111561117057600080fd5b908301906040828603121561118457600080fd5b60405160408101818110838211171561119f5761119f611030565b6040528235828111156111b157600080fd5b6111bd87828601611081565b8252506020830135828111156111d257600080fd5b6111de87828601611081565b60208301525095945050505050565b6000806040838503121561120057600080fd5b823561120b81610f88565b9150602083013561121b8161105f565b809150509250929050565b60008083601f84011261123857600080fd5b50813567ffffffffffffffff81111561125057600080fd5b60208301915083602082850101111561126857600080fd5b9250929050565b60008060006040848603121561128457600080fd5b833561128f81610f88565b9250602084013567ffffffffffffffff8111156112ab57600080fd5b6112b786828701611226565b9497909650939450505050565b600080600080606085870312156112da57600080fd5b84356112e581610f88565b935060208501356112f581610f88565b9250604085013567ffffffffffffffff81111561131157600080fd5b61131d87828801611226565b95989497509550505050565b60006020828403121561133b57600080fd5b81356105808161105f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6040810182356113848161105f565b73ffffffffffffffffffffffffffffffffffffffff90811683526020840135906113ad8261105f565b8082166020850152505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115610ed857610ed86113bd565b600067ffffffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b8183823760009101908152919050565b60006020828403121561149b57600080fd5b815161058081610f88565b81810381811115610583576105836113bd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"authorizedCallers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"PreviousRampAlreadySet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structNonceManager.PreviousRamps\",\"name\":\"prevRamp\",\"type\":\"tuple\"}],\"name\":\"PreviousRampsUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"remoteChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"}],\"internalType\":\"structNonceManager.PreviousRamps\",\"name\":\"prevRamps\",\"type\":\"tuple\"}],\"internalType\":\"structNonceManager.PreviousRampsArgs[]\",\"name\":\"previousRampsArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPreviousRampsUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"getInboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getIncrementedOutboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getOutboundNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"getPreviousRamps\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"prevOnRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"}],\"internalType\":\"structNonceManager.PreviousRamps\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expectedNonce\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"}],\"name\":\"incrementInboundNonce\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60806040523480156200001157600080fd5b5060405162001b9638038062001b968339810160408190526200003491620004b0565b8033806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620000f6565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620001a1565b5050620005d0565b336001600160a01b03821603620001505760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000231576000828281518110620001ca57620001ca62000582565b60209081029190910101519050620001e4600282620002f0565b1562000227576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620001a9565b50815160005b8151811015620002ea57600082828151811062000258576200025862000582565b6020026020010151905060006001600160a01b0316816001600160a01b03160362000296576040516342bcdf7f60e11b815260040160405180910390fd5b620002a360028262000310565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000237565b50505050565b600062000307836001600160a01b03841662000327565b90505b92915050565b600062000307836001600160a01b0384166200042b565b60008181526001830160205260408120548015620004205760006200034e60018362000598565b8554909150600090620003649060019062000598565b9050818114620003d057600086600001828154811062000388576200038862000582565b9060005260206000200154905080876000018481548110620003ae57620003ae62000582565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080620003e457620003e4620005ba565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506200030a565b60009150506200030a565b600081815260018301602052604081205462000474575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556200030a565b5060006200030a565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620004ab57600080fd5b919050565b60006020808385031215620004c457600080fd5b82516001600160401b0380821115620004dc57600080fd5b818501915085601f830112620004f157600080fd5b8151818111156200050657620005066200047d565b8060051b604051601f19603f830116810181811085821117156200052e576200052e6200047d565b6040529182528482019250838101850191888311156200054d57600080fd5b938501935b828510156200057657620005668562000493565b8452938501939285019262000552565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b818103818111156200030a57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6115b680620005e06000396000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806391a2749a11610081578063e0e03cae1161005b578063e0e03cae1461027c578063ea458c0c1461029f578063f2fde38b146102b257600080fd5b806391a2749a1461022a578063bf18402a1461023d578063c92236251461026957600080fd5b806379ba5097116100b257806379ba5097146101e557806384d8acf7146101ef5780638da5cb5b1461020257600080fd5b8063181f5a77146100d95780632451a6271461012b578063294b563014610140575b600080fd5b6101156040518060400160405280601681526020017f4e6f6e63654d616e6167657220312e362e302d6465760000000000000000000081525081565b6040516101229190610f82565b60405180910390f35b6101336102c5565b6040516101229190610fef565b6101b161014e36600461105f565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600460209081526040918290208251808401909352805473ffffffffffffffffffffffffffffffffffffffff9081168452600190910154169082015290565b60408051825173ffffffffffffffffffffffffffffffffffffffff9081168252602093840151169281019290925201610122565b6101ed6102d6565b005b6101ed6101fd36600461107c565b6103d8565b60005460405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610122565b6101ed610238366004611207565b6105b4565b61025061024b3660046112ae565b6105c8565b60405167ffffffffffffffff9091168152602001610122565b610250610277366004611330565b6105dd565b61028f61028a366004611385565b6105f4565b6040519015158152602001610122565b6102506102ad3660046112ae565b6106fd565b6101ed6102c03660046113ea565b610791565b60606102d160026107a2565b905090565b60015473ffffffffffffffffffffffffffffffffffffffff16331461035c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6103e06107af565b60005b818110156105af57368383838181106103fe576103fe611407565b6060029190910191506000905060048161041b602085018561105f565b67ffffffffffffffff1681526020810191909152604001600020805490915073ffffffffffffffffffffffffffffffffffffffff161515806104765750600181015473ffffffffffffffffffffffffffffffffffffffff1615155b156104ad576040517fc6117ae200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104bd60408301602084016113ea565b81547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9190911617815561050d60608301604084016113ea565b6001820180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055610561602083018361105f565b67ffffffffffffffff167fa2e43edcbc4fd175ae4bebbe3fd6139871ed1f1783cd4a1ace59b90d302c33198360200160405161059d9190611436565b60405180910390a250506001016103e3565b505050565b6105bc6107af565b6105c581610832565b50565b60006105d483836109c4565b90505b92915050565b60006105ea848484610ae1565b90505b9392505050565b60006105fe610c32565b600061060b868585610ae1565b6106169060016114ad565b90508467ffffffffffffffff168167ffffffffffffffff161461067a577f606ff8179e5e3c059b82df931acc496b7b6053e8879042f8267f930e0595f69f8686868660405161066894939291906114ce565b60405180910390a160009150506106f5565b67ffffffffffffffff86166000908152600660205260409081902090518291906106a7908790879061153a565b908152604051908190036020019020805467ffffffffffffffff929092167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905550600190505b949350505050565b6000610707610c32565b600061071384846109c4565b61071e9060016114ad565b67ffffffffffffffff808616600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902080549183167fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000090921691909117905591505092915050565b6107996107af565b6105c581610c75565b606060006105ed83610d6a565b60005473ffffffffffffffffffffffffffffffffffffffff163314610830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610353565b565b602081015160005b81518110156108cd57600082828151811061085757610857611407565b60200260200101519050610875816002610dc690919063ffffffff16565b156108c45760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b5060010161083a565b50815160005b81518110156109be5760008282815181106108f0576108f0611407565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610960576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61096b600282610de8565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016108d3565b50505050565b67ffffffffffffffff808316600090815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091528120549091168082036105d45767ffffffffffffffff841660009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff168015610ad9576040517f856c824700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff858116600483015282169063856c824790602401602060405180830381865afa158015610aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad0919061154a565b925050506105d7565b509392505050565b67ffffffffffffffff83166000908152600660205260408082209051829190610b0d908690869061153a565b9081526040519081900360200190205467ffffffffffffffff16905060008190036105ea5767ffffffffffffffff851660009081526004602052604090206001015473ffffffffffffffffffffffffffffffffffffffff168015610c295773ffffffffffffffffffffffffffffffffffffffff811663856c8247610b93868801886113ea565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c20919061154a565b925050506105ed565b50949350505050565b610c3d600233610e0a565b610830576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610353565b3373ffffffffffffffffffffffffffffffffffffffff821603610cf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610353565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b606081600001805480602002602001604051908101604052809291908181526020018280548015610dba57602002820191906000526020600020905b815481526020019060010190808311610da6575b50505050509050919050565b60006105d48373ffffffffffffffffffffffffffffffffffffffff8416610e39565b60006105d48373ffffffffffffffffffffffffffffffffffffffff8416610f33565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260018301602052604081205415156105d4565b60008181526001830160205260408120548015610f22576000610e5d600183611567565b8554909150600090610e7190600190611567565b9050818114610ed6576000866000018281548110610e9157610e91611407565b9060005260206000200154905080876000018481548110610eb457610eb4611407565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080610ee757610ee761157a565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506105d7565b60009150506105d7565b5092915050565b6000818152600183016020526040812054610f7a575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556105d7565b5060006105d7565b60006020808352835180602085015260005b81811015610fb057858101830151858201604001528201610f94565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b6020808252825182820181905260009190848201906040850190845b8181101561103d57835173ffffffffffffffffffffffffffffffffffffffff168352928401929184019160010161100b565b50909695505050505050565b67ffffffffffffffff811681146105c557600080fd5b60006020828403121561107157600080fd5b81356105d481611049565b6000806020838503121561108f57600080fd5b823567ffffffffffffffff808211156110a757600080fd5b818501915085601f8301126110bb57600080fd5b8135818111156110ca57600080fd5b8660206060830285010111156110df57600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146105c557600080fd5b600082601f83011261115357600080fd5b8135602067ffffffffffffffff80831115611170576111706110f1565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811084821117156111b3576111b36110f1565b60405293845260208187018101949081019250878511156111d357600080fd5b6020870191505b848210156111fc5781356111ed81611120565b835291830191908301906111da565b979650505050505050565b60006020828403121561121957600080fd5b813567ffffffffffffffff8082111561123157600080fd5b908301906040828603121561124557600080fd5b604051604081018181108382111715611260576112606110f1565b60405282358281111561127257600080fd5b61127e87828601611142565b82525060208301358281111561129357600080fd5b61129f87828601611142565b60208301525095945050505050565b600080604083850312156112c157600080fd5b82356112cc81611049565b915060208301356112dc81611120565b809150509250929050565b60008083601f8401126112f957600080fd5b50813567ffffffffffffffff81111561131157600080fd5b60208301915083602082850101111561132957600080fd5b9250929050565b60008060006040848603121561134557600080fd5b833561135081611049565b9250602084013567ffffffffffffffff81111561136c57600080fd5b611378868287016112e7565b9497909650939450505050565b6000806000806060858703121561139b57600080fd5b84356113a681611049565b935060208501356113b681611049565b9250604085013567ffffffffffffffff8111156113d257600080fd5b6113de878288016112e7565b95989497509550505050565b6000602082840312156113fc57600080fd5b81356105d481611120565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60408101823561144581611120565b73ffffffffffffffffffffffffffffffffffffffff908116835260208401359061146e82611120565b8082166020850152505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff818116838216019080821115610f2c57610f2c61147e565b600067ffffffffffffffff8087168352808616602084015250606060408301528260608301528284608084013760006080848401015260807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116830101905095945050505050565b8183823760009101908152919050565b60006020828403121561155c57600080fd5b81516105d481611049565b818103818111156105d7576105d761147e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var NonceManagerABI = NonceManagerMetaData.ABI
@@ -296,6 +296,28 @@ func (_NonceManager *NonceManagerCallerSession) Owner() (common.Address, error)
return _NonceManager.Contract.Owner(&_NonceManager.CallOpts)
}
+func (_NonceManager *NonceManagerCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) {
+ var out []interface{}
+ err := _NonceManager.contract.Call(opts, &out, "typeAndVersion")
+
+ if err != nil {
+ return *new(string), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(string)).(*string)
+
+ return out0, err
+
+}
+
+func (_NonceManager *NonceManagerSession) TypeAndVersion() (string, error) {
+ return _NonceManager.Contract.TypeAndVersion(&_NonceManager.CallOpts)
+}
+
+func (_NonceManager *NonceManagerCallerSession) TypeAndVersion() (string, error) {
+ return _NonceManager.Contract.TypeAndVersion(&_NonceManager.CallOpts)
+}
+
func (_NonceManager *NonceManagerTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
return _NonceManager.contract.Transact(opts, "acceptOwnership")
}
@@ -1180,6 +1202,8 @@ type NonceManagerInterface interface {
Owner(opts *bind.CallOpts) (common.Address, error)
+ TypeAndVersion(opts *bind.CallOpts) (string, error)
+
AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error)
ApplyAuthorizedCallerUpdates(opts *bind.TransactOpts, authorizedCallerArgs AuthorizedCallersAuthorizedCallerArgs) (*types.Transaction, error)
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 63ec39c74c..c9da4f5973 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -22,9 +22,9 @@ mock_arm_contract: ../../../contracts/solc/v0.8.24/MockRMN1_0/MockRMN.abi ../../
mock_usdc_token_messenger: ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTokenMessenger/MockE2EUSDCTokenMessenger.bin e0cf17a38b438239fc6294ddca88f86b6c39e4542aefd9815b2d92987191b8bd
mock_usdc_token_transmitter: ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.abi ../../../contracts/solc/v0.8.24/MockE2EUSDCTransmitter/MockE2EUSDCTransmitter.bin 33bdad70822e889de7c720ed20085cf9cd3f8eba8b68f26bd6535197749595fe
mock_v3_aggregator_contract: ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.abi ../../../contracts/solc/v0.8.24/MockV3Aggregator/MockV3Aggregator.bin 518e19efa2ff52b0fefd8e597b05765317ee7638189bfe34ca43de2f6599faf4
-multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin abb0ecb1ed8621f26e43b39f5fa25f3d0b6d6c184fa37c404c4389605ecb74e7
+multi_aggregate_rate_limiter: ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.abi ../../../contracts/solc/v0.8.24/MultiAggregateRateLimiter/MultiAggregateRateLimiter.bin 44e1f40d928fd0e1f36e1ee5edfb6ab2a54fee0174e5f83c57a06cf79ec0c96c
multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.abi ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Helper.bin aa299e0c2659d53aad4eace4d66be0e734b1366008593669cf30361ff529da6a
-nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 78b58f4f192db7496e2b6de805d6a2c918b98d4fa62f3c7ed145ef3b5657a40d
+nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 1588313bb5e781d181a825247d30828f59007700f36b4b9b00391592b06ff4b4
price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 955eeb1da5f001fa01dc9914bf8a02b7e3b58e080ee775424261dcd97f88d70d
From 835b4d49cb45bfa4cc7a8527c94f0d4320fe946a Mon Sep 17 00:00:00 2001
From: Adam Hamrick
Date: Thu, 1 Aug 2024 16:44:57 -0400
Subject: [PATCH 18/28] [TT-1436] Fix Compatibility Tests Image (#1249)
[CCIP Compatibility tests were failing due to a bad image name for the
build
step.](https://github.com/smartcontractkit/ccip/actions/runs/10195054565/job/28202963819#step:4:1413)
---
.github/workflows/ccip-client-compatibility-tests.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/ccip-client-compatibility-tests.yml b/.github/workflows/ccip-client-compatibility-tests.yml
index fb3584b165..42daf280ca 100644
--- a/.github/workflows/ccip-client-compatibility-tests.yml
+++ b/.github/workflows/ccip-client-compatibility-tests.yml
@@ -29,7 +29,7 @@ on:
type: string
env:
- CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
+ CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/ccip
INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com
MOD_CACHE_VERSION: 2
@@ -199,7 +199,7 @@ jobs:
echo "chainlink_version=$chainlink_version" >> $GITHUB_OUTPUT
elif [ "$GITHUB_REF_TYPE" = "tag" ]; then
echo "Fetching Chainlink version from tag"
- chainlink_version="${{ github.ref }}"
+ chainlink_version="${{ github.ref_name }}"
echo "chainlink_version=$chainlink_version" >> $GITHUB_OUTPUT
else
echo "Unsupported trigger event. It's probably an issue with the pipeline definition. Please reach out to the Test Tooling team."
From e8f60ed319788671dea106b3bb281bf19615adda Mon Sep 17 00:00:00 2001
From: Connor Stein
Date: Thu, 1 Aug 2024 17:45:46 -0400
Subject: [PATCH 19/28] Combine cap dirs (#1248)
## Motivation
CCIP cap code in one place
## Solution
Move tests + cap code into capabilities/ccip
---
.mockery.yaml | 2 +-
.../ccip}/ccip_integration_tests/.gitignore | 0
.../ccipreader/ccipreader_test.go | 0
.../chainreader/Makefile | 0
.../chainreader/chainreader_test.go | 0
.../chainreader/mycontract.go | 0
.../chainreader/mycontract.sol | 0
.../ccip}/ccip_integration_tests/helpers.go | 11 +-
.../ccip_integration_tests/home_chain_test.go | 7 +-
.../integrationhelpers/integration_helpers.go | 5 +-
.../ccip_integration_tests/ocr3_node_test.go | 0
.../ccip_integration_tests/ocr_node_helper.go | 3 +-
.../ccip_integration_tests/ping_pong_test.go | 0
.../ccip}/ccipevm/commitcodec.go | 0
.../ccip}/ccipevm/commitcodec_test.go | 0
.../ccip}/ccipevm/executecodec.go | 0
.../ccip}/ccipevm/executecodec_test.go | 0
.../ccip}/ccipevm/helpers.go | 0
.../ccip}/ccipevm/helpers_test.go | 0
.../ccip}/ccipevm/msghasher.go | 0
.../ccip}/ccipevm/msghasher_test.go | 0
.../ccip}/common/common.go | 0
.../ccip}/common/common_test.go | 3 +-
.../ccip}/configs/evm/chain_writer.go | 0
.../ccip}/configs/evm/contract_reader.go | 0
.../ccip}/delegate.go | 11 +-
core/capabilities/ccip/delegate_test.go | 1 +
.../ccip}/launcher/README.md | 4 +-
.../ccip}/launcher/bluegreen.go | 3 +-
.../ccip}/launcher/bluegreen_test.go | 5 +-
.../launcher/ccip_capability_launcher.png | Bin
.../launcher/ccip_config_state_machine.png | Bin
.../ccip}/launcher/diff.go | 3 +-
.../ccip}/launcher/diff_test.go | 3 +-
.../ccip}/launcher/integration_test.go | 5 +-
.../ccip}/launcher/launcher.go | 3 +-
.../ccip}/launcher/launcher_test.go | 117 +++++++++---------
.../ccip}/ocrimpls/config_digester.go | 0
.../ccip}/ocrimpls/config_tracker.go | 4 +-
.../ccip}/ocrimpls/contract_transmitter.go | 0
.../ocrimpls/contract_transmitter_test.go | 5 +-
.../ccip}/ocrimpls/keyring.go | 0
.../ccip}/oraclecreator/inprocess.go | 15 +--
.../ccip}/oraclecreator/inprocess_test.go | 5 +-
.../ccip}/types/mocks/ccip_oracle.go | 0
.../ccip}/types/mocks/home_chain_reader.go | 0
.../ccip}/types/mocks/oracle_creator.go | 2 +-
.../ccip}/types/types.go | 0
.../ccip}/validate/validate.go | 0
.../ccip}/validate/validate_test.go | 3 +-
core/services/ccipcapability/delegate_test.go | 1 -
core/services/chainlink/application.go | 5 +-
core/services/job/job_orm_test.go | 3 +-
53 files changed, 124 insertions(+), 105 deletions(-)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/.gitignore (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/ccipreader/ccipreader_test.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/chainreader/Makefile (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/chainreader/chainreader_test.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/chainreader/mycontract.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/chainreader/mycontract.sol (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/helpers.go (99%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/home_chain_test.go (96%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/integrationhelpers/integration_helpers.go (98%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/ocr3_node_test.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/ocr_node_helper.go (99%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccip_integration_tests/ping_pong_test.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccipevm/commitcodec.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccipevm/commitcodec_test.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccipevm/executecodec.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccipevm/executecodec_test.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccipevm/helpers.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccipevm/helpers_test.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccipevm/msghasher.go (100%)
rename core/{services/ocr3/plugins => capabilities/ccip}/ccipevm/msghasher_test.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/common/common.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/common/common_test.go (94%)
rename core/{services/ccipcapability => capabilities/ccip}/configs/evm/chain_writer.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/configs/evm/contract_reader.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/delegate.go (96%)
create mode 100644 core/capabilities/ccip/delegate_test.go
rename core/{services/ccipcapability => capabilities/ccip}/launcher/README.md (97%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/bluegreen.go (98%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/bluegreen_test.go (99%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/ccip_capability_launcher.png (100%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/ccip_config_state_machine.png (100%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/diff.go (98%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/diff_test.go (99%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/integration_test.go (94%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/launcher.go (99%)
rename core/{services/ccipcapability => capabilities/ccip}/launcher/launcher_test.go (78%)
rename core/{services/ccipcapability => capabilities/ccip}/ocrimpls/config_digester.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/ocrimpls/config_tracker.go (96%)
rename core/{services/ccipcapability => capabilities/ccip}/ocrimpls/contract_transmitter.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/ocrimpls/contract_transmitter_test.go (99%)
rename core/{services/ccipcapability => capabilities/ccip}/ocrimpls/keyring.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/oraclecreator/inprocess.go (95%)
rename core/{services/ccipcapability => capabilities/ccip}/oraclecreator/inprocess_test.go (98%)
rename core/{services/ccipcapability => capabilities/ccip}/types/mocks/ccip_oracle.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/types/mocks/home_chain_reader.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/types/mocks/oracle_creator.go (98%)
rename core/{services/ccipcapability => capabilities/ccip}/types/types.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/validate/validate.go (100%)
rename core/{services/ccipcapability => capabilities/ccip}/validate/validate_test.go (92%)
delete mode 100644 core/services/ccipcapability/delegate_test.go
diff --git a/.mockery.yaml b/.mockery.yaml
index d458eef5d5..7fb335620c 100644
--- a/.mockery.yaml
+++ b/.mockery.yaml
@@ -458,7 +458,7 @@ packages:
outpkg: mock_optimism_dispute_game_factory
interfaces:
OptimismDisputeGameFactoryInterface:
- github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types:
+ github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types:
interfaces:
CCIPOracle:
OracleCreator:
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/.gitignore b/core/capabilities/ccip/ccip_integration_tests/.gitignore
similarity index 100%
rename from core/services/ocr3/plugins/ccip_integration_tests/.gitignore
rename to core/capabilities/ccip/ccip_integration_tests/.gitignore
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/ccipreader/ccipreader_test.go b/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go
similarity index 100%
rename from core/services/ocr3/plugins/ccip_integration_tests/ccipreader/ccipreader_test.go
rename to core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/chainreader/Makefile b/core/capabilities/ccip/ccip_integration_tests/chainreader/Makefile
similarity index 100%
rename from core/services/ocr3/plugins/ccip_integration_tests/chainreader/Makefile
rename to core/capabilities/ccip/ccip_integration_tests/chainreader/Makefile
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/chainreader/chainreader_test.go b/core/capabilities/ccip/ccip_integration_tests/chainreader/chainreader_test.go
similarity index 100%
rename from core/services/ocr3/plugins/ccip_integration_tests/chainreader/chainreader_test.go
rename to core/capabilities/ccip/ccip_integration_tests/chainreader/chainreader_test.go
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/chainreader/mycontract.go b/core/capabilities/ccip/ccip_integration_tests/chainreader/mycontract.go
similarity index 100%
rename from core/services/ocr3/plugins/ccip_integration_tests/chainreader/mycontract.go
rename to core/capabilities/ccip/ccip_integration_tests/chainreader/mycontract.go
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/chainreader/mycontract.sol b/core/capabilities/ccip/ccip_integration_tests/chainreader/mycontract.sol
similarity index 100%
rename from core/services/ocr3/plugins/ccip_integration_tests/chainreader/mycontract.sol
rename to core/capabilities/ccip/ccip_integration_tests/chainreader/mycontract.sol
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/helpers.go b/core/capabilities/ccip/ccip_integration_tests/helpers.go
similarity index 99%
rename from core/services/ocr3/plugins/ccip_integration_tests/helpers.go
rename to core/capabilities/ccip/ccip_integration_tests/helpers.go
index 142337480e..3a87b72351 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/helpers.go
+++ b/core/capabilities/ccip/ccip_integration_tests/helpers.go
@@ -9,11 +9,17 @@ import (
"testing"
"time"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
+ confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
+ "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper"
+
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/arm_proxy_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config"
@@ -29,11 +35,6 @@ import (
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/shared/generated/link_token"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr3/plugins/ccip_integration_tests/integrationhelpers"
-
- confighelper2 "github.com/smartcontractkit/libocr/offchainreporting2plus/confighelper"
- "github.com/smartcontractkit/libocr/offchainreporting2plus/ocr3confighelper"
chainsel "github.com/smartcontractkit/chain-selectors"
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/home_chain_test.go b/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go
similarity index 96%
rename from core/services/ocr3/plugins/ccip_integration_tests/home_chain_test.go
rename to core/capabilities/ccip/ccip_integration_tests/home_chain_test.go
index 8e4c70d7fb..2188e9ea75 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/home_chain_test.go
+++ b/core/capabilities/ccip/ccip_integration_tests/home_chain_test.go
@@ -4,6 +4,8 @@ import (
"testing"
"time"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers"
+
mapset "github.com/deckarep/golang-set/v2"
"github.com/onsi/gomega"
@@ -13,12 +15,11 @@ import (
cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
+ "github.com/stretchr/testify/require"
+
capcfg "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr3/plugins/ccip_integration_tests/integrationhelpers"
-
- "github.com/stretchr/testify/require"
)
func TestHomeChainReader(t *testing.T) {
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/integrationhelpers/integration_helpers.go b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go
similarity index 98%
rename from core/services/ocr3/plugins/ccip_integration_tests/integrationhelpers/integration_helpers.go
rename to core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go
index 7c32734d9b..c23cd21403 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/integrationhelpers/integration_helpers.go
+++ b/core/capabilities/ccip/ccip_integration_tests/integrationhelpers/integration_helpers.go
@@ -9,6 +9,9 @@ import (
"testing"
"time"
+ configsevm "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
@@ -22,8 +25,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ocr3_config_encoder"
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- configsevm "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/configs/evm"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
"github.com/smartcontractkit/chainlink-common/pkg/types"
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go b/core/capabilities/ccip/ccip_integration_tests/ocr3_node_test.go
similarity index 100%
rename from core/services/ocr3/plugins/ccip_integration_tests/ocr3_node_test.go
rename to core/capabilities/ccip/ccip_integration_tests/ocr3_node_test.go
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/ocr_node_helper.go b/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go
similarity index 99%
rename from core/services/ocr3/plugins/ccip_integration_tests/ocr_node_helper.go
rename to core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go
index 5a3efefd4f..11fb203de5 100644
--- a/core/services/ocr3/plugins/ccip_integration_tests/ocr_node_helper.go
+++ b/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go
@@ -10,13 +10,14 @@ import (
"testing"
"time"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate"
+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
gethtypes "github.com/ethereum/go-ethereum/core/types"
"github.com/jmoiron/sqlx"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/validate"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
diff --git a/core/services/ocr3/plugins/ccip_integration_tests/ping_pong_test.go b/core/capabilities/ccip/ccip_integration_tests/ping_pong_test.go
similarity index 100%
rename from core/services/ocr3/plugins/ccip_integration_tests/ping_pong_test.go
rename to core/capabilities/ccip/ccip_integration_tests/ping_pong_test.go
diff --git a/core/services/ocr3/plugins/ccipevm/commitcodec.go b/core/capabilities/ccip/ccipevm/commitcodec.go
similarity index 100%
rename from core/services/ocr3/plugins/ccipevm/commitcodec.go
rename to core/capabilities/ccip/ccipevm/commitcodec.go
diff --git a/core/services/ocr3/plugins/ccipevm/commitcodec_test.go b/core/capabilities/ccip/ccipevm/commitcodec_test.go
similarity index 100%
rename from core/services/ocr3/plugins/ccipevm/commitcodec_test.go
rename to core/capabilities/ccip/ccipevm/commitcodec_test.go
diff --git a/core/services/ocr3/plugins/ccipevm/executecodec.go b/core/capabilities/ccip/ccipevm/executecodec.go
similarity index 100%
rename from core/services/ocr3/plugins/ccipevm/executecodec.go
rename to core/capabilities/ccip/ccipevm/executecodec.go
diff --git a/core/services/ocr3/plugins/ccipevm/executecodec_test.go b/core/capabilities/ccip/ccipevm/executecodec_test.go
similarity index 100%
rename from core/services/ocr3/plugins/ccipevm/executecodec_test.go
rename to core/capabilities/ccip/ccipevm/executecodec_test.go
diff --git a/core/services/ocr3/plugins/ccipevm/helpers.go b/core/capabilities/ccip/ccipevm/helpers.go
similarity index 100%
rename from core/services/ocr3/plugins/ccipevm/helpers.go
rename to core/capabilities/ccip/ccipevm/helpers.go
diff --git a/core/services/ocr3/plugins/ccipevm/helpers_test.go b/core/capabilities/ccip/ccipevm/helpers_test.go
similarity index 100%
rename from core/services/ocr3/plugins/ccipevm/helpers_test.go
rename to core/capabilities/ccip/ccipevm/helpers_test.go
diff --git a/core/services/ocr3/plugins/ccipevm/msghasher.go b/core/capabilities/ccip/ccipevm/msghasher.go
similarity index 100%
rename from core/services/ocr3/plugins/ccipevm/msghasher.go
rename to core/capabilities/ccip/ccipevm/msghasher.go
diff --git a/core/services/ocr3/plugins/ccipevm/msghasher_test.go b/core/capabilities/ccip/ccipevm/msghasher_test.go
similarity index 100%
rename from core/services/ocr3/plugins/ccipevm/msghasher_test.go
rename to core/capabilities/ccip/ccipevm/msghasher_test.go
diff --git a/core/services/ccipcapability/common/common.go b/core/capabilities/ccip/common/common.go
similarity index 100%
rename from core/services/ccipcapability/common/common.go
rename to core/capabilities/ccip/common/common.go
diff --git a/core/services/ccipcapability/common/common_test.go b/core/capabilities/ccip/common/common_test.go
similarity index 94%
rename from core/services/ccipcapability/common/common_test.go
rename to core/capabilities/ccip/common/common_test.go
index fc22f6ac58..a7484a83ad 100644
--- a/core/services/ccipcapability/common/common_test.go
+++ b/core/capabilities/ccip/common/common_test.go
@@ -3,6 +3,8 @@ package common_test
import (
"testing"
+ capcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common"
+
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core"
@@ -11,7 +13,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/assets"
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
- capcommon "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/common"
)
func Test_HashedCapabilityId(t *testing.T) {
diff --git a/core/services/ccipcapability/configs/evm/chain_writer.go b/core/capabilities/ccip/configs/evm/chain_writer.go
similarity index 100%
rename from core/services/ccipcapability/configs/evm/chain_writer.go
rename to core/capabilities/ccip/configs/evm/chain_writer.go
diff --git a/core/services/ccipcapability/configs/evm/contract_reader.go b/core/capabilities/ccip/configs/evm/contract_reader.go
similarity index 100%
rename from core/services/ccipcapability/configs/evm/contract_reader.go
rename to core/capabilities/ccip/configs/evm/contract_reader.go
diff --git a/core/services/ccipcapability/delegate.go b/core/capabilities/ccip/delegate.go
similarity index 96%
rename from core/services/ccipcapability/delegate.go
rename to core/capabilities/ccip/delegate.go
index 757417bc94..1b4b9e25ae 100644
--- a/core/services/ccipcapability/delegate.go
+++ b/core/capabilities/ccip/delegate.go
@@ -1,10 +1,15 @@
-package ccipcapability
+package ccip
import (
"context"
"fmt"
"time"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common"
+ configsevm "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/launcher"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/oraclecreator"
+
ragep2ptypes "github.com/smartcontractkit/libocr/ragep2p/types"
"github.com/smartcontractkit/chainlink-ccip/pkg/consts"
@@ -17,10 +22,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/config"
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/common"
- configsevm "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/configs/evm"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/launcher"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/oraclecreator"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
diff --git a/core/capabilities/ccip/delegate_test.go b/core/capabilities/ccip/delegate_test.go
new file mode 100644
index 0000000000..dd8a5124b5
--- /dev/null
+++ b/core/capabilities/ccip/delegate_test.go
@@ -0,0 +1 @@
+package ccip
diff --git a/core/services/ccipcapability/launcher/README.md b/core/capabilities/ccip/launcher/README.md
similarity index 97%
rename from core/services/ccipcapability/launcher/README.md
rename to core/capabilities/ccip/launcher/README.md
index e3cdc14205..41fbecfdbd 100644
--- a/core/services/ccipcapability/launcher/README.md
+++ b/core/capabilities/ccip/launcher/README.md
@@ -22,7 +22,7 @@ DON deletion is permanent.
## Architecture Diagram
-![CCIP Capability Launcher](./ccip_capability_launcher.png)
+![CCIP Capability Launcher](ccip_capability_launcher.png)
The above diagram shows how the CCIP capability launcher interacts with the rest of the components
in the CCIP system.
@@ -41,7 +41,7 @@ in order to match the configuration that was posted on-chain in the CR and the C
## Config State Diagram
-![CCIP Config State Machine](./ccip_config_state_machine.png)
+![CCIP Config State Machine](ccip_config_state_machine.png)
CCIP's blue/green deployment paradigm is intentionally kept as simple as possible.
diff --git a/core/services/ccipcapability/launcher/bluegreen.go b/core/capabilities/ccip/launcher/bluegreen.go
similarity index 98%
rename from core/services/ccipcapability/launcher/bluegreen.go
rename to core/capabilities/ccip/launcher/bluegreen.go
index 442925c04e..6245846629 100644
--- a/core/services/ccipcapability/launcher/bluegreen.go
+++ b/core/capabilities/ccip/launcher/bluegreen.go
@@ -3,10 +3,11 @@ package launcher
import (
"fmt"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
"go.uber.org/multierr"
ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
)
// blueGreenDeployment represents a blue-green deployment of OCR instances.
diff --git a/core/services/ccipcapability/launcher/bluegreen_test.go b/core/capabilities/ccip/launcher/bluegreen_test.go
similarity index 99%
rename from core/services/ccipcapability/launcher/bluegreen_test.go
rename to core/capabilities/ccip/launcher/bluegreen_test.go
index a18e02eda3..9fd71a0cb4 100644
--- a/core/services/ccipcapability/launcher/bluegreen_test.go
+++ b/core/capabilities/ccip/launcher/bluegreen_test.go
@@ -4,11 +4,12 @@ import (
"errors"
"testing"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+ mocktypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types/mocks"
+
"github.com/stretchr/testify/require"
ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
- mocktypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types/mocks"
)
func Test_ccipDeployment_Close(t *testing.T) {
diff --git a/core/services/ccipcapability/launcher/ccip_capability_launcher.png b/core/capabilities/ccip/launcher/ccip_capability_launcher.png
similarity index 100%
rename from core/services/ccipcapability/launcher/ccip_capability_launcher.png
rename to core/capabilities/ccip/launcher/ccip_capability_launcher.png
diff --git a/core/services/ccipcapability/launcher/ccip_config_state_machine.png b/core/capabilities/ccip/launcher/ccip_config_state_machine.png
similarity index 100%
rename from core/services/ccipcapability/launcher/ccip_config_state_machine.png
rename to core/capabilities/ccip/launcher/ccip_config_state_machine.png
diff --git a/core/services/ccipcapability/launcher/diff.go b/core/capabilities/ccip/launcher/diff.go
similarity index 98%
rename from core/services/ccipcapability/launcher/diff.go
rename to core/capabilities/ccip/launcher/diff.go
index bbc5684edf..e44b5478ed 100644
--- a/core/services/ccipcapability/launcher/diff.go
+++ b/core/capabilities/ccip/launcher/diff.go
@@ -3,10 +3,11 @@ package launcher
import (
"fmt"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common"
+
ragep2ptypes "github.com/smartcontractkit/libocr/ragep2p/types"
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/common"
"github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer"
)
diff --git a/core/services/ccipcapability/launcher/diff_test.go b/core/capabilities/ccip/launcher/diff_test.go
similarity index 99%
rename from core/services/ccipcapability/launcher/diff_test.go
rename to core/capabilities/ccip/launcher/diff_test.go
index 5892933207..37371945ab 100644
--- a/core/services/ccipcapability/launcher/diff_test.go
+++ b/core/capabilities/ccip/launcher/diff_test.go
@@ -6,11 +6,12 @@ import (
"reflect"
"testing"
+ capcommon "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/common"
+
ragep2ptypes "github.com/smartcontractkit/libocr/ragep2p/types"
"github.com/stretchr/testify/require"
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
- capcommon "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/common"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
"github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
"github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer"
diff --git a/core/services/ccipcapability/launcher/integration_test.go b/core/capabilities/ccip/launcher/integration_test.go
similarity index 94%
rename from core/services/ccipcapability/launcher/integration_test.go
rename to core/capabilities/ccip/launcher/integration_test.go
index 29a2b92f0c..58b6a5d6a2 100644
--- a/core/services/ccipcapability/launcher/integration_test.go
+++ b/core/capabilities/ccip/launcher/integration_test.go
@@ -4,14 +4,15 @@ import (
"testing"
"time"
+ it "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccip_integration_tests/integrationhelpers"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
"github.com/onsi/gomega"
"github.com/stretchr/testify/require"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
- it "github.com/smartcontractkit/chainlink/v2/core/services/ocr3/plugins/ccip_integration_tests/integrationhelpers"
"github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer"
)
diff --git a/core/services/ccipcapability/launcher/launcher.go b/core/capabilities/ccip/launcher/launcher.go
similarity index 99%
rename from core/services/ccipcapability/launcher/launcher.go
rename to core/capabilities/ccip/launcher/launcher.go
index 66aaef8cc0..9acfebfa9a 100644
--- a/core/services/ccipcapability/launcher/launcher.go
+++ b/core/capabilities/ccip/launcher/launcher.go
@@ -6,6 +6,8 @@ import (
"sync"
"time"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
"go.uber.org/multierr"
ragep2ptypes "github.com/smartcontractkit/libocr/ragep2p/types"
@@ -16,7 +18,6 @@ import (
ccipreader "github.com/smartcontractkit/chainlink-ccip/pkg/reader"
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
p2ptypes "github.com/smartcontractkit/chainlink/v2/core/services/p2p/types"
"github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer"
diff --git a/core/services/ccipcapability/launcher/launcher_test.go b/core/capabilities/ccip/launcher/launcher_test.go
similarity index 78%
rename from core/services/ccipcapability/launcher/launcher_test.go
rename to core/capabilities/ccip/launcher/launcher_test.go
index 6f8fa7b664..493f962c2c 100644
--- a/core/services/ccipcapability/launcher/launcher_test.go
+++ b/core/capabilities/ccip/launcher/launcher_test.go
@@ -6,6 +6,9 @@ import (
"reflect"
"testing"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types/mocks"
+
ragep2ptypes "github.com/smartcontractkit/libocr/ragep2p/types"
"github.com/stretchr/testify/mock"
"github.com/stretchr/testify/require"
@@ -15,8 +18,6 @@ import (
kcr "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/keystone/generated/capabilities_registry"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
- mockcctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types/mocks"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/p2pkey"
"github.com/smartcontractkit/chainlink/v2/core/services/registrysyncer"
)
@@ -29,21 +30,21 @@ func Test_createOracle(t *testing.T) {
myP2PKey := p2pKeys[0]
type args struct {
p2pID ragep2ptypes.PeerID
- oracleCreator *mockcctypes.OracleCreator
+ oracleCreator *mocks.OracleCreator
pluginType cctypes.PluginType
ocrConfigs []ccipreaderpkg.OCR3ConfigWithMeta
}
tests := []struct {
name string
args args
- expect func(t *testing.T, args args, oracleCreator *mockcctypes.OracleCreator)
+ expect func(t *testing.T, args args, oracleCreator *mocks.OracleCreator)
wantErr bool
}{
{
"success, no bootstrap",
args{
myP2PKey,
- mockcctypes.NewOracleCreator(t),
+ mocks.NewOracleCreator(t),
cctypes.PluginTypeCCIPCommit,
[]ccipreaderpkg.OCR3ConfigWithMeta{
{
@@ -53,10 +54,10 @@ func Test_createOracle(t *testing.T) {
},
},
},
- func(t *testing.T, args args, oracleCreator *mockcctypes.OracleCreator) {
+ func(t *testing.T, args args, oracleCreator *mocks.OracleCreator) {
oracleCreator.
On("CreatePluginOracle", cctypes.PluginTypeCCIPCommit, cctypes.OCR3ConfigWithMeta(args.ocrConfigs[0])).
- Return(mockcctypes.NewCCIPOracle(t), nil)
+ Return(mocks.NewCCIPOracle(t), nil)
},
false,
},
@@ -64,7 +65,7 @@ func Test_createOracle(t *testing.T) {
"success, with bootstrap",
args{
myP2PKey,
- mockcctypes.NewOracleCreator(t),
+ mocks.NewOracleCreator(t),
cctypes.PluginTypeCCIPCommit,
[]ccipreaderpkg.OCR3ConfigWithMeta{
{
@@ -76,13 +77,13 @@ func Test_createOracle(t *testing.T) {
},
},
},
- func(t *testing.T, args args, oracleCreator *mockcctypes.OracleCreator) {
+ func(t *testing.T, args args, oracleCreator *mocks.OracleCreator) {
oracleCreator.
On("CreatePluginOracle", cctypes.PluginTypeCCIPCommit, cctypes.OCR3ConfigWithMeta(args.ocrConfigs[0])).
- Return(mockcctypes.NewCCIPOracle(t), nil)
+ Return(mocks.NewCCIPOracle(t), nil)
oracleCreator.
On("CreateBootstrapOracle", cctypes.OCR3ConfigWithMeta(args.ocrConfigs[0])).
- Return(mockcctypes.NewCCIPOracle(t), nil)
+ Return(mocks.NewCCIPOracle(t), nil)
},
false,
},
@@ -90,7 +91,7 @@ func Test_createOracle(t *testing.T) {
"error creating plugin oracle",
args{
myP2PKey,
- mockcctypes.NewOracleCreator(t),
+ mocks.NewOracleCreator(t),
cctypes.PluginTypeCCIPCommit,
[]ccipreaderpkg.OCR3ConfigWithMeta{
{
@@ -100,7 +101,7 @@ func Test_createOracle(t *testing.T) {
},
},
},
- func(t *testing.T, args args, oracleCreator *mockcctypes.OracleCreator) {
+ func(t *testing.T, args args, oracleCreator *mocks.OracleCreator) {
oracleCreator.
On("CreatePluginOracle", cctypes.PluginTypeCCIPCommit, cctypes.OCR3ConfigWithMeta(args.ocrConfigs[0])).
Return(nil, errors.New("error creating oracle"))
@@ -111,7 +112,7 @@ func Test_createOracle(t *testing.T) {
"error creating bootstrap oracle",
args{
myP2PKey,
- mockcctypes.NewOracleCreator(t),
+ mocks.NewOracleCreator(t),
cctypes.PluginTypeCCIPCommit,
[]ccipreaderpkg.OCR3ConfigWithMeta{
{
@@ -123,10 +124,10 @@ func Test_createOracle(t *testing.T) {
},
},
},
- func(t *testing.T, args args, oracleCreator *mockcctypes.OracleCreator) {
+ func(t *testing.T, args args, oracleCreator *mocks.OracleCreator) {
oracleCreator.
On("CreatePluginOracle", cctypes.PluginTypeCCIPCommit, cctypes.OCR3ConfigWithMeta(args.ocrConfigs[0])).
- Return(mockcctypes.NewCCIPOracle(t), nil)
+ Return(mocks.NewCCIPOracle(t), nil)
oracleCreator.
On("CreateBootstrapOracle", cctypes.OCR3ConfigWithMeta(args.ocrConfigs[0])).
Return(nil, errors.New("error creating oracle"))
@@ -151,14 +152,14 @@ func Test_createDON(t *testing.T) {
type args struct {
lggr logger.Logger
p2pID ragep2ptypes.PeerID
- homeChainReader *mockcctypes.HomeChainReader
- oracleCreator *mockcctypes.OracleCreator
+ homeChainReader *mocks.HomeChainReader
+ oracleCreator *mocks.OracleCreator
don kcr.CapabilitiesRegistryDONInfo
}
tests := []struct {
name string
args args
- expect func(t *testing.T, args args, oracleCreator *mockcctypes.OracleCreator, homeChainReader *mockcctypes.HomeChainReader)
+ expect func(t *testing.T, args args, oracleCreator *mocks.OracleCreator, homeChainReader *mocks.HomeChainReader)
wantErr bool
}{
{
@@ -166,8 +167,8 @@ func Test_createDON(t *testing.T) {
args{
logger.TestLogger(t),
ragep2ptypes.PeerID(p2pkey.MustNewV2XXXTestingOnly(big.NewInt(1)).PeerID()),
- mockcctypes.NewHomeChainReader(t),
- mockcctypes.NewOracleCreator(t),
+ mocks.NewHomeChainReader(t),
+ mocks.NewOracleCreator(t),
kcr.CapabilitiesRegistryDONInfo{
NodeP2PIds: [][32]byte{
p2pkey.MustNewV2XXXTestingOnly(big.NewInt(2)).PeerID(),
@@ -175,7 +176,7 @@ func Test_createDON(t *testing.T) {
Id: 2,
},
},
- func(t *testing.T, args args, oracleCreator *mockcctypes.OracleCreator, homeChainReader *mockcctypes.HomeChainReader) {
+ func(t *testing.T, args args, oracleCreator *mocks.OracleCreator, homeChainReader *mocks.HomeChainReader) {
},
false,
},
@@ -184,8 +185,8 @@ func Test_createDON(t *testing.T) {
args{
logger.TestLogger(t),
ragep2ptypes.PeerID(p2pkey.MustNewV2XXXTestingOnly(big.NewInt(1)).PeerID()),
- mockcctypes.NewHomeChainReader(t),
- mockcctypes.NewOracleCreator(t),
+ mocks.NewHomeChainReader(t),
+ mocks.NewOracleCreator(t),
kcr.CapabilitiesRegistryDONInfo{
NodeP2PIds: [][32]byte{
p2pkey.MustNewV2XXXTestingOnly(big.NewInt(1)).PeerID(),
@@ -193,7 +194,7 @@ func Test_createDON(t *testing.T) {
Id: 1,
},
},
- func(t *testing.T, args args, oracleCreator *mockcctypes.OracleCreator, homeChainReader *mockcctypes.HomeChainReader) {
+ func(t *testing.T, args args, oracleCreator *mocks.OracleCreator, homeChainReader *mocks.HomeChainReader) {
homeChainReader.
On("GetOCRConfigs", mock.Anything, uint32(1), uint8(cctypes.PluginTypeCCIPCommit)).
Return([]ccipreaderpkg.OCR3ConfigWithMeta{{}}, nil)
@@ -202,10 +203,10 @@ func Test_createDON(t *testing.T) {
Return([]ccipreaderpkg.OCR3ConfigWithMeta{{}}, nil)
oracleCreator.
On("CreatePluginOracle", cctypes.PluginTypeCCIPCommit, mock.Anything).
- Return(mockcctypes.NewCCIPOracle(t), nil)
+ Return(mocks.NewCCIPOracle(t), nil)
oracleCreator.
On("CreatePluginOracle", cctypes.PluginTypeCCIPExec, mock.Anything).
- Return(mockcctypes.NewCCIPOracle(t), nil)
+ Return(mocks.NewCCIPOracle(t), nil)
},
false,
},
@@ -229,7 +230,7 @@ func Test_createFutureBlueGreenDeployment(t *testing.T) {
type args struct {
prevDeployment ccipDeployment
ocrConfigs []ccipreaderpkg.OCR3ConfigWithMeta
- oracleCreator *mockcctypes.OracleCreator
+ oracleCreator *mocks.OracleCreator
pluginType cctypes.PluginType
}
tests := []struct {
@@ -258,8 +259,8 @@ func Test_updateDON(t *testing.T) {
type args struct {
lggr logger.Logger
p2pID ragep2ptypes.PeerID
- homeChainReader *mockcctypes.HomeChainReader
- oracleCreator *mockcctypes.OracleCreator
+ homeChainReader *mocks.HomeChainReader
+ oracleCreator *mocks.OracleCreator
prevDeployment ccipDeployment
don kcr.CapabilitiesRegistryDONInfo
}
@@ -289,8 +290,8 @@ func Test_launcher_processDiff(t *testing.T) {
type fields struct {
lggr logger.Logger
p2pID ragep2ptypes.PeerID
- homeChainReader *mockcctypes.HomeChainReader
- oracleCreator *mockcctypes.OracleCreator
+ homeChainReader *mocks.HomeChainReader
+ oracleCreator *mocks.OracleCreator
dons map[registrysyncer.DonID]*ccipDeployment
regState registrysyncer.State
}
@@ -311,15 +312,15 @@ func Test_launcher_processDiff(t *testing.T) {
1: {
commit: blueGreenDeployment{
blue: newMock(t,
- func(t *testing.T) *mockcctypes.CCIPOracle { return mockcctypes.NewCCIPOracle(t) },
- func(m *mockcctypes.CCIPOracle) {
+ func(t *testing.T) *mocks.CCIPOracle { return mocks.NewCCIPOracle(t) },
+ func(m *mocks.CCIPOracle) {
m.On("Close").Return(nil)
}),
},
exec: blueGreenDeployment{
blue: newMock(t,
- func(t *testing.T) *mockcctypes.CCIPOracle { return mockcctypes.NewCCIPOracle(t) },
- func(m *mockcctypes.CCIPOracle) {
+ func(t *testing.T) *mocks.CCIPOracle { return mocks.NewCCIPOracle(t) },
+ func(m *mocks.CCIPOracle) {
m.On("Close").Return(nil)
}),
},
@@ -353,20 +354,20 @@ func Test_launcher_processDiff(t *testing.T) {
fields{
lggr: logger.TestLogger(t),
p2pID: ragep2ptypes.PeerID(p2pkey.MustNewV2XXXTestingOnly(big.NewInt(1)).PeerID()),
- homeChainReader: newMock(t, func(t *testing.T) *mockcctypes.HomeChainReader {
- return mockcctypes.NewHomeChainReader(t)
- }, func(m *mockcctypes.HomeChainReader) {
+ homeChainReader: newMock(t, func(t *testing.T) *mocks.HomeChainReader {
+ return mocks.NewHomeChainReader(t)
+ }, func(m *mocks.HomeChainReader) {
m.On("GetOCRConfigs", mock.Anything, uint32(1), uint8(cctypes.PluginTypeCCIPCommit)).
Return([]ccipreaderpkg.OCR3ConfigWithMeta{{}}, nil)
m.On("GetOCRConfigs", mock.Anything, uint32(1), uint8(cctypes.PluginTypeCCIPExec)).
Return([]ccipreaderpkg.OCR3ConfigWithMeta{{}}, nil)
}),
- oracleCreator: newMock(t, func(t *testing.T) *mockcctypes.OracleCreator {
- return mockcctypes.NewOracleCreator(t)
- }, func(m *mockcctypes.OracleCreator) {
- commitOracle := mockcctypes.NewCCIPOracle(t)
+ oracleCreator: newMock(t, func(t *testing.T) *mocks.OracleCreator {
+ return mocks.NewOracleCreator(t)
+ }, func(m *mocks.OracleCreator) {
+ commitOracle := mocks.NewCCIPOracle(t)
commitOracle.On("Start").Return(nil)
- execOracle := mockcctypes.NewCCIPOracle(t)
+ execOracle := mocks.NewCCIPOracle(t)
execOracle.On("Start").Return(nil)
m.On("CreatePluginOracle", cctypes.PluginTypeCCIPCommit, mock.Anything).
Return(commitOracle, nil)
@@ -401,20 +402,20 @@ func Test_launcher_processDiff(t *testing.T) {
fields{
lggr: logger.TestLogger(t),
p2pID: ragep2ptypes.PeerID(p2pkey.MustNewV2XXXTestingOnly(big.NewInt(1)).PeerID()),
- homeChainReader: newMock(t, func(t *testing.T) *mockcctypes.HomeChainReader {
- return mockcctypes.NewHomeChainReader(t)
- }, func(m *mockcctypes.HomeChainReader) {
+ homeChainReader: newMock(t, func(t *testing.T) *mocks.HomeChainReader {
+ return mocks.NewHomeChainReader(t)
+ }, func(m *mocks.HomeChainReader) {
m.On("GetOCRConfigs", mock.Anything, uint32(1), uint8(cctypes.PluginTypeCCIPCommit)).
Return([]ccipreaderpkg.OCR3ConfigWithMeta{{}, {}}, nil)
m.On("GetOCRConfigs", mock.Anything, uint32(1), uint8(cctypes.PluginTypeCCIPExec)).
Return([]ccipreaderpkg.OCR3ConfigWithMeta{{}, {}}, nil)
}),
- oracleCreator: newMock(t, func(t *testing.T) *mockcctypes.OracleCreator {
- return mockcctypes.NewOracleCreator(t)
- }, func(m *mockcctypes.OracleCreator) {
- commitOracle := mockcctypes.NewCCIPOracle(t)
+ oracleCreator: newMock(t, func(t *testing.T) *mocks.OracleCreator {
+ return mocks.NewOracleCreator(t)
+ }, func(m *mocks.OracleCreator) {
+ commitOracle := mocks.NewCCIPOracle(t)
commitOracle.On("Start").Return(nil)
- execOracle := mockcctypes.NewCCIPOracle(t)
+ execOracle := mocks.NewCCIPOracle(t)
execOracle.On("Start").Return(nil)
m.On("CreatePluginOracle", cctypes.PluginTypeCCIPCommit, mock.Anything).
Return(commitOracle, nil)
@@ -424,14 +425,14 @@ func Test_launcher_processDiff(t *testing.T) {
dons: map[registrysyncer.DonID]*ccipDeployment{
1: {
commit: blueGreenDeployment{
- blue: newMock(t, func(t *testing.T) *mockcctypes.CCIPOracle {
- return mockcctypes.NewCCIPOracle(t)
- }, func(m *mockcctypes.CCIPOracle) {}),
+ blue: newMock(t, func(t *testing.T) *mocks.CCIPOracle {
+ return mocks.NewCCIPOracle(t)
+ }, func(m *mocks.CCIPOracle) {}),
},
exec: blueGreenDeployment{
- blue: newMock(t, func(t *testing.T) *mockcctypes.CCIPOracle {
- return mockcctypes.NewCCIPOracle(t)
- }, func(m *mockcctypes.CCIPOracle) {}),
+ blue: newMock(t, func(t *testing.T) *mocks.CCIPOracle {
+ return mocks.NewCCIPOracle(t)
+ }, func(m *mocks.CCIPOracle) {}),
},
},
},
diff --git a/core/services/ccipcapability/ocrimpls/config_digester.go b/core/capabilities/ccip/ocrimpls/config_digester.go
similarity index 100%
rename from core/services/ccipcapability/ocrimpls/config_digester.go
rename to core/capabilities/ccip/ocrimpls/config_digester.go
diff --git a/core/services/ccipcapability/ocrimpls/config_tracker.go b/core/capabilities/ccip/ocrimpls/config_tracker.go
similarity index 96%
rename from core/services/ccipcapability/ocrimpls/config_tracker.go
rename to core/capabilities/ccip/ocrimpls/config_tracker.go
index 2bf329b55e..f32c796a7a 100644
--- a/core/services/ccipcapability/ocrimpls/config_tracker.go
+++ b/core/capabilities/ccip/ocrimpls/config_tracker.go
@@ -3,10 +3,10 @@ package ocrimpls
import (
"context"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
gethcommon "github.com/ethereum/go-ethereum/common"
"github.com/smartcontractkit/libocr/offchainreporting2plus/types"
-
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
)
type configTracker struct {
diff --git a/core/services/ccipcapability/ocrimpls/contract_transmitter.go b/core/capabilities/ccip/ocrimpls/contract_transmitter.go
similarity index 100%
rename from core/services/ccipcapability/ocrimpls/contract_transmitter.go
rename to core/capabilities/ccip/ocrimpls/contract_transmitter.go
diff --git a/core/services/ccipcapability/ocrimpls/contract_transmitter_test.go b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go
similarity index 99%
rename from core/services/ccipcapability/ocrimpls/contract_transmitter_test.go
rename to core/capabilities/ccip/ocrimpls/contract_transmitter_test.go
index 46d96f83d8..4e0a7162aa 100644
--- a/core/services/ccipcapability/ocrimpls/contract_transmitter_test.go
+++ b/core/capabilities/ccip/ocrimpls/contract_transmitter_test.go
@@ -7,6 +7,9 @@ import (
"testing"
"time"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ocrimpls"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
"github.com/ethereum/go-ethereum/accounts/abi/bind"
"github.com/ethereum/go-ethereum/accounts/abi/bind/backends"
"github.com/ethereum/go-ethereum/common"
@@ -39,8 +42,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/ocrimpls"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
kschaintype "github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
diff --git a/core/services/ccipcapability/ocrimpls/keyring.go b/core/capabilities/ccip/ocrimpls/keyring.go
similarity index 100%
rename from core/services/ccipcapability/ocrimpls/keyring.go
rename to core/capabilities/ccip/ocrimpls/keyring.go
diff --git a/core/services/ccipcapability/oraclecreator/inprocess.go b/core/capabilities/ccip/oraclecreator/inprocess.go
similarity index 95%
rename from core/services/ccipcapability/oraclecreator/inprocess.go
rename to core/capabilities/ccip/oraclecreator/inprocess.go
index 594ff73a76..1d17867846 100644
--- a/core/services/ccipcapability/oraclecreator/inprocess.go
+++ b/core/capabilities/ccip/oraclecreator/inprocess.go
@@ -5,6 +5,11 @@ import (
"fmt"
"time"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ccipevm"
+ evmconfig "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/configs/evm"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/ocrimpls"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/google/uuid"
@@ -28,13 +33,9 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/types"
"github.com/smartcontractkit/chainlink/v2/core/chains/legacyevm"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- evmconfigs "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/configs/evm"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/ocrimpls"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/chaintype"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore/keys/ocr2key"
- "github.com/smartcontractkit/chainlink/v2/core/services/ocr3/plugins/ccipevm"
"github.com/smartcontractkit/chainlink/v2/core/services/ocrcommon"
"github.com/smartcontractkit/chainlink/v2/core/services/relay"
"github.com/smartcontractkit/chainlink/v2/core/services/relay/evm"
@@ -153,9 +154,9 @@ func (i *inprocessOracleCreator) CreatePluginOracle(pluginType cctypes.PluginTyp
for _, chain := range i.chains.Slice() {
var chainReaderConfig evmrelaytypes.ChainReaderConfig
if chain.ID().Uint64() == destChainID {
- chainReaderConfig = evmconfigs.DestReaderConfig()
+ chainReaderConfig = evmconfig.DestReaderConfig()
} else {
- chainReaderConfig = evmconfigs.SourceReaderConfig()
+ chainReaderConfig = evmconfig.SourceReaderConfig()
}
cr, err2 := evm.NewChainReaderService(
context.Background(),
@@ -207,7 +208,7 @@ func (i *inprocessOracleCreator) CreatePluginOracle(pluginType cctypes.PluginTyp
chain.Client(),
chain.TxManager(),
chain.GasEstimator(),
- evmconfigs.ChainWriterConfigRaw(fromAddress, chain.Config().EVM().GasEstimator().PriceMaxKey(fromAddress)),
+ evmconfig.ChainWriterConfigRaw(fromAddress, chain.Config().EVM().GasEstimator().PriceMaxKey(fromAddress)),
)
if err2 != nil {
return nil, fmt.Errorf("failed to create chain writer for chain %s: %w", chain.ID(), err2)
diff --git a/core/services/ccipcapability/oraclecreator/inprocess_test.go b/core/capabilities/ccip/oraclecreator/inprocess_test.go
similarity index 98%
rename from core/services/ccipcapability/oraclecreator/inprocess_test.go
rename to core/capabilities/ccip/oraclecreator/inprocess_test.go
index dfc5aac10e..639f01e62e 100644
--- a/core/services/ccipcapability/oraclecreator/inprocess_test.go
+++ b/core/capabilities/ccip/oraclecreator/inprocess_test.go
@@ -5,6 +5,9 @@ import (
"testing"
"time"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/oraclecreator"
+ cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
+
"github.com/ethereum/go-ethereum/common/hexutil"
"github.com/google/uuid"
"github.com/hashicorp/consul/sdk/freeport"
@@ -29,8 +32,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/configtest"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils/pgtest"
"github.com/smartcontractkit/chainlink/v2/core/logger"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/oraclecreator"
- cctypes "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
"github.com/smartcontractkit/chainlink/v2/core/services/keystore"
diff --git a/core/services/ccipcapability/types/mocks/ccip_oracle.go b/core/capabilities/ccip/types/mocks/ccip_oracle.go
similarity index 100%
rename from core/services/ccipcapability/types/mocks/ccip_oracle.go
rename to core/capabilities/ccip/types/mocks/ccip_oracle.go
diff --git a/core/services/ccipcapability/types/mocks/home_chain_reader.go b/core/capabilities/ccip/types/mocks/home_chain_reader.go
similarity index 100%
rename from core/services/ccipcapability/types/mocks/home_chain_reader.go
rename to core/capabilities/ccip/types/mocks/home_chain_reader.go
diff --git a/core/services/ccipcapability/types/mocks/oracle_creator.go b/core/capabilities/ccip/types/mocks/oracle_creator.go
similarity index 98%
rename from core/services/ccipcapability/types/mocks/oracle_creator.go
rename to core/capabilities/ccip/types/mocks/oracle_creator.go
index 5a0f892af1..d83ad042bf 100644
--- a/core/services/ccipcapability/types/mocks/oracle_creator.go
+++ b/core/capabilities/ccip/types/mocks/oracle_creator.go
@@ -3,7 +3,7 @@
package mocks
import (
- types "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/types"
+ types "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types"
mock "github.com/stretchr/testify/mock"
)
diff --git a/core/services/ccipcapability/types/types.go b/core/capabilities/ccip/types/types.go
similarity index 100%
rename from core/services/ccipcapability/types/types.go
rename to core/capabilities/ccip/types/types.go
diff --git a/core/services/ccipcapability/validate/validate.go b/core/capabilities/ccip/validate/validate.go
similarity index 100%
rename from core/services/ccipcapability/validate/validate.go
rename to core/capabilities/ccip/validate/validate.go
diff --git a/core/services/ccipcapability/validate/validate_test.go b/core/capabilities/ccip/validate/validate_test.go
similarity index 92%
rename from core/services/ccipcapability/validate/validate_test.go
rename to core/capabilities/ccip/validate/validate_test.go
index e56da69336..97958f4cf9 100644
--- a/core/services/ccipcapability/validate/validate_test.go
+++ b/core/capabilities/ccip/validate/validate_test.go
@@ -3,9 +3,10 @@ package validate_test
import (
"testing"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate"
+
"github.com/stretchr/testify/require"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/validate"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
)
diff --git a/core/services/ccipcapability/delegate_test.go b/core/services/ccipcapability/delegate_test.go
deleted file mode 100644
index b725c930ad..0000000000
--- a/core/services/ccipcapability/delegate_test.go
+++ /dev/null
@@ -1 +0,0 @@
-package ccipcapability
diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go
index 28ad951050..de3e4c6280 100644
--- a/core/services/chainlink/application.go
+++ b/core/services/chainlink/application.go
@@ -8,6 +8,8 @@ import (
"net/http"
"sync"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip"
+
"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
"github.com/google/uuid"
@@ -27,7 +29,6 @@ import (
"github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox"
"github.com/smartcontractkit/chainlink/v2/core/capabilities"
"github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability"
"github.com/smartcontractkit/chainlink/v2/core/services/standardcapabilities"
"github.com/smartcontractkit/chainlink/v2/core/static"
@@ -522,7 +523,7 @@ func NewApplication(opts ApplicationOpts) (Application, error) {
cfg.Insecure(),
opts.RelayerChainInteroperators,
)
- delegates[job.CCIP] = ccipcapability.NewDelegate(
+ delegates[job.CCIP] = ccip.NewDelegate(
globalLogger,
loopRegistrarConfig,
pipelineRunner,
diff --git a/core/services/job/job_orm_test.go b/core/services/job/job_orm_test.go
index 36ce025630..348d29747d 100644
--- a/core/services/job/job_orm_test.go
+++ b/core/services/job/job_orm_test.go
@@ -7,6 +7,8 @@ import (
"testing"
"time"
+ "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/validate"
+
"github.com/ethereum/go-ethereum/common"
"github.com/google/uuid"
"github.com/lib/pq"
@@ -34,7 +36,6 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/logger"
"github.com/smartcontractkit/chainlink/v2/core/services/blockhashstore"
"github.com/smartcontractkit/chainlink/v2/core/services/blockheaderfeeder"
- "github.com/smartcontractkit/chainlink/v2/core/services/ccipcapability/validate"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
"github.com/smartcontractkit/chainlink/v2/core/services/directrequest"
"github.com/smartcontractkit/chainlink/v2/core/services/job"
From 6e8269ccf9deb96680bfbb30a4b37a8ad5fcd46a Mon Sep 17 00:00:00 2001
From: Kodey Thomas
Date: Fri, 2 Aug 2024 12:50:23 +0100
Subject: [PATCH 20/28] Add L3X Config (#13987)
* Add L3X Config
* Changeset
* comments
* comments
---
.changeset/cool-mirrors-beg.md | 5 +
.../evm/config/toml/defaults/L3X_Mainnet.toml | 18 ++
.../evm/config/toml/defaults/L3X_Sepolia.toml | 18 ++
docs/CONFIG.md | 188 ++++++++++++++++++
4 files changed, 229 insertions(+)
create mode 100644 .changeset/cool-mirrors-beg.md
create mode 100644 core/chains/evm/config/toml/defaults/L3X_Mainnet.toml
create mode 100644 core/chains/evm/config/toml/defaults/L3X_Sepolia.toml
diff --git a/.changeset/cool-mirrors-beg.md b/.changeset/cool-mirrors-beg.md
new file mode 100644
index 0000000000..a030ac7e3a
--- /dev/null
+++ b/.changeset/cool-mirrors-beg.md
@@ -0,0 +1,5 @@
+---
+"chainlink": patch
+---
+
+#added L3X Config
diff --git a/core/chains/evm/config/toml/defaults/L3X_Mainnet.toml b/core/chains/evm/config/toml/defaults/L3X_Mainnet.toml
new file mode 100644
index 0000000000..1fbda42fd2
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/L3X_Mainnet.toml
@@ -0,0 +1,18 @@
+ChainID = '12324'
+ChainType = 'arbitrum'
+FinalityTagEnabled = true
+FinalityDepth = 10
+LinkContractAddress = '0x79f531a3D07214304F259DC28c7191513223bcf3'
+# Produces blocks on-demand
+NoNewHeadsThreshold = '0'
+OCR.ContractConfirmations = 1
+LogPollInterval = '10s'
+
+[GasEstimator]
+Mode = 'Arbitrum'
+LimitMax = 1_000_000_000
+# Arbitrum-based chains uses the suggested gas price, so we don't want to place any limits on the minimum
+PriceMin = '0'
+PriceDefault = '0.1 gwei'
+FeeCapDefault = '1000 gwei'
+BumpThreshold = 5
diff --git a/core/chains/evm/config/toml/defaults/L3X_Sepolia.toml b/core/chains/evm/config/toml/defaults/L3X_Sepolia.toml
new file mode 100644
index 0000000000..ee515bb72b
--- /dev/null
+++ b/core/chains/evm/config/toml/defaults/L3X_Sepolia.toml
@@ -0,0 +1,18 @@
+ChainID = '12325'
+ChainType = 'arbitrum'
+FinalityTagEnabled = true
+FinalityDepth = 10
+LinkContractAddress = '0xa71848C99155DA0b245981E5ebD1C94C4be51c43'
+# Produces blocks on-demand
+NoNewHeadsThreshold = '0'
+OCR.ContractConfirmations = 1
+LogPollInterval = '10s'
+
+[GasEstimator]
+Mode = 'Arbitrum'
+LimitMax = 1_000_000_000
+# Arbitrum-based chains uses the suggested gas price, so we don't want to place any limits on the minimum
+PriceMin = '0'
+PriceDefault = '0.1 gwei'
+FeeCapDefault = '1000 gwei'
+BumpThreshold = 5
diff --git a/docs/CONFIG.md b/docs/CONFIG.md
index 4d8d6f6cf1..acff2531af 100644
--- a/docs/CONFIG.md
+++ b/docs/CONFIG.md
@@ -5400,6 +5400,194 @@ GasLimit = 5400000
+Mode Mainnet (34443)
```toml
From de92ff06084cb0c5cac4e08356ebf70786f9e147 Mon Sep 17 00:00:00 2001
From: Adam Hamrick
Date: Fri, 2 Aug 2024 11:02:07 -0400
Subject: [PATCH 21/28] Fix Version Migration Test (#1254)
---
.../workflows/client-compatibility-tests.yml | 3 +-
.github/workflows/integration-tests.yml | 42 +++++++++++++++++--
2 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/.github/workflows/client-compatibility-tests.yml b/.github/workflows/client-compatibility-tests.yml
index 228920842a..19ed0329fd 100644
--- a/.github/workflows/client-compatibility-tests.yml
+++ b/.github/workflows/client-compatibility-tests.yml
@@ -29,7 +29,7 @@ on:
type: string
env:
- CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink
+ CHAINLINK_IMAGE: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com/chainlink-ccip
INTERNAL_DOCKER_REPO: ${{ secrets.QA_AWS_ACCOUNT_NUMBER }}.dkr.ecr.${{ secrets.QA_AWS_REGION }}.amazonaws.com
MOD_CACHE_VERSION: 2
@@ -270,7 +270,6 @@ jobs:
if: |
always() &&
needs.should-run.outputs.should_run == 'true' &&
- github.ref_type != 'tag' &&
(
needs.select-versions.outputs.evm_implementations != '' ||
github.event.inputs.base64TestList != ''
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index 28f02a7094..339bc98df4 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -808,7 +808,8 @@ jobs:
echo "Error: The latest_version is empty. The migration tests need a verison to run."
exit 1
fi
- echo "latest_version=${latest_version}" >> "$GITHUB_OUTPUT"
+ # CCIP uses the `-release` suffix for their versions
+ echo "latest_version=${latest_version}-release" >> "$GITHUB_OUTPUT"
- name: Name Versions
run: |
echo "Running migration tests from version '${{ steps.get_latest_version.outputs.latest_version }}' to: '${{ inputs.evm-ref || github.sha }}'"
@@ -868,5 +869,40 @@ jobs:
env:
SLACK_BOT_TOKEN: ${{ secrets.QA_SLACK_API_KEY }}
with:
- channel-id: "#team-test-tooling-internal"
- slack-message: ":x: :mild-panic-intensifies: Node Migration Tests Failed: \n${{ format('https://github.com/{0}/actions/runs/{1}', github.repository, github.run_id) }}"
\ No newline at end of file
+ channel-id: "C05QQ8Z342V"
+ slack-message: "CCIP Node Migration Tests Failed :x: \n${{ format('https://github.com/{0}/actions/runs/{1}', github.repository, github.run_id) }}"
+ payload: |
+ {
+ "attachments": [
+ {
+ "color": "${{ contains(join(needs.*.result, ','), 'failure') && '#C62828' || '#2E7D32' }}",
+ "blocks": [
+ {
+ "type": "header",
+ "text": {
+ "type": "plain_text",
+ "text": "CCIP Version Migration Test Results ${{ contains(join(needs.*.result, ','), 'failure') && ':x:' || ':white_check_mark:'}}",
+ "emoji": true
+ }
+ },
+ {
+ "type": "section",
+ "text": {
+ "type": "mrkdwn",
+ "text": "${{ contains(join(needs.*.result, ','), 'failure') && 'Some tests failed! Notifying ' || 'All Good!' }}"
+ }
+ },
+ {
+ "type": "divider"
+ },
+ {
+ "type": "section",
+ "text": {
+ "type": "mrkdwn",
+ "text": "<${{ github.server_url }}/${{ github.repository }}/releases/tag/${{ github.ref_name }}|${{ github.ref_name }}> | <${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}|${{ github.sha }}> | <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|Run>"
+ }
+ }
+ ]
+ }
+ ]
+ }
From eae928c012890257de1bc87f410d41dacba2c383 Mon Sep 17 00:00:00 2001
From: Rens Rooimans
Date: Fri, 2 Aug 2024 19:57:07 +0200
Subject: [PATCH 22/28] Remove revert cases in exec race conditions (#1246)
## Motivation
Since the separation of manual exec window and DON exec window, it would
theoretically be possible that two executions happen at the same time
(although unlikely).
## Solution
Remove reverts to ensure other msgs in the batches are unaffected
---------
Co-authored-by: app-token-issuer-infra-releng[bot] <120227048+app-token-issuer-infra-releng[bot]@users.noreply.github.com>
---
contracts/gas-snapshots/ccip.gas-snapshot | 202 +++++++++---------
.../v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol | 20 +-
.../src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol | 22 +-
.../test/offRamp/EVM2EVMMultiOffRamp.t.sol | 34 ++-
.../ccip/test/offRamp/EVM2EVMOffRamp.t.sol | 159 +++++++-------
.../evm_2_evm_multi_offramp.go | 134 +++++++++++-
.../evm_2_evm_offramp/evm_2_evm_offramp.go | 133 +++++++++++-
...rapper-dependency-versions-do-not-edit.txt | 4 +-
.../ccip/mocks/evm2_evm_off_ramp_interface.go | 175 +++++++++++++++
9 files changed, 657 insertions(+), 226 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 9d31647634..07822638c6 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -120,7 +120,7 @@ CommitStore_verify:test_Paused_Revert() (gas: 18496)
CommitStore_verify:test_TooManyLeaves_Revert() (gas: 36785)
DefensiveExampleTest:test_HappyPath_Success() (gas: 200018)
DefensiveExampleTest:test_Recovery() (gas: 424253)
-E2E:test_E2E_3MessagesSuccess_gas() (gas: 1110438)
+E2E:test_E2E_3MessagesSuccess_gas() (gas: 1110291)
EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_NotACompatiblePool_Revert() (gas: 38157)
EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_Success() (gas: 108321)
EVM2EVMMultiOffRamp__releaseOrMintSingleToken:test__releaseOrMintSingleToken_TokenHandlingError_revert_Revert() (gas: 116789)
@@ -131,19 +131,19 @@ EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChainOnRam
EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ReplaceExistingChain_Success() (gas: 105586)
EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroOnRampAddress_Revert() (gas: 15719)
EVM2EVMMultiOffRamp_applySourceChainConfigUpdates:test_ZeroSourceChainSelector_Revert() (gas: 13057)
-EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 298564)
-EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 239899)
-EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 158863)
-EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189303)
-EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 147582)
-EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 521464)
+EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsDifferentChains_Success() (gas: 298417)
+EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSameChain_Success() (gas: 239752)
+EVM2EVMMultiOffRamp_batchExecute:test_MultipleReportsSkipDuplicate_Success() (gas: 158869)
+EVM2EVMMultiOffRamp_batchExecute:test_OutOfBoundsGasLimitsAccess_Revert() (gas: 189205)
+EVM2EVMMultiOffRamp_batchExecute:test_SingleReport_Success() (gas: 147533)
+EVM2EVMMultiOffRamp_batchExecute:test_Unhealthy_Revert() (gas: 521366)
EVM2EVMMultiOffRamp_batchExecute:test_ZeroReports_Revert() (gas: 10459)
EVM2EVMMultiOffRamp_ccipReceive:test_Reverts() (gas: 15662)
EVM2EVMMultiOffRamp_commit:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 67195)
EVM2EVMMultiOffRamp_commit:test_InvalidInterval_Revert() (gas: 59698)
EVM2EVMMultiOffRamp_commit:test_InvalidRootRevert() (gas: 58778)
-EVM2EVMMultiOffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6394807)
-EVM2EVMMultiOffRamp_commit:test_NoConfig_Revert() (gas: 5978034)
+EVM2EVMMultiOffRamp_commit:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6373551)
+EVM2EVMMultiOffRamp_commit:test_NoConfig_Revert() (gas: 5956778)
EVM2EVMMultiOffRamp_commit:test_OnlyGasPriceUpdates_Success() (gas: 106229)
EVM2EVMMultiOffRamp_commit:test_OnlyPriceUpdateStaleReport_Revert() (gas: 116228)
EVM2EVMMultiOffRamp_commit:test_OnlyTokenPriceUpdates_Success() (gas: 106272)
@@ -156,25 +156,25 @@ EVM2EVMMultiOffRamp_commit:test_StaleReportWithRoot_Success() (gas: 227807)
EVM2EVMMultiOffRamp_commit:test_UnauthorizedTransmitter_Revert() (gas: 117527)
EVM2EVMMultiOffRamp_commit:test_Unhealthy_Revert() (gas: 77605)
EVM2EVMMultiOffRamp_commit:test_ValidPriceUpdateThenStaleReportWithRoot_Success() (gas: 207057)
-EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6389196)
+EVM2EVMMultiOffRamp_commit:test_WrongConfigWithoutSigners_Revert() (gas: 6367940)
EVM2EVMMultiOffRamp_commit:test_ZeroEpochAndRound_Revert() (gas: 47785)
-EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5980336)
-EVM2EVMMultiOffRamp_constructor:test_SourceChainSelector_Revert() (gas: 157326)
-EVM2EVMMultiOffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103815)
-EVM2EVMMultiOffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101686)
-EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 159832)
-EVM2EVMMultiOffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 101585)
-EVM2EVMMultiOffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101652)
+EVM2EVMMultiOffRamp_constructor:test_Constructor_Success() (gas: 5959080)
+EVM2EVMMultiOffRamp_constructor:test_SourceChainSelector_Revert() (gas: 157297)
+EVM2EVMMultiOffRamp_constructor:test_ZeroChainSelector_Revert() (gas: 103786)
+EVM2EVMMultiOffRamp_constructor:test_ZeroNonceManager_Revert() (gas: 101657)
+EVM2EVMMultiOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 159802)
+EVM2EVMMultiOffRamp_constructor:test_ZeroRMNProxy_Revert() (gas: 101556)
+EVM2EVMMultiOffRamp_constructor:test_ZeroTokenAdminRegistry_Revert() (gas: 101623)
EVM2EVMMultiOffRamp_execute:test_IncorrectArrayType_Revert() (gas: 17280)
-EVM2EVMMultiOffRamp_execute:test_LargeBatch_Success() (gas: 1559406)
-EVM2EVMMultiOffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 342924)
-EVM2EVMMultiOffRamp_execute:test_MultipleReports_Success() (gas: 260178)
-EVM2EVMMultiOffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6445313)
-EVM2EVMMultiOffRamp_execute:test_NoConfig_Revert() (gas: 6028259)
+EVM2EVMMultiOffRamp_execute:test_LargeBatch_Success() (gas: 1557936)
+EVM2EVMMultiOffRamp_execute:test_MultipleReportsWithPartialValidationFailures_Success() (gas: 342777)
+EVM2EVMMultiOffRamp_execute:test_MultipleReports_Success() (gas: 260031)
+EVM2EVMMultiOffRamp_execute:test_NoConfigWithOtherConfigPresent_Revert() (gas: 6424008)
+EVM2EVMMultiOffRamp_execute:test_NoConfig_Revert() (gas: 6006954)
EVM2EVMMultiOffRamp_execute:test_NonArray_Revert() (gas: 27681)
-EVM2EVMMultiOffRamp_execute:test_SingleReport_Success() (gas: 165181)
-EVM2EVMMultiOffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 149137)
-EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6807388)
+EVM2EVMMultiOffRamp_execute:test_SingleReport_Success() (gas: 165132)
+EVM2EVMMultiOffRamp_execute:test_UnauthorizedTransmitter_Revert() (gas: 149088)
+EVM2EVMMultiOffRamp_execute:test_WrongConfigWithSigners_Revert() (gas: 6786083)
EVM2EVMMultiOffRamp_execute:test_ZeroReports_Revert() (gas: 17154)
EVM2EVMMultiOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 18413)
EVM2EVMMultiOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 249346)
@@ -188,46 +188,46 @@ EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Su
EVM2EVMMultiOffRamp_executeSingleMessage:test_executeSingleMessage_WithValidation_Success() (gas: 93615)
EVM2EVMMultiOffRamp_executeSingleReport:test_DisabledSourceChain_Revert() (gas: 35083)
EVM2EVMMultiOffRamp_executeSingleReport:test_EmptyReport_Revert() (gas: 23907)
-EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 451314)
-EVM2EVMMultiOffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 54475)
+EVM2EVMMultiOffRamp_executeSingleReport:test_InvalidSourcePoolAddress_Success() (gas: 451216)
+EVM2EVMMultiOffRamp_executeSingleReport:test_ManualExecutionNotYetEnabled_Revert() (gas: 54426)
EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingDestChainSelector_Revert() (gas: 35917)
EVM2EVMMultiOffRamp_executeSingleReport:test_MismatchingOnRampRoot_Revert() (gas: 154369)
EVM2EVMMultiOffRamp_executeSingleReport:test_NonExistingSourceChain_Revert() (gas: 35317)
-EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181353)
-EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 190627)
+EVM2EVMMultiOffRamp_executeSingleReport:test_ReceiverError_Success() (gas: 181304)
+EVM2EVMMultiOffRamp_executeSingleReport:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 192594)
EVM2EVMMultiOffRamp_executeSingleReport:test_RootNotCommitted_Revert() (gas: 48053)
-EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 443030)
-EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 251770)
-EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 173962)
-EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193657)
-EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 259648)
-EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 129585)
-EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 391688)
-EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 65899)
-EVM2EVMMultiOffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 80955)
-EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 535385)
-EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 480301)
+EVM2EVMMultiOffRamp_executeSingleReport:test_RouterYULCall_Revert() (gas: 442981)
+EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensOtherChain_Success() (gas: 251672)
+EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokensUnordered_Success() (gas: 173864)
+EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageNoTokens_Success() (gas: 193559)
+EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessageToNonCCIPReceiver_Success() (gas: 259599)
+EVM2EVMMultiOffRamp_executeSingleReport:test_SingleMessagesNoTokensSuccess_gas() (gas: 129536)
+EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 391590)
+EVM2EVMMultiOffRamp_executeSingleReport:test_SkippedIncorrectNonce_Success() (gas: 65850)
+EVM2EVMMultiOffRamp_executeSingleReport:test_TokenDataMismatch_Revert() (gas: 80906)
+EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensAndGE_Success() (gas: 535287)
+EVM2EVMMultiOffRamp_executeSingleReport:test_TwoMessagesWithTokensSuccess_gas() (gas: 480203)
EVM2EVMMultiOffRamp_executeSingleReport:test_UnexpectedTokenData_Revert() (gas: 35763)
-EVM2EVMMultiOffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 520300)
-EVM2EVMMultiOffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 517668)
-EVM2EVMMultiOffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 487804)
-EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 127921)
-EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 157144)
+EVM2EVMMultiOffRamp_executeSingleReport:test_UnhealthySingleChainCurse_Revert() (gas: 520202)
+EVM2EVMMultiOffRamp_executeSingleReport:test_Unhealthy_Revert() (gas: 517570)
+EVM2EVMMultiOffRamp_executeSingleReport:test_WithCurseOnAnotherSourceChain_Success() (gas: 487706)
+EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 127927)
+EVM2EVMMultiOffRamp_executeSingleReport:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 157150)
EVM2EVMMultiOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3655340)
EVM2EVMMultiOffRamp_getExecutionState:test_GetDifferentChainExecutionState_Success() (gas: 118224)
EVM2EVMMultiOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 87461)
EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecGasLimitMismatchSingleReport_Revert() (gas: 75600)
EVM2EVMMultiOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 26461)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 163081)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207379)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 163032)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_FailedTx_Revert() (gas: 207236)
EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ForkedChain_Revert() (gas: 26004)
EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_GasLimitMismatchMultipleReports_Revert() (gas: 152867)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 507480)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails() (gas: 2307903)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209633)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210210)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 668610)
-EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 299477)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_LowGasLimit_Success() (gas: 507382)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_ReentrancyFails_Success() (gas: 2285227)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_Success() (gas: 209491)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithGasOverride_Success() (gas: 210112)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithMultiReportGasOverride_Success() (gas: 668120)
+EVM2EVMMultiOffRamp_manuallyExecute:test_manuallyExecute_WithPartialMessages_Success() (gas: 299303)
EVM2EVMMultiOffRamp_releaseOrMintTokens:test_TokenHandlingError_Reverts() (gas: 160598)
EVM2EVMMultiOffRamp_releaseOrMintTokens:test__releaseOrMintTokens_PoolIsNotAPool_Reverts() (gas: 24131)
EVM2EVMMultiOffRamp_releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthReturnData_Revert() (gas: 59105)
@@ -300,41 +300,41 @@ EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidDataLengthRe
EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_InvalidEVMAddress_Revert() (gas: 44959)
EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_Success() (gas: 214456)
EVM2EVMOffRamp__releaseOrMintTokens:test_releaseOrMintTokens_destDenominatedDecimals_Success() (gas: 307176)
-EVM2EVMOffRamp__report:test_Report_Success() (gas: 127459)
+EVM2EVMOffRamp__report:test_Report_Success() (gas: 127410)
EVM2EVMOffRamp__trialExecute:test_RateLimitError_Success() (gas: 255279)
EVM2EVMOffRamp__trialExecute:test_TokenHandlingErrorIsCaught_Success() (gas: 263870)
EVM2EVMOffRamp__trialExecute:test_TokenPoolIsNotAContract_Success() (gas: 336203)
EVM2EVMOffRamp__trialExecute:test_trialExecute_Success() (gas: 314960)
EVM2EVMOffRamp_ccipReceive:test_Reverts() (gas: 17009)
-EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153158)
-EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5275448)
-EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143892)
+EVM2EVMOffRamp_constructor:test_CommitStoreAlreadyInUse_Revert() (gas: 153130)
+EVM2EVMOffRamp_constructor:test_Constructor_Success() (gas: 5257993)
+EVM2EVMOffRamp_constructor:test_ZeroOnRampAddress_Revert() (gas: 143864)
EVM2EVMOffRamp_execute:test_EmptyReport_Revert() (gas: 21323)
EVM2EVMOffRamp_execute:test_InvalidMessageId_Revert() (gas: 36486)
-EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51701)
-EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 473025)
-EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 46423)
-EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152453)
-EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 102724)
-EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 164818)
-EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Revert() (gas: 177584)
+EVM2EVMOffRamp_execute:test_InvalidSourceChain_Revert() (gas: 51652)
+EVM2EVMOffRamp_execute:test_InvalidSourcePoolAddress_Success() (gas: 472927)
+EVM2EVMOffRamp_execute:test_ManualExecutionNotYetEnabled_Revert() (gas: 46374)
+EVM2EVMOffRamp_execute:test_MessageTooLarge_Revert() (gas: 152404)
+EVM2EVMOffRamp_execute:test_Paused_Revert() (gas: 102702)
+EVM2EVMOffRamp_execute:test_ReceiverError_Success() (gas: 164769)
+EVM2EVMOffRamp_execute:test_RetryFailedMessageWithoutManualExecution_Success() (gas: 179100)
EVM2EVMOffRamp_execute:test_RootNotCommitted_Revert() (gas: 41317)
-EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159365)
-EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 174600)
-EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248634)
-EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 115040)
-EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 410767)
-EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54196)
-EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132056)
-EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52178)
-EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 561690)
-EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 500288)
+EVM2EVMOffRamp_execute:test_SingleMessageNoTokensUnordered_Success() (gas: 159267)
+EVM2EVMOffRamp_execute:test_SingleMessageNoTokens_Success() (gas: 174480)
+EVM2EVMOffRamp_execute:test_SingleMessageToNonCCIPReceiver_Success() (gas: 248585)
+EVM2EVMOffRamp_execute:test_SingleMessagesNoTokensSuccess_gas() (gas: 114991)
+EVM2EVMOffRamp_execute:test_SkippedIncorrectNonceStillExecutes_Success() (gas: 410714)
+EVM2EVMOffRamp_execute:test_SkippedIncorrectNonce_Success() (gas: 54147)
+EVM2EVMOffRamp_execute:test_StrictUntouchedToSuccess_Success() (gas: 132007)
+EVM2EVMOffRamp_execute:test_TokenDataMismatch_Revert() (gas: 52129)
+EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensAndGE_Success() (gas: 561592)
+EVM2EVMOffRamp_execute:test_TwoMessagesWithTokensSuccess_gas() (gas: 500168)
EVM2EVMOffRamp_execute:test_UnexpectedTokenData_Revert() (gas: 35486)
-EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 549267)
-EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 64023)
-EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123201)
-EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 143411)
-EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 428233)
+EVM2EVMOffRamp_execute:test_Unhealthy_Revert() (gas: 549169)
+EVM2EVMOffRamp_execute:test_UnsupportedNumberOfTokens_Revert() (gas: 63974)
+EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessageUnordered_Success() (gas: 123206)
+EVM2EVMOffRamp_execute:test__execute_SkippedAlreadyExecutedMessage_Success() (gas: 143416)
+EVM2EVMOffRamp_execute:test_execute_RouterYULCall_Success() (gas: 428184)
EVM2EVMOffRamp_executeSingleMessage:test_MessageSender_Revert() (gas: 20582)
EVM2EVMOffRamp_executeSingleMessage:test_NonContractWithTokens_Success() (gas: 282255)
EVM2EVMOffRamp_executeSingleMessage:test_NonContract_Success() (gas: 20209)
@@ -343,23 +343,23 @@ EVM2EVMOffRamp_executeSingleMessage:test_ZeroGasDONExecution_Revert() (gas: 4863
EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_NoTokens_Success() (gas: 48098)
EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_WithTokens_Success() (gas: 317243)
EVM2EVMOffRamp_executeSingleMessage:test_executeSingleMessage_ZeroGasZeroData_Success() (gas: 72423)
-EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 231326)
-EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 279867)
-EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 261109)
-EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 229397)
-EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131682)
+EVM2EVMOffRamp_execute_upgrade:test_V2NonceNewSenderStartsAtZero_Success() (gas: 231228)
+EVM2EVMOffRamp_execute_upgrade:test_V2NonceStartsAtV1Nonce_Success() (gas: 279720)
+EVM2EVMOffRamp_execute_upgrade:test_V2OffRampNonceSkipsIfMsgInFlight_Success() (gas: 260962)
+EVM2EVMOffRamp_execute_upgrade:test_V2SenderNoncesReadsPreviousRamp_Success() (gas: 229250)
+EVM2EVMOffRamp_execute_upgrade:test_V2_Success() (gas: 131633)
EVM2EVMOffRamp_getAllRateLimitTokens:test_GetAllRateLimitTokens_Success() (gas: 38408)
EVM2EVMOffRamp_getExecutionState:test_FillExecutionState_Success() (gas: 3213556)
EVM2EVMOffRamp_getExecutionState:test_GetExecutionState_Success() (gas: 83091)
-EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 483110)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 185977)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25824)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43449)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25927)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188300)
-EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187747)
-EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails() (gas: 2050054)
-EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143563)
+EVM2EVMOffRamp_manuallyExecute:test_LowGasLimitManualExec_Success() (gas: 483152)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExecFailedTx_Revert() (gas: 186041)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExecForkedChain_Revert() (gas: 25894)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExecGasLimitMismatch_Revert() (gas: 43519)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExecInvalidGasLimit_Revert() (gas: 25997)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExecWithGasOverride_Success() (gas: 188342)
+EVM2EVMOffRamp_manuallyExecute:test_ManualExec_Success() (gas: 187789)
+EVM2EVMOffRamp_manuallyExecute:test_ReentrancyManualExecuteFails_Success() (gas: 2027924)
+EVM2EVMOffRamp_manuallyExecute:test_manuallyExecute_DoesNotRevertIfUntouched_Success() (gas: 143654)
EVM2EVMOffRamp_metadataHash:test_MetadataHash_Success() (gas: 8838)
EVM2EVMOffRamp_setDynamicConfig:test_NonOwner_Revert() (gas: 40131)
EVM2EVMOffRamp_setDynamicConfig:test_RouterZeroAddress_Revert() (gas: 38214)
@@ -593,18 +593,18 @@ MultiOCR3Base_transmit:test_UnauthorizedSigner_Revert() (gas: 61409)
MultiOCR3Base_transmit:test_UnconfiguredPlugin_Revert() (gas: 39890)
MultiOCR3Base_transmit:test_ZeroSignatures_Revert() (gas: 32973)
MultiOnRampTokenPoolReentrancy:test_OnRampTokenPoolReentrancy_Success() (gas: 412263)
-MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1426954)
+MultiRampsE2E:test_E2E_3MessagesSuccess_gas() (gas: 1426807)
NonceManager_NonceIncrementation:test_getIncrementedOutboundNonce_Success() (gas: 37907)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Skip() (gas: 23694)
NonceManager_NonceIncrementation:test_incrementInboundNonce_Success() (gas: 38763)
NonceManager_NonceIncrementation:test_incrementNoncesInboundAndOutbound_Success() (gas: 71847)
-NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 252566)
-NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 254866)
-NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 307885)
-NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 290962)
-NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 247990)
-NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 236024)
-NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 144774)
+NonceManager_OffRampUpgrade:test_NoPrevOffRampForChain_Success() (gas: 252468)
+NonceManager_OffRampUpgrade:test_UpgradedNonceNewSenderStartsAtZero_Success() (gas: 254768)
+NonceManager_OffRampUpgrade:test_UpgradedNonceStartsAtV1Nonce_Success() (gas: 307738)
+NonceManager_OffRampUpgrade:test_UpgradedOffRampNonceSkipsIfMsgInFlight_Success() (gas: 290815)
+NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRampTransitive_Success() (gas: 247843)
+NonceManager_OffRampUpgrade:test_UpgradedSenderNoncesReadsPreviousRamp_Success() (gas: 235877)
+NonceManager_OffRampUpgrade:test_Upgraded_Success() (gas: 144725)
NonceManager_OnRampUpgrade:test_UpgradeNonceNewSenderStartsAtZero_Success() (gas: 186694)
NonceManager_OnRampUpgrade:test_UpgradeNonceStartsAtV1Nonce_Success() (gas: 237762)
NonceManager_OnRampUpgrade:test_UpgradeSenderNoncesReadsPreviousRamp_Success() (gas: 125070)
diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol
index 809e4e22a4..89c066dd11 100644
--- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol
@@ -33,7 +33,6 @@ contract EVM2EVMMultiOffRamp is ITypeAndVersion, MultiOCR3Base {
using ERC165Checker for address;
using EnumerableMapAddresses for EnumerableMapAddresses.AddressToAddressMap;
- error AlreadyAttempted(uint64 sourceChainSelector, uint64 sequenceNumber);
error AlreadyExecuted(uint64 sourceChainSelector, uint64 sequenceNumber);
error ZeroChainSelectorNotAllowed();
error ExecutionError(bytes32 messageId, bytes err);
@@ -74,6 +73,7 @@ contract EVM2EVMMultiOffRamp is ITypeAndVersion, MultiOCR3Base {
event SourceChainSelectorAdded(uint64 sourceChainSelector);
event SourceChainConfigSet(uint64 indexed sourceChainSelector, SourceChainConfig sourceConfig);
event SkippedAlreadyExecutedMessage(uint64 sourceChainSelector, uint64 sequenceNumber);
+ event AlreadyAttempted(uint64 sourceChainSelector, uint64 sequenceNumber);
/// @dev RMN depends on this event, if changing, please notify the RMN maintainers.
event CommitReportAccepted(CommitReport report);
event RootRemoved(bytes32 root);
@@ -375,13 +375,6 @@ contract EVM2EVMMultiOffRamp is ITypeAndVersion, MultiOCR3Base {
Internal.MessageExecutionState originalState =
getExecutionState(sourceChainSelector, message.header.sequenceNumber);
- if (originalState == Internal.MessageExecutionState.SUCCESS) {
- // If the message has already been executed, we skip it. We want to not revert on race conditions between
- // executing parties. This will allow us to open up manual exec while also attempting with the DON, without
- // reverting an entire DON batch when a user manually executes while the tx is inflight.
- emit SkippedAlreadyExecutedMessage(sourceChainSelector, message.header.sequenceNumber);
- continue;
- }
// Two valid cases here, we either have never touched this message before, or we tried to execute
// and failed. This check protects against reentry and re-execution because the other state is
// IN_PROGRESS which should not be allowed to execute.
@@ -390,7 +383,13 @@ contract EVM2EVMMultiOffRamp is ITypeAndVersion, MultiOCR3Base {
originalState == Internal.MessageExecutionState.UNTOUCHED
|| originalState == Internal.MessageExecutionState.FAILURE
)
- ) revert AlreadyExecuted(sourceChainSelector, message.header.sequenceNumber);
+ ) {
+ // If the message has already been executed, we skip it. We want to not revert on race conditions between
+ // executing parties. This will allow us to open up manual exec while also attempting with the DON, without
+ // reverting an entire DON batch when a user manually executes while the tx is inflight.
+ emit SkippedAlreadyExecutedMessage(sourceChainSelector, message.header.sequenceNumber);
+ continue;
+ }
if (manualExecution) {
bool isOldCommitReport =
@@ -409,7 +408,8 @@ contract EVM2EVMMultiOffRamp is ITypeAndVersion, MultiOCR3Base {
// DON can only execute a message once
// Acceptable state transitions: UNTOUCHED->SUCCESS, UNTOUCHED->FAILURE
if (originalState != Internal.MessageExecutionState.UNTOUCHED) {
- revert AlreadyAttempted(sourceChainSelector, message.header.sequenceNumber);
+ emit AlreadyAttempted(sourceChainSelector, message.header.sequenceNumber);
+ continue;
}
}
diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
index 3904ab81cf..abf60981de 100644
--- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMOffRamp.sol
@@ -34,7 +34,6 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
using ERC165Checker for address;
using EnumerableMapAddresses for EnumerableMapAddresses.AddressToAddressMap;
- error AlreadyAttempted(uint64 sequenceNumber);
error AlreadyExecuted(uint64 sequenceNumber);
error ZeroAddressNotAllowed();
error CommitStoreAlreadyInUse();
@@ -69,6 +68,7 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
event TokenAggregateRateLimitAdded(address sourceToken, address destToken);
event TokenAggregateRateLimitRemoved(address sourceToken, address destToken);
event SkippedAlreadyExecutedMessage(uint64 indexed sequenceNumber);
+ event AlreadyAttempted(uint64 sequenceNumber);
/// @notice Static offRamp config
/// @dev RMN depends on this struct, if changing, please notify the RMN maintainers.
@@ -276,13 +276,6 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
for (uint256 i = 0; i < numMsgs; ++i) {
Internal.EVM2EVMMessage memory message = report.messages[i];
Internal.MessageExecutionState originalState = getExecutionState(message.sequenceNumber);
- if (originalState == Internal.MessageExecutionState.SUCCESS) {
- // If the message has already been executed, we skip it. We want to not revert on race conditions between
- // executing parties. This will allow us to open up manual exec while also attempting with the DON, without
- // reverting an entire DON batch when a user manually executes while the tx is inflight.
- emit SkippedAlreadyExecutedMessage(message.sequenceNumber);
- continue;
- }
// Two valid cases here, we either have never touched this message before, or we tried to execute
// and failed. This check protects against reentry and re-execution because the other state is
// IN_PROGRESS which should not be allowed to execute.
@@ -291,7 +284,13 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
originalState == Internal.MessageExecutionState.UNTOUCHED
|| originalState == Internal.MessageExecutionState.FAILURE
)
- ) revert AlreadyExecuted(message.sequenceNumber);
+ ) {
+ // If the message has already been executed, we skip it. We want to not revert on race conditions between
+ // executing parties. This will allow us to open up manual exec while also attempting with the DON, without
+ // reverting an entire DON batch when a user manually executes while the tx is inflight.
+ emit SkippedAlreadyExecutedMessage(message.sequenceNumber);
+ continue;
+ }
if (manualExecution) {
bool isOldCommitReport =
@@ -309,7 +308,10 @@ contract EVM2EVMOffRamp is IAny2EVMOffRamp, AggregateRateLimiter, ITypeAndVersio
} else {
// DON can only execute a message once
// Acceptable state transitions: UNTOUCHED->SUCCESS, UNTOUCHED->FAILURE
- if (originalState != Internal.MessageExecutionState.UNTOUCHED) revert AlreadyAttempted(message.sequenceNumber);
+ if (originalState != Internal.MessageExecutionState.UNTOUCHED) {
+ emit AlreadyAttempted(message.sequenceNumber);
+ continue;
+ }
}
if (message.nonce != 0) {
diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol
index 43899cbfd6..fcb0d9006c 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMMultiOffRamp.t.sol
@@ -945,11 +945,10 @@ contract EVM2EVMMultiOffRamp_executeSingleReport is EVM2EVMMultiOffRampSetup {
);
s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0));
- vm.expectRevert(
- abi.encodeWithSelector(
- EVM2EVMMultiOffRamp.AlreadyAttempted.selector, SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber
- )
- );
+ // The second time should skip the msg
+ vm.expectEmit();
+ emit EVM2EVMMultiOffRamp.AlreadyAttempted(SOURCE_CHAIN_SELECTOR_1, messages[0].header.sequenceNumber);
+
s_offRamp.executeSingleReport(_generateReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), new uint256[](0));
}
@@ -1681,7 +1680,7 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup {
s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides);
}
- function test_manuallyExecute_ReentrancyFails() public {
+ function test_manuallyExecute_ReentrancyFails_Success() public {
uint256 tokenAmount = 1e9;
IERC20 tokenToAbuse = IERC20(s_destFeeToken);
@@ -1715,29 +1714,26 @@ contract EVM2EVMMultiOffRamp_manuallyExecute is EVM2EVMMultiOffRampSetup {
uint256[][] memory gasLimitOverrides = new uint256[][](1);
gasLimitOverrides[0] = _getGasLimitsFromMessages(messages);
- // The first entry should be fine and triggers the second entry. This one fails
- // but since it's an inner tx of the first one it is caught in the try-catch.
- // This means the first tx is marked `FAILURE` with the error message of the second tx.
+ // The first entry should be fine and triggers the second entry which is skipped. Due to the reentrancy
+ // the second completes first, so we expect the skip event before the success event.
+ vm.expectEmit();
+ emit EVM2EVMMultiOffRamp.SkippedAlreadyExecutedMessage(
+ messages[0].header.sourceChainSelector, messages[0].header.sequenceNumber
+ );
+
vm.expectEmit();
emit EVM2EVMMultiOffRamp.ExecutionStateChanged(
messages[0].header.sourceChainSelector,
messages[0].header.sequenceNumber,
messages[0].header.messageId,
- Internal.MessageExecutionState.FAILURE,
- abi.encodeWithSelector(
- EVM2EVMMultiOffRamp.ReceiverError.selector,
- abi.encodeWithSelector(
- EVM2EVMMultiOffRamp.AlreadyExecuted.selector,
- messages[0].header.sourceChainSelector,
- messages[0].header.sequenceNumber
- )
- )
+ Internal.MessageExecutionState.SUCCESS,
+ ""
);
s_offRamp.manuallyExecute(_generateBatchReportFromMessages(SOURCE_CHAIN_SELECTOR_1, messages), gasLimitOverrides);
// Since the tx failed we don't release the tokens
- assertEq(tokenToAbuse.balanceOf(address(receiver)), balancePre);
+ assertEq(tokenToAbuse.balanceOf(address(receiver)), balancePre + tokenAmount);
}
}
diff --git a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
index 64501c9a1e..89f0f95fd4 100644
--- a/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/offRamp/EVM2EVMOffRamp.t.sol
@@ -633,6 +633,36 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup {
s_offRamp.execute(executionReport, new uint256[](0));
}
+ function test_RetryFailedMessageWithoutManualExecution_Success() public {
+ Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage();
+
+ bytes memory realError1 = new bytes(2);
+ realError1[0] = 0xbe;
+ realError1[1] = 0xef;
+ s_reverting_receiver.setErr(realError1);
+
+ messages[0].receiver = address(s_reverting_receiver);
+ messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash());
+
+ vm.expectEmit();
+ emit EVM2EVMOffRamp.ExecutionStateChanged(
+ messages[0].sequenceNumber,
+ messages[0].messageId,
+ Internal.MessageExecutionState.FAILURE,
+ abi.encodeWithSelector(
+ EVM2EVMOffRamp.ReceiverError.selector,
+ abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, realError1)
+ )
+ );
+ s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0));
+
+ // The second time should skip the msg
+ vm.expectEmit();
+ emit EVM2EVMOffRamp.AlreadyAttempted(messages[0].sequenceNumber);
+
+ s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0));
+ }
+
// Reverts
function test_InvalidMessageId_Revert() public {
@@ -744,33 +774,6 @@ contract EVM2EVMOffRamp_execute is EVM2EVMOffRampSetup {
);
s_offRamp.execute(executionReport, new uint256[](0));
}
-
- function test_RetryFailedMessageWithoutManualExecution_Revert() public {
- Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage();
-
- bytes memory realError1 = new bytes(2);
- realError1[0] = 0xbe;
- realError1[1] = 0xef;
- s_reverting_receiver.setErr(realError1);
-
- messages[0].receiver = address(s_reverting_receiver);
- messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash());
-
- vm.expectEmit();
- emit EVM2EVMOffRamp.ExecutionStateChanged(
- messages[0].sequenceNumber,
- messages[0].messageId,
- Internal.MessageExecutionState.FAILURE,
- abi.encodeWithSelector(
- EVM2EVMOffRamp.ReceiverError.selector,
- abi.encodeWithSelector(MaybeRevertMessageReceiver.CustomError.selector, realError1)
- )
- );
- s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0));
-
- vm.expectRevert(abi.encodeWithSelector(EVM2EVMOffRamp.AlreadyAttempted.selector, messages[0].sequenceNumber));
- s_offRamp.execute(_generateReportFromMessages(messages), new uint256[](0));
- }
}
contract EVM2EVMOffRamp_execute_upgrade is EVM2EVMOffRampSetup {
@@ -1144,6 +1147,55 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup {
s_offRamp.manuallyExecute(_generateReportFromMessages(messages), gasLimitOverrides);
}
+ function test_ReentrancyManualExecuteFails_Success() public {
+ uint256 tokenAmount = 1e9;
+ IERC20 tokenToAbuse = IERC20(s_destFeeToken);
+
+ // This needs to be deployed before the source chain message is sent
+ // because we need the address for the receiver.
+ ReentrancyAbuser receiver = new ReentrancyAbuser(address(s_destRouter), s_offRamp);
+ uint256 balancePre = tokenToAbuse.balanceOf(address(receiver));
+
+ // For this test any message will be flagged as correct by the
+ // commitStore. In a real scenario the abuser would have to actually
+ // send the message that they want to replay.
+ Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage();
+ messages[0].tokenAmounts = new Client.EVMTokenAmount[](1);
+ messages[0].tokenAmounts[0] = Client.EVMTokenAmount({token: s_sourceFeeToken, amount: tokenAmount});
+ messages[0].receiver = address(receiver);
+ messages[0].sourceTokenData = new bytes[](1);
+ messages[0].sourceTokenData[0] = abi.encode(
+ Internal.SourceTokenData({
+ sourcePoolAddress: abi.encode(s_sourcePoolByToken[s_sourceFeeToken]),
+ destTokenAddress: abi.encode(s_destTokenBySourceToken[s_sourceFeeToken]),
+ extraData: "",
+ destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
+ })
+ );
+
+ messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash());
+
+ Internal.ExecutionReport memory report = _generateReportFromMessages(messages);
+
+ // sets the report to be repeated on the ReentrancyAbuser to be able to replay
+ receiver.setPayload(report);
+
+ // The first entry should be fine and triggers the second entry which is skipped. Due to the reentrancy
+ // the second completes first, so we expect the skip event before the success event.
+ vm.expectEmit();
+ emit EVM2EVMOffRamp.SkippedAlreadyExecutedMessage(messages[0].sequenceNumber);
+
+ vm.expectEmit();
+ emit EVM2EVMOffRamp.ExecutionStateChanged(
+ messages[0].sequenceNumber, messages[0].messageId, Internal.MessageExecutionState.SUCCESS, ""
+ );
+
+ s_offRamp.manuallyExecute(report, _getGasLimitsFromMessages(messages));
+
+ // Assert that they only got the tokens once, not twice
+ assertEq(tokenToAbuse.balanceOf(address(receiver)), balancePre + tokenAmount);
+ }
+
function test_ManualExecForkedChain_Revert() public {
Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage();
@@ -1200,59 +1252,6 @@ contract EVM2EVMOffRamp_manuallyExecute is EVM2EVMOffRampSetup {
);
s_offRamp.manuallyExecute(_generateReportFromMessages(messages), _getGasLimitsFromMessages(messages));
}
-
- function test_ReentrancyManualExecuteFails() public {
- uint256 tokenAmount = 1e9;
- IERC20 tokenToAbuse = IERC20(s_destFeeToken);
-
- // This needs to be deployed before the source chain message is sent
- // because we need the address for the receiver.
- ReentrancyAbuser receiver = new ReentrancyAbuser(address(s_destRouter), s_offRamp);
- uint256 balancePre = tokenToAbuse.balanceOf(address(receiver));
-
- // For this test any message will be flagged as correct by the
- // commitStore. In a real scenario the abuser would have to actually
- // send the message that they want to replay.
- Internal.EVM2EVMMessage[] memory messages = _generateSingleBasicMessage();
- messages[0].tokenAmounts = new Client.EVMTokenAmount[](1);
- messages[0].tokenAmounts[0] = Client.EVMTokenAmount({token: s_sourceFeeToken, amount: tokenAmount});
- messages[0].receiver = address(receiver);
- messages[0].sourceTokenData = new bytes[](1);
- messages[0].sourceTokenData[0] = abi.encode(
- Internal.SourceTokenData({
- sourcePoolAddress: abi.encode(s_sourcePoolByToken[s_sourceFeeToken]),
- destTokenAddress: abi.encode(s_destTokenBySourceToken[s_sourceFeeToken]),
- extraData: "",
- destGasAmount: DEFAULT_TOKEN_DEST_GAS_OVERHEAD
- })
- );
-
- messages[0].messageId = Internal._hash(messages[0], s_offRamp.metadataHash());
-
- Internal.ExecutionReport memory report = _generateReportFromMessages(messages);
-
- // sets the report to be repeated on the ReentrancyAbuser to be able to replay
- receiver.setPayload(report);
-
- // The first entry should be fine and triggers the second entry. This one fails
- // but since it's an inner tx of the first one it is caught in the try-catch.
- // This means the first tx is marked `FAILURE` with the error message of the second tx.
- vm.expectEmit();
- emit EVM2EVMOffRamp.ExecutionStateChanged(
- messages[0].sequenceNumber,
- messages[0].messageId,
- Internal.MessageExecutionState.FAILURE,
- abi.encodeWithSelector(
- EVM2EVMOffRamp.ReceiverError.selector,
- abi.encodeWithSelector(EVM2EVMOffRamp.AlreadyExecuted.selector, messages[0].sequenceNumber)
- )
- );
-
- s_offRamp.manuallyExecute(report, _getGasLimitsFromMessages(messages));
-
- // Since the tx failed we don't release the tokens
- assertEq(tokenToAbuse.balanceOf(address(receiver)), balancePre);
- }
}
contract EVM2EVMOffRamp_getExecutionState is EVM2EVMOffRampSetup {
diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go
index 9d5e7a4aa7..a61c4fde4b 100644
--- a/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go
+++ b/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp/evm_2_evm_multi_offramp.go
@@ -162,8 +162,8 @@ type MultiOCR3BaseOCRConfigArgs struct {
}
var EVM2EVMMultiOffRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"messageDestChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidMessageDestChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[][]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.UnblessedRoot[]\",\"name\":\"rootToReset\",\"type\":\"tuple[]\"}],\"name\":\"resetUnblessedRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x6101206040523480156200001257600080fd5b5060405162006af738038062006af78339810160408190526200003591620008e2565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f181620003fc565b50505062000c57565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60a08101516001600160a01b03161580620002c8575080516001600160a01b0316155b15620002e7576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c166001600160c01b0319909a168a17600160a01b63ffffffff98891602176001600160c01b0316600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b018051600580546001600160a01b0319908116928e1692909217905560a0808e01805160068054909416908f161790925586519a8b5297518716988a0198909852925185169388019390935251909216958501959095525185169383019390935251909216908201527f0da37fd00459f4f5f0b8210d31525e4910ae674b8bab34b561d146bb45773a4c9060c00160405180910390a150565b60005b81518110156200064e57600082828151811062000420576200042062000a20565b60200260200101519050600081600001519050806001600160401b03166000036200045e5760405163c656089560e01b815260040160405180910390fd5b6001600160401b03811660009081526007602052604081206001810180549192916200048a9062000a36565b80601f0160208091040260200160405190810160405280929190818152602001828054620004b89062000a36565b8015620005095780601f10620004dd5761010080835404028352916020019162000509565b820191906000526020600020905b815481529060010190602001808311620004eb57829003601f168201915b505050505090506000846040015190508151600003620005ac57805160000362000546576040516342bcdf7f60e11b815260040160405180910390fd5b6001830162000556828262000ac7565b508254610100600160481b0319166101001783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620005e7565b8080519060200120828051906020012014620005e75760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b6020850151835460ff19169015151783556040516001600160401b038516907f4f49973170c548fddd4a48341b75e131818913f38f44d47af57e8735eee588ba906200063590869062000b93565b60405180910390a25050505050806001019050620003ff565b5050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200068d576200068d62000652565b60405290565b604051608081016001600160401b03811182821017156200068d576200068d62000652565b60405160c081016001600160401b03811182821017156200068d576200068d62000652565b604051601f8201601f191681016001600160401b038111828210171562000708576200070862000652565b604052919050565b80516001600160401b03811681146200072857600080fd5b919050565b80516001600160a01b03811681146200072857600080fd5b805163ffffffff811681146200072857600080fd5b6000601f83601f8401126200076e57600080fd5b825160206001600160401b03808311156200078d576200078d62000652565b8260051b6200079e838201620006dd565b9384528681018301938381019089861115620007b957600080fd5b84890192505b85831015620008d557825184811115620007d95760008081fd5b89016060601f19828d038101821315620007f35760008081fd5b620007fd62000668565b6200080a89850162000710565b81526040808501518015158114620008225760008081fd5b828b01529284015192888411156200083a5760008081fd5b83850194508e603f8601126200085257600093508384fd5b898501519350888411156200086b576200086b62000652565b6200087c8a848e87011601620006dd565b92508383528e81858701011115620008945760008081fd5b60005b84811015620008b4578581018201518482018c01528a0162000897565b5060009383018a0193909352918201528352509184019190840190620007bf565b9998505050505050505050565b6000806000838503610160811215620008fa57600080fd5b60808112156200090957600080fd5b6200091362000693565b6200091e8662000710565b81526200092e602087016200072d565b602082015262000941604087016200072d565b604082015262000954606087016200072d565b6060820152935060c0607f19820112156200096e57600080fd5b5062000979620006b8565b62000987608086016200072d565b81526200099760a0860162000745565b6020820152620009aa60c0860162000745565b6040820152620009bd60e0860162000745565b6060820152620009d161010086016200072d565b6080820152620009e561012086016200072d565b60a08201526101408501519092506001600160401b0381111562000a0857600080fd5b62000a16868287016200075a565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4b57607f821691505b60208210810362000a6c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ac2576000816000526020600020601f850160051c8101602086101562000a9d5750805b601f850160051c820191505b8181101562000abe5782815560010162000aa9565b5050505b505050565b81516001600160401b0381111562000ae35762000ae362000652565b62000afb8162000af4845462000a36565b8462000a72565b602080601f83116001811462000b33576000841562000b1a5750858301515b600019600386901b1c1916600185901b17855562000abe565b600085815260208120601f198616915b8281101562000b645788860151825594840194600190910190840162000b43565b508582101562000b835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252825460ff811615158383015260081c6001600160401b0316604083015260608083015260018084018054600093929190849062000bd58162000a36565b80608089015260a0600183166000811462000bf9576001811462000c165762000c48565b60ff19841660a08b015260a083151560051b8b0101945062000c48565b85600052602060002060005b8481101562000c3f5781548c820185015290880190890162000c22565b8b0160a0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615e3162000cc66000396000818161023e0152612c5201526000818161020f0152612f2c0152600081816101e00152818161141801526114cf0152600081816101b001526127cc015260008181611caa0152611cf60152615e316000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806385572ffb116100d8578063d2a15d351161008c578063f2fde38b11610066578063f2fde38b146105ca578063f716f99f146105dd578063ff888fb1146105f057600080fd5b8063d2a15d3514610584578063e9d68a8e14610597578063ece670b6146105b757600080fd5b8063a12a9870116100bd578063a12a98701461050c578063c673e5841461051f578063ccd37ba31461053f57600080fd5b806385572ffb146104e35780638da5cb5b146104f157600080fd5b8063403b2d631161012f5780637437ff9f116101145780637437ff9f1461038557806379ba5097146104c85780637d4eef60146104d057600080fd5b8063403b2d63146103525780635e36480c1461036557600080fd5b80632d04ab76116101605780632d04ab761461030e578063311cd513146103235780633f4b04aa1461033657600080fd5b806306285c691461017c578063181f5a77146102c5575b600080fd5b61026e60408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102bc9190815167ffffffffffffffff1681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103016040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b6040516102bc9190613e9e565b61032161031c366004613f49565b610613565b005b610321610331366004613ffc565b6109d9565b600a5460405167ffffffffffffffff90911681526020016102bc565b610321610360366004614185565b610a42565b610378610373366004614224565b610a56565b6040516102bc9190614281565b61045f6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526004546001600160a01b03808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152780100000000000000000000000000000000000000000000000083048116948401949094527c010000000000000000000000000000000000000000000000000000000090910490921660608201526005548216608082015260065490911660a082015290565b6040516102bc9190600060c0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401528060a08501511660a08401525092915050565b610321610aac565b6103216104de366004614885565b610b6a565b6103216101773660046149b0565b6000546040516001600160a01b0390911681526020016102bc565b61032161051a366004614a04565b610d0a565b61053261052d366004614b1e565b610d1b565b6040516102bc9190614b7e565b61057661054d366004614bf3565b67ffffffffffffffff919091166000908152600960209081526040808320938352929052205490565b6040519081526020016102bc565b610321610592366004614c1d565b610e79565b6105aa6105a5366004614c92565b610f33565b6040516102bc9190614cad565b6103216105c5366004614ce8565b61101c565b6103216105d8366004614d4c565b61136f565b6103216105eb366004614dd1565b611380565b6106036105fe366004614f0f565b6113c2565b60405190151581526020016102bc565b6000610621878901896150ad565b8051515190915015158061063a57508051602001515115155b1561073a57600a5460208a01359067ffffffffffffffff808316911610156106f957600a805467ffffffffffffffff191667ffffffffffffffff831617905560065482516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691633937306f916106c291600401615315565b600060405180830381600087803b1580156106dc57600080fd5b505af11580156106f0573d6000803e3d6000fd5b50505050610738565b816020015151600003610738576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b8160200151518110156109225760008260200151828151811061076257610762615218565b6020026020010151905060008160000151905061077e81611483565b600061078982611585565b602084015151815491925067ffffffffffffffff908116610100909204161415806107cb575060208084015190810151905167ffffffffffffffff9182169116115b1561081457825160208401516040517feefb0cac00000000000000000000000000000000000000000000000000000000815261080b929190600401615328565b60405180910390fd5b604083015180610850576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff166000908152600960209081526040808320848452909152902054156108c35783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024810182905260440161080b565b60208085015101516108d6906001615373565b825468ffffffffffffffff00191661010067ffffffffffffffff92831602179092559251166000908152600960209081526040808320948352939052919091204290555060010161073d565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d81604051610952919061539b565b60405180910390a16109ce60008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92506115e5915050565b505050505050505050565b610a196109e882840184615438565b6040805160008082526020820190925290610a13565b60608152602001906001900390816109fe5790505b5061195c565b604080516000808252602082019092529050610a3c6001858585858660006115e5565b50505050565b610a4a611a0c565b610a5381611a68565b50565b6000610a646001600461546d565b6002610a71608085615496565b67ffffffffffffffff16610a8591906154bd565b610a8f8585611c60565b901c166003811115610aa357610aa3614257565b90505b92915050565b6001546001600160a01b03163314610b065760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161080b565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b72611ca7565b815181518114610bae576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610cfa576000848281518110610bcd57610bcd615218565b60200260200101519050600081602001515190506000858481518110610bf557610bf5615218565b6020026020010151905080518214610c39576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610ceb576000828281518110610c5857610c58615218565b6020026020010151905080600014610ce25784602001518281518110610c8057610c80615218565b602002602001015160800151811015610ce25784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018390526044810182905260640161080b565b50600101610c3c565b50505050806001019050610bb1565b50610d05838361195c565b505050565b610d12611a0c565b610a5381611d28565b610d5e6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c082015294855291820180548451818402810184019095528085529293858301939092830182828015610e0757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610de9575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610e6957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e4b575b5050505050815250509050919050565b610e81611a0c565b60005b81811015610d05576000838383818110610ea057610ea0615218565b905060400201803603810190610eb691906154d4565b9050610ec581602001516113c2565b610f2a57805167ffffffffffffffff1660009081526009602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b50600101610e84565b60408051606080820183526000808352602080840182905283850183905267ffffffffffffffff8681168352600782529185902085519384018652805460ff811615158552610100900490921690830152600181018054939492939192840191610f9c9061550d565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc89061550d565b8015610e695780601f10610fea57610100808354040283529160200191610e69565b820191906000526020600020905b815481529060010190602001808311610ff857505050919092525091949350505050565b333014611055576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611092565b604080518082019091526000808252602082015281526020019060019003908161106b5790505b5060a084015151909150156110c5576110c28360a001518460200151856060015186600001516020015186611fb4565b90505b6040805160a0810182528451518152845160209081015167ffffffffffffffff1681830152808601518351600094840192611101929101613e9e565b60408051601f19818403018152918152908252868101516020830152018390526005549091506001600160a01b0316801561120e576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a19061117b9085906004016155e9565b600060405180830381600087803b15801561119557600080fd5b505af19250505080156111a6575060015b61120e573d8080156111d4576040519150601f19603f3d011682016040523d82523d6000602084013e6111d9565b606091505b50806040517f09c2532500000000000000000000000000000000000000000000000000000000815260040161080b9190613e9e565b60408501515115801561122357506080850151155b8061123a575060608501516001600160a01b03163b155b8061127a57506060850151611278906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612092565b155b15611286575050505050565b60048054608087015160608801516040517f3cf9798300000000000000000000000000000000000000000000000000000000815260009485946001600160a01b031693633cf97983936112e1938a93611388939291016155fc565b6000604051808303816000875af1158015611300573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113289190810190615638565b50915091508161136657806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161080b9190613e9e565b50505050505050565b611377611a0c565b610a53816120ae565b611388611a0c565b60005b81518110156113be576113b68282815181106113a9576113a9615218565b6020026020010151612164565b60010161138b565b5050565b6040805180820182523081526020810183815291517f4d61677100000000000000000000000000000000000000000000000000000000815290516001600160a01b039081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa15801561145f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa691906156ce565b6040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061154291906156ce565b15610a53576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161080b565b67ffffffffffffffff81166000908152600760205260408120805460ff16610aa6576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161080b565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906116448760a46156eb565b905082606001511561168c57845161165d9060206154bd565b865161166a9060206154bd565b6116759060a06156eb565b61167f91906156eb565b61168990826156eb565b90505b3681146116ce576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161080b565b50815181146117165781516040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101919091526024810182905260440161080b565b61171e611ca7565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561176c5761176c614257565b600281111561177d5761177d614257565b905250905060028160200151600281111561179a5761179a614257565b1480156117ee5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff16815481106117d6576117d6615218565b6000918252602090912001546001600160a01b031633145b611824576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081606001511561190657602082015161183f9060016156fe565b60ff1685511461187b576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83518551146118b6576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600087876040516118c8929190615717565b6040519081900381206118df918b90602001615727565b6040516020818303038152906040528051906020012090506119048a828888886124a8565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b8151600003611996576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611a05576119fd8582815181106119cb576119cb615218565b6020026020010151846119f7578583815181106119ea576119ea615218565b60200260200101516126bf565b836126bf565b6001016119ad565b5050505050565b6000546001600160a01b03163314611a665760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161080b565b565b60a08101516001600160a01b03161580611a8a575080516001600160a01b0316155b15611ac1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a177401000000000000000000000000000000000000000063ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000948816949094027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16939093177c010000000000000000000000000000000000000000000000000000000093871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff19908116928e1692909217905560a0808e01805160068054909416908f161790925586519a8b5297518716988a0198909852925185169388019390935251909216958501959095525185169383019390935251909216908201527f0da37fd00459f4f5f0b8210d31525e4910ae674b8bab34b561d146bb45773a4c9060c00160405180910390a150565b67ffffffffffffffff8216600090815260086020526040812081611c8560808561573b565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b467f000000000000000000000000000000000000000000000000000000000000000014611a66576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161080b565b60005b81518110156113be576000828281518110611d4857611d48615218565b602002602001015190506000816000015190508067ffffffffffffffff16600003611d9f576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600760205260408120600181018054919291611dca9061550d565b80601f0160208091040260200160405190810160405280929190818152602001828054611df69061550d565b8015611e435780601f10611e1857610100808354040283529160200191611e43565b820191906000526020600020905b815481529060010190602001808311611e2657829003601f168201915b505050505090506000846040015190508151600003611efc578051600003611e97576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301611ea582826157aa565b50825468ffffffffffffffff00191661010017835560405167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611f4f565b8080519060200120828051906020012014611f4f576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8516600482015260240161080b565b6020850151835460ff191690151517835560405167ffffffffffffffff8516907f4f49973170c548fddd4a48341b75e131818913f38f44d47af57e8735eee588ba90611f9c90869061586a565b60405180910390a25050505050806001019050611d2b565b6060855167ffffffffffffffff811115611fd057611fd0614050565b60405190808252806020026020018201604052801561201557816020015b6040805180820190915260008082526020820152815260200190600190039081611fee5790505b50905060005b86518110156120885761206387828151811061203957612039615218565b602002602001015187878787868151811061205657612056615218565b6020026020010151612ecb565b82828151811061207557612075615218565b602090810291909101015260010161201b565b5095945050505050565b600061209d836132da565b8015610aa35750610aa3838361333e565b336001600160a01b038216036121065760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161080b565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff1660000361218f576000604051631b3fab5160e11b815260040161080b9190615926565b60208082015160ff808216600090815260029093526040832060018101549293909283921690036121fc57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055612251565b6060840151600182015460ff6201000090910416151590151514612251576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff8416600482015260240161080b565b60a08401518051601f60ff82161115612280576001604051631b3fab5160e11b815260040161080b9190615926565b6122e685856003018054806020026020016040519081016040528092919081815260200182805480156122dc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122be575b505050505061340d565b8560600151156124155761235485856002018054806020026020016040519081016040528092919081815260200182805480156122dc576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116122be57505050505061340d565b6080860151805161236e9060028701906020840190613da8565b5080516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841690810291909117909155601f10156123ce576002604051631b3fab5160e11b815260040161080b9190615926565b60408801516123de906003615940565b60ff168160ff1611612406576003604051631b3fab5160e11b815260040161080b9190615926565b61241287836001613476565b50505b61242185836002613476565b81516124369060038601906020850190613da8565b5060408681015160018501805460ff191660ff8316179055875180865560a089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361248f938a939260028b0192919061595c565b60405180910390a16124a0856135f6565b505050505050565b6124b0613e1a565b835160005b818110156126b55760006001888684602081106124d4576124d4615218565b6124e191901a601b6156fe565b8985815181106124f3576124f3615218565b602002602001015189868151811061250d5761250d615218565b60200260200101516040516000815260200160405260405161254b949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561256d573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b038516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156125ce576125ce614257565b60028111156125df576125df614257565b90525090506001816020015160028111156125fc576125fc614257565b14612633576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f811061264a5761264a615218565b602002015115612686576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f81106126a1576126a1615218565b9115156020909202015250506001016124b5565b5050505050505050565b81516126ca81611483565b60006126d582611585565b6020850151519091506000819003612718576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151518114612756576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561277157612771614050565b60405190808252806020026020018201604052801561279a578160200160208202803683370190505b50905060005b8281101561290f576000876020015182815181106127c0576127c0615218565b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681600001516040015167ffffffffffffffff161461285357805160409081015190517f38432a2200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161080b565b6128e9818660010180546128669061550d565b80601f01602080910402602001604051908101604052809291908181526020018280546128929061550d565b80156128df5780601f106128b4576101008083540402835291602001916128df565b820191906000526020600020905b8154815290600101906020018083116128c257829003601f168201915b5050505050613612565b8383815181106128fb576128fb615218565b6020908102919091010152506001016127a0565b506000612926858389606001518a60800151613734565b90508060000361296e576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015260240161080b565b8551151560005b848110156109ce5760008960200151828151811061299557612995615218565b6020026020010151905060006129b389836000015160600151610a56565b905060028160038111156129c9576129c9614257565b03612a20578151606001516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c910160405180910390a15050612ec3565b6000816003811115612a3457612a34614257565b1480612a5157506003816003811115612a4f57612a4f614257565b145b612aa2578151606001516040517f25507e7f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c166004830152909116602482015260440161080b565b8315612b835760045460009074010000000000000000000000000000000000000000900463ffffffff16612ad6874261546d565b1190508080612af657506003826003811115612af457612af4614257565b145b612b38576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b16600482015260240161080b565b8a8481518110612b4a57612b4a615218565b6020026020010151600014612b7d578a8481518110612b6b57612b6b615218565b60200260200101518360800181815250505b50612be9565b6000816003811115612b9757612b97614257565b14612be9578151606001516040517f3ef2a99c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808c166004830152909116602482015260440161080b565b81516080015167ffffffffffffffff1615612cd7576000816003811115612c1257612c12614257565b03612cd75781516080015160208301516040517fe0e03cae0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612c89928e9291906004016159e2565b6020604051808303816000875af1158015612ca8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccc91906156ce565b612cd7575050612ec3565b60008b604001518481518110612cef57612cef615218565b6020026020010151905080518360a001515114612d53578251606001516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808d166004830152909116602482015260440161080b565b612d678a846000015160600151600161378a565b600080612d748584613832565b91509150612d8b8c8660000151606001518461378a565b8615612dfb576003826003811115612da557612da5614257565b03612dfb576000846003811115612dbe57612dbe614257565b14612dfb578451516040517f2b11b8d900000000000000000000000000000000000000000000000000000000815261080b91908390600401615a0f565b6002826003811115612e0f57612e0f614257565b14612e69576003826003811115612e2857612e28614257565b14612e69578451606001516040517f926c5a3e00000000000000000000000000000000000000000000000000000000815261080b918e918590600401615a28565b8451805160609091015160405167ffffffffffffffff918216918f16907f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df290612eb59087908790615a4e565b60405180910390a450505050505b600101612975565b60408051808201909152600080825260208201526000612eee87602001516138fc565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612f73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f979190615a6e565b90506001600160a01b0381161580612fdf5750612fdd6001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612092565b155b15613021576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161080b565b6000806131276040518061010001604052808b81526020018967ffffffffffffffff1681526020018a6001600160a01b031681526020018c606001518152602001866001600160a01b031681526020018c6000015181526020018c604001518152602001888152506040516024016130999190615a8b565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3907753700000000000000000000000000000000000000000000000000000000179052600454859063ffffffff7c01000000000000000000000000000000000000000000000000000000009091041661138860846139a2565b50915091508161316557806040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161080b9190613e9e565b80516020146131ad5780516040517f78ef802400000000000000000000000000000000000000000000000000000000815260206004820152602481019190915260440161080b565b6000818060200190518101906131c39190615b62565b6040516001600160a01b038b166024820152604481018290529091506132709060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052600454879063ffffffff78010000000000000000000000000000000000000000000000009091041661138860846139a2565b509093509150826132af57816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161080b9190613e9e565b604080518082019091526001600160a01b039095168552602085015250919250505095945050505050565b6000613306827f01ffc9a70000000000000000000000000000000000000000000000000000000061333e565b8015610aa65750613337827fffffffff0000000000000000000000000000000000000000000000000000000061333e565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d915060005190508280156133f6575060208210155b80156134025750600081115b979650505050505050565b60005b8151811015610d055760ff83166000908152600360205260408120835190919084908490811061344257613442615218565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff19169055600101613410565b60005b82518160ff161015610a3c576000838260ff168151811061349c5761349c615218565b60200260200101519050600060028111156134b9576134b9614257565b60ff80871660009081526003602090815260408083206001600160a01b038716845290915290205461010090041660028111156134f8576134f8614257565b14613519576004604051631b3fab5160e11b815260040161080b9190615926565b6001600160a01b038116613559576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff16815260200184600281111561357f5761357f614257565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff1916176101008360028111156135dc576135dc614257565b021790555090505050806135ef90615b7b565b9050613479565b60ff8116610a5357600a805467ffffffffffffffff1916905550565b815160208082015160409283015192516000938493613658937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101615b9a565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d015195015195976136a19794969395929491939101615bcd565b604051602081830303815290604052805190602001208560400151805190602001208660a001516040516020016136d89190615cc4565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b600080613742858585613ac8565b905061374d816113c2565b61375b576000915050613782565b67ffffffffffffffff86166000908152600960209081526040808320938352929052205490505b949350505050565b60006002613799608085615496565b67ffffffffffffffff166137ad91906154bd565b905060006137bb8585611c60565b9050816137ca6001600461546d565b901b1916818360038111156137e1576137e1614257565b67ffffffffffffffff871660009081526008602052604081209190921b9290921791829161381060808861573b565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517fece670b6000000000000000000000000000000000000000000000000000000008152600090606090309063ece670b6906138769087908790600401615d24565b600060405180830381600087803b15801561389057600080fd5b505af19250505080156138a1575060015b6138e0573d8080156138cf576040519150601f19603f3d011682016040523d82523d6000602084013e6138d4565b606091505b506003925090506138f5565b50506040805160208101909152600081526002905b9250929050565b6000815160201461393b57816040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161080b9190613e9e565b6000828060200190518101906139519190615b62565b90506001600160a01b03811180613969575061040081105b15610aa657826040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161080b9190613e9e565b6000606060008361ffff1667ffffffffffffffff8111156139c5576139c5614050565b6040519080825280601f01601f1916602001820160405280156139ef576020820181803683370190505b509150863b613a22577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613a55577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613a8e577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613ab15750835b808352806000602085013e50955095509592505050565b8251825160009190818303613b09576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613b1d57506101018111155b613b3a576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613b64576040516309bde33960e01b815260040160405180910390fd5b80600003613b915786600081518110613b7f57613b7f615218565b60200260200101519350505050613d60565b60008167ffffffffffffffff811115613bac57613bac614050565b604051908082528060200260200182016040528015613bd5578160200160208202803683370190505b50905060008080805b85811015613cff5760006001821b8b811603613c395788851015613c22578c5160018601958e918110613c1357613c13615218565b60200260200101519050613c5b565b8551600185019487918110613c1357613c13615218565b8b5160018401938d918110613c5057613c50615218565b602002602001015190505b600089861015613c8b578d5160018701968f918110613c7c57613c7c615218565b60200260200101519050613cad565b8651600186019588918110613ca257613ca2615218565b602002602001015190505b82851115613cce576040516309bde33960e01b815260040160405180910390fd5b613cd88282613d67565b878481518110613cea57613cea615218565b60209081029190910101525050600101613bde565b506001850382148015613d1157508683145b8015613d1c57508581145b613d39576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613d4e57613d4e615218565b60200260200101519750505050505050505b9392505050565b6000818310613d7f57613d7a8284613d85565b610aa3565b610aa383835b604080516001602082015290810183905260608101829052600090608001613716565b828054828255906000526020600020908101928215613e0a579160200282015b82811115613e0a578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190613dc8565b50613e16929150613e39565b5090565b604051806103e00160405280601f906020820280368337509192915050565b5b80821115613e165760008155600101613e3a565b60005b83811015613e69578181015183820152602001613e51565b50506000910152565b60008151808452613e8a816020860160208601613e4e565b601f01601f19169290920160200192915050565b602081526000610aa36020830184613e72565b8060608101831015610aa657600080fd5b60008083601f840112613ed457600080fd5b50813567ffffffffffffffff811115613eec57600080fd5b6020830191508360208285010111156138f557600080fd5b60008083601f840112613f1657600080fd5b50813567ffffffffffffffff811115613f2e57600080fd5b6020830191508360208260051b85010111156138f557600080fd5b60008060008060008060008060e0898b031215613f6557600080fd5b613f6f8a8a613eb1565b9750606089013567ffffffffffffffff80821115613f8c57600080fd5b613f988c838d01613ec2565b909950975060808b0135915080821115613fb157600080fd5b613fbd8c838d01613f04565b909750955060a08b0135915080821115613fd657600080fd5b50613fe38b828c01613f04565b999c989b50969995989497949560c00135949350505050565b60008060006080848603121561401157600080fd5b61401b8585613eb1565b9250606084013567ffffffffffffffff81111561403757600080fd5b61404386828701613ec2565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561408957614089614050565b60405290565b60405160a0810167ffffffffffffffff8111828210171561408957614089614050565b6040516080810167ffffffffffffffff8111828210171561408957614089614050565b6040516060810167ffffffffffffffff8111828210171561408957614089614050565b6040805190810167ffffffffffffffff8111828210171561408957614089614050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561414457614144614050565b604052919050565b6001600160a01b0381168114610a5357600080fd5b803561416c8161414c565b919050565b803563ffffffff8116811461416c57600080fd5b600060c0828403121561419757600080fd5b61419f614066565b82356141aa8161414c565b81526141b860208401614171565b60208201526141c960408401614171565b60408201526141da60608401614171565b606082015260808301356141ed8161414c565b608082015260a08301356142008161414c565b60a08201529392505050565b803567ffffffffffffffff8116811461416c57600080fd5b6000806040838503121561423757600080fd5b6142408361420c565b915061424e6020840161420c565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b6004811061427d5761427d614257565b9052565b60208101610aa6828461426d565b600067ffffffffffffffff8211156142a9576142a9614050565b5060051b60200190565b600060a082840312156142c557600080fd5b6142cd61408f565b9050813581526142df6020830161420c565b60208201526142f06040830161420c565b60408201526143016060830161420c565b60608201526143126080830161420c565b608082015292915050565b600067ffffffffffffffff82111561433757614337614050565b50601f01601f191660200190565b600082601f83011261435657600080fd5b81356143696143648261431d565b61411b565b81815284602083860101111561437e57600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126143ac57600080fd5b813560206143bc6143648361428f565b82815260059290921b840181019181810190868411156143db57600080fd5b8286015b848110156144b157803567ffffffffffffffff808211156144005760008081fd5b8189019150608080601f19848d0301121561441b5760008081fd5b6144236140b2565b87840135838111156144355760008081fd5b6144438d8a83880101614345565b8252506040808501358481111561445a5760008081fd5b6144688e8b83890101614345565b8a84015250606080860135858111156144815760008081fd5b61448f8f8c838a0101614345565b92840192909252949092013593810193909352505083529183019183016143df565b509695505050505050565b600061014082840312156144cf57600080fd5b6144d7614066565b90506144e383836142b3565b815260a082013567ffffffffffffffff8082111561450057600080fd5b61450c85838601614345565b602084015260c084013591508082111561452557600080fd5b61453185838601614345565b604084015261454260e08501614161565b6060840152610100840135608084015261012084013591508082111561456757600080fd5b506145748482850161439b565b60a08301525092915050565b600082601f83011261459157600080fd5b813560206145a16143648361428f565b82815260059290921b840181019181810190868411156145c057600080fd5b8286015b848110156144b157803567ffffffffffffffff8111156145e45760008081fd5b6145f28986838b01016144bc565b8452509183019183016145c4565b600082601f83011261461157600080fd5b813560206146216143648361428f565b82815260059290921b8401810191818101908684111561464057600080fd5b8286015b848110156144b157803567ffffffffffffffff8111156146645760008081fd5b6146728986838b0101614345565b845250918301918301614644565b600082601f83011261469157600080fd5b813560206146a16143648361428f565b82815260059290921b840181019181810190868411156146c057600080fd5b8286015b848110156144b157803567ffffffffffffffff8111156146e45760008081fd5b6146f28986838b0101614600565b8452509183019183016146c4565b600082601f83011261471157600080fd5b813560206147216143648361428f565b8083825260208201915060208460051b87010193508684111561474357600080fd5b602086015b848110156144b15780358352918301918301614748565b600082601f83011261477057600080fd5b813560206147806143648361428f565b82815260059290921b8401810191818101908684111561479f57600080fd5b8286015b848110156144b157803567ffffffffffffffff808211156147c45760008081fd5b818901915060a080601f19848d030112156147df5760008081fd5b6147e761408f565b6147f288850161420c565b8152604080850135848111156148085760008081fd5b6148168e8b83890101614580565b8a840152506060808601358581111561482f5760008081fd5b61483d8f8c838a0101614680565b83850152506080915081860135858111156148585760008081fd5b6148668f8c838a0101614700565b91840191909152509190930135908301525083529183019183016147a3565b600080604080848603121561489957600080fd5b833567ffffffffffffffff808211156148b157600080fd5b6148bd8783880161475f565b94506020915081860135818111156148d457600080fd5b8601601f810188136148e557600080fd5b80356148f36143648261428f565b81815260059190911b8201840190848101908a83111561491257600080fd5b8584015b8381101561499e5780358681111561492e5760008081fd5b8501603f81018d136149405760008081fd5b878101356149506143648261428f565b81815260059190911b82018a0190898101908f8311156149705760008081fd5b928b01925b8284101561498e5783358252928a0192908a0190614975565b8652505050918601918601614916565b50809750505050505050509250929050565b6000602082840312156149c257600080fd5b813567ffffffffffffffff8111156149d957600080fd5b820160a08185031215613d6057600080fd5b8015158114610a5357600080fd5b803561416c816149eb565b60006020808385031215614a1757600080fd5b823567ffffffffffffffff80821115614a2f57600080fd5b818501915085601f830112614a4357600080fd5b8135614a516143648261428f565b81815260059190911b83018401908481019088831115614a7057600080fd5b8585015b83811015614b0057803585811115614a8c5760008081fd5b86016060818c03601f1901811315614aa45760008081fd5b614aac6140d5565b614ab78a840161420c565b8152604080840135614ac8816149eb565b828c0152918301359188831115614adf5760008081fd5b614aed8e8c85870101614345565b9082015285525050918601918601614a74565b5098975050505050505050565b803560ff8116811461416c57600080fd5b600060208284031215614b3057600080fd5b610aa382614b0d565b60008151808452602080850194506020840160005b83811015614b735781516001600160a01b031687529582019590820190600101614b4e565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614bcd60e0840182614b39565b90506040840151601f198483030160c0850152614bea8282614b39565b95945050505050565b60008060408385031215614c0657600080fd5b614c0f8361420c565b946020939093013593505050565b60008060208385031215614c3057600080fd5b823567ffffffffffffffff80821115614c4857600080fd5b818501915085601f830112614c5c57600080fd5b813581811115614c6b57600080fd5b8660208260061b8501011115614c8057600080fd5b60209290920196919550909350505050565b600060208284031215614ca457600080fd5b610aa38261420c565b6020815281511515602082015267ffffffffffffffff6020830151166040820152600060408301516060808401526137826080840182613e72565b60008060408385031215614cfb57600080fd5b823567ffffffffffffffff80821115614d1357600080fd5b614d1f868387016144bc565b93506020850135915080821115614d3557600080fd5b50614d4285828601614600565b9150509250929050565b600060208284031215614d5e57600080fd5b8135613d608161414c565b600082601f830112614d7a57600080fd5b81356020614d8a6143648361428f565b8083825260208201915060208460051b870101935086841115614dac57600080fd5b602086015b848110156144b1578035614dc48161414c565b8352918301918301614db1565b60006020808385031215614de457600080fd5b823567ffffffffffffffff80821115614dfc57600080fd5b818501915085601f830112614e1057600080fd5b8135614e1e6143648261428f565b81815260059190911b83018401908481019088831115614e3d57600080fd5b8585015b83811015614b0057803585811115614e5857600080fd5b860160c0818c03601f19011215614e6f5760008081fd5b614e77614066565b8882013581526040614e8a818401614b0d565b8a8301526060614e9b818501614b0d565b8284015260809150614eae8285016149f9565b9083015260a08381013589811115614ec65760008081fd5b614ed48f8d83880101614d69565b838501525060c0840135915088821115614eee5760008081fd5b614efc8e8c84870101614d69565b9083015250845250918601918601614e41565b600060208284031215614f2157600080fd5b5035919050565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461416c57600080fd5b600082601f830112614f6557600080fd5b81356020614f756143648361428f565b82815260069290921b84018101918181019086841115614f9457600080fd5b8286015b848110156144b15760408189031215614fb15760008081fd5b614fb96140f8565b614fc28261420c565b8152614fcf858301614f28565b81860152835291830191604001614f98565b600082601f830112614ff257600080fd5b813560206150026143648361428f565b82815260079290921b8401810191818101908684111561502157600080fd5b8286015b848110156144b157808803608081121561503f5760008081fd5b6150476140d5565b6150508361420c565b8152604080601f19840112156150665760008081fd5b61506e6140f8565b925061507b87850161420c565b835261508881850161420c565b8388015281870192909252606083013591810191909152835291830191608001615025565b600060208083850312156150c057600080fd5b823567ffffffffffffffff808211156150d857600080fd5b818501915060408083880312156150ee57600080fd5b6150f66140f8565b83358381111561510557600080fd5b84016040818a03121561511757600080fd5b61511f6140f8565b81358581111561512e57600080fd5b8201601f81018b1361513f57600080fd5b803561514d6143648261428f565b81815260069190911b8201890190898101908d83111561516c57600080fd5b928a01925b828410156151bc5787848f0312156151895760008081fd5b6151916140f8565b843561519c8161414c565b81526151a9858d01614f28565b818d0152825292870192908a0190615171565b8452505050818701359350848411156151d457600080fd5b6151e08a858401614f54565b81880152825250838501359150828211156151fa57600080fd5b61520688838601614fe1565b85820152809550505050505092915050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561529a57835180516001600160a01b031684528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1685840152928401929185019160010161524e565b50508583015187820388850152805180835290840192506000918401905b80831015615309578351805167ffffffffffffffff1683528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16858301529284019260019290920191908501906152b8565b50979650505050505050565b602081526000610aa3602083018461522e565b67ffffffffffffffff8316815260608101613d606020830184805167ffffffffffffffff908116835260209182015116910152565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff8181168382160190808211156153945761539461535d565b5092915050565b6000602080835260608451604080848701526153ba606087018361522e565b87850151878203601f19016040890152805180835290860193506000918601905b80831015614b0057845167ffffffffffffffff81511683528781015161541a89850182805167ffffffffffffffff908116835260209182015116910152565b508401518287015293860193600192909201916080909101906153db565b60006020828403121561544a57600080fd5b813567ffffffffffffffff81111561546157600080fd5b6137828482850161475f565b81810381811115610aa657610aa661535d565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff808416806154b1576154b1615480565b92169190910692915050565b8082028115828204841417610aa657610aa661535d565b6000604082840312156154e657600080fd5b6154ee6140f8565b6154f78361420c565b8152602083013560208201528091505092915050565b600181811c9082168061552157607f821691505b60208210810361554157634e487b7160e01b600052602260045260246000fd5b50919050565b805182526000602067ffffffffffffffff81840151168185015260408084015160a0604087015261557b60a0870182613e72565b9050606085015186820360608801526155948282613e72565b608087810151898303918a01919091528051808352908601935060009250908501905b8083101561530957835180516001600160a01b03168352860151868301529285019260019290920191908401906155b7565b602081526000610aa36020830184615547565b60808152600061560f6080830187615547565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b60008060006060848603121561564d57600080fd5b8351615658816149eb565b602085015190935067ffffffffffffffff81111561567557600080fd5b8401601f8101861361568657600080fd5b80516156946143648261431d565b8181528760208385010111156156a957600080fd5b6156ba826020830160208601613e4e565b809450505050604084015190509250925092565b6000602082840312156156e057600080fd5b8151613d60816149eb565b80820180821115610aa657610aa661535d565b60ff8181168382160190811115610aa657610aa661535d565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff8084168061575657615756615480565b92169190910492915050565b601f821115610d05576000816000526020600020601f850160051c8101602086101561578b5750805b601f850160051c820191505b818110156124a057828155600101615797565b815167ffffffffffffffff8111156157c4576157c4614050565b6157d8816157d2845461550d565b84615762565b602080601f83116001811461580d57600084156157f55750858301515b600019600386901b1c1916600185901b1785556124a0565b600085815260208120601f198616915b8281101561583c5788860151825594840194600190910190840161581d565b508582101561585a5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808352835460ff81161515602085015267ffffffffffffffff8160081c166040850152506001808501606080860152600081546158aa8161550d565b80608089015260a060018316600081146158cb57600181146158e757615917565b60ff19841660a08b015260a083151560051b8b01019450615917565b85600052602060002060005b8481101561590e5781548c82018501529088019089016158f3565b8b0160a0019550505b50929998505050505050505050565b602081016005831061593a5761593a614257565b91905290565b60ff81811683821602908116908181146153945761539461535d565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b818110156159b65784546001600160a01b031683526001948501949284019201615991565b505084810360608601526159ca8188614b39565b935050505060ff831660808301529695505050505050565b600067ffffffffffffffff808616835280851660208401525060606040830152614bea6060830184613e72565b8281526040602082015260006137826040830184613e72565b67ffffffffffffffff84811682528316602082015260608101613782604083018461426d565b615a58818461426d565b6040602082015260006137826040830184613e72565b600060208284031215615a8057600080fd5b8151613d608161414c565b6020815260008251610100806020850152615aaa610120850183613e72565b91506020850151615ac7604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615b0160a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615b1e8483613e72565b935060c08701519150808685030160e0870152615b3b8483613e72565b935060e0870151915080868503018387015250615b588382613e72565b9695505050505050565b600060208284031215615b7457600080fd5b5051919050565b600060ff821660ff8103615b9157615b9161535d565b60010192915050565b848152600067ffffffffffffffff808616602084015280851660408401525060806060830152615b586080830184613e72565b86815260c060208201526000615be660c0830188613e72565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b84811015615cb757601f19868403018952815160808151818652615c6382870182613e72565b9150508582015185820387870152615c7b8282613e72565b91505060408083015186830382880152615c958382613e72565b6060948501519790940196909652505098840198925090830190600101615c3d565b5090979650505050505050565b602081526000610aa36020830184615c20565b60008282518085526020808601955060208260051b8401016020860160005b84811015615cb757601f19868403018952615d12838351613e72565b98840198925090830190600101615cf6565b604081526000835180516040840152602081015167ffffffffffffffff80821660608601528060408401511660808601528060608401511660a08601528060808401511660c086015250505060208401516101408060e0850152615d8c610180850183613e72565b915060408601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08086850301610100870152615dc98483613e72565b935060608801519150615de86101208701836001600160a01b03169052565b60808801518387015260a0880151925080868503016101608701525050615e0f8282615c20565b9150508281036020840152614bea8185615cd756fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumMultiOCR3Base.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"}],\"name\":\"InvalidInterval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"messageDestChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidMessageDestChainSelector\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidRoot\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"LeavesCannotBeEmpty\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"errorReason\",\"type\":\"bytes\"}],\"name\":\"MessageValidationError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonUniqueSignatures\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"name\":\"RootAlreadyCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"SignaturesOutOfRegistration\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"StaleCommitReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"StaticConfigCannotBeChanged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedSigner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WrongNumberOfSignatures\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroChainSelectorNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"min\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"max\",\"type\":\"uint64\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.Interval\",\"name\":\"interval\",\"type\":\"tuple\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.MerkleRoot[]\",\"name\":\"merkleRoots\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.CommitReport\",\"name\":\"report\",\"type\":\"tuple\"}],\"name\":\"CommitReportAccepted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"DynamicConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"RootRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"sourceConfig\",\"type\":\"tuple\"}],\"name\":\"SourceChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"SourceChainSelectorAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"}],\"name\":\"StaticConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"Transmitted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfigArgs[]\",\"name\":\"sourceChainConfigUpdates\",\"type\":\"tuple[]\"}],\"name\":\"applySourceChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"rawVs\",\"type\":\"bytes32\"}],\"name\":\"commit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"}],\"name\":\"execute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLatestPriceSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"getMerkleRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"getSourceChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"minSeqNr\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"onRamp\",\"type\":\"bytes\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.SourceChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"isBlessed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"}],\"name\":\"latestConfigDetails\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"}],\"internalType\":\"structMultiOCR3Base.ConfigInfo\",\"name\":\"configInfo\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfig\",\"name\":\"ocrConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.Any2EVMRampMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReportSingleChain[]\",\"name\":\"reports\",\"type\":\"tuple[]\"},{\"internalType\":\"uint256[][]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[][]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"merkleRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.UnblessedRoot[]\",\"name\":\"rootToReset\",\"type\":\"tuple[]\"}],\"name\":\"resetUnblessedRoots\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxTokenTransferGas\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPoolReleaseOrMintGas\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"internalType\":\"uint8\",\"name\":\"ocrPluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"bool\",\"name\":\"isSignatureVerificationEnabled\",\"type\":\"bool\"},{\"internalType\":\"address[]\",\"name\":\"signers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"transmitters\",\"type\":\"address[]\"}],\"internalType\":\"structMultiOCR3Base.OCRConfigArgs[]\",\"name\":\"ocrConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"setOCR3Configs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x6101206040523480156200001257600080fd5b5060405162006a8d38038062006a8d8339810160408190526200003591620008e2565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf81620001fa565b5050466080525060208301516001600160a01b03161580620000ec575060408301516001600160a01b0316155b8062000103575060608301516001600160a01b0316155b1562000122576040516342bcdf7f60e11b815260040160405180910390fd5b82516001600160401b03166000036200014e5760405163c656089560e01b815260040160405180910390fd5b82516001600160401b0390811660a052602080850180516001600160a01b0390811660c05260408088018051831660e0526060808a01805185166101005283518b519098168852945184169587019590955251821690850152905116908201527f683eb52ee924eb817377cfa8f41f238f4bb7a877da5267869dfffbad85f564d89060800160405180910390a1620001e682620002a5565b620001f181620003fc565b50505062000c57565b336001600160a01b03821603620002545760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60a08101516001600160a01b03161580620002c8575080516001600160a01b0316155b15620002e7576040516342bcdf7f60e11b815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c166001600160c01b0319909a168a17600160a01b63ffffffff98891602176001600160c01b0316600160c01b948816949094026001600160e01b031693909317600160e01b93871693909302929092179098556080808b018051600580546001600160a01b0319908116928e1692909217905560a0808e01805160068054909416908f161790925586519a8b5297518716988a0198909852925185169388019390935251909216958501959095525185169383019390935251909216908201527f0da37fd00459f4f5f0b8210d31525e4910ae674b8bab34b561d146bb45773a4c9060c00160405180910390a150565b60005b81518110156200064e57600082828151811062000420576200042062000a20565b60200260200101519050600081600001519050806001600160401b03166000036200045e5760405163c656089560e01b815260040160405180910390fd5b6001600160401b03811660009081526007602052604081206001810180549192916200048a9062000a36565b80601f0160208091040260200160405190810160405280929190818152602001828054620004b89062000a36565b8015620005095780601f10620004dd5761010080835404028352916020019162000509565b820191906000526020600020905b815481529060010190602001808311620004eb57829003601f168201915b505050505090506000846040015190508151600003620005ac57805160000362000546576040516342bcdf7f60e11b815260040160405180910390fd5b6001830162000556828262000ac7565b508254610100600160481b0319166101001783556040516001600160401b03851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1620005e7565b8080519060200120828051906020012014620005e75760405163c39a620560e01b81526001600160401b038516600482015260240162000083565b6020850151835460ff19169015151783556040516001600160401b038516907f4f49973170c548fddd4a48341b75e131818913f38f44d47af57e8735eee588ba906200063590869062000b93565b60405180910390a25050505050806001019050620003ff565b5050565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b03811182821017156200068d576200068d62000652565b60405290565b604051608081016001600160401b03811182821017156200068d576200068d62000652565b60405160c081016001600160401b03811182821017156200068d576200068d62000652565b604051601f8201601f191681016001600160401b038111828210171562000708576200070862000652565b604052919050565b80516001600160401b03811681146200072857600080fd5b919050565b80516001600160a01b03811681146200072857600080fd5b805163ffffffff811681146200072857600080fd5b6000601f83601f8401126200076e57600080fd5b825160206001600160401b03808311156200078d576200078d62000652565b8260051b6200079e838201620006dd565b9384528681018301938381019089861115620007b957600080fd5b84890192505b85831015620008d557825184811115620007d95760008081fd5b89016060601f19828d038101821315620007f35760008081fd5b620007fd62000668565b6200080a89850162000710565b81526040808501518015158114620008225760008081fd5b828b01529284015192888411156200083a5760008081fd5b83850194508e603f8601126200085257600093508384fd5b898501519350888411156200086b576200086b62000652565b6200087c8a848e87011601620006dd565b92508383528e81858701011115620008945760008081fd5b60005b84811015620008b4578581018201518482018c01528a0162000897565b5060009383018a0193909352918201528352509184019190840190620007bf565b9998505050505050505050565b6000806000838503610160811215620008fa57600080fd5b60808112156200090957600080fd5b6200091362000693565b6200091e8662000710565b81526200092e602087016200072d565b602082015262000941604087016200072d565b604082015262000954606087016200072d565b6060820152935060c0607f19820112156200096e57600080fd5b5062000979620006b8565b62000987608086016200072d565b81526200099760a0860162000745565b6020820152620009aa60c0860162000745565b6040820152620009bd60e0860162000745565b6060820152620009d161010086016200072d565b6080820152620009e561012086016200072d565b60a08201526101408501519092506001600160401b0381111562000a0857600080fd5b62000a16868287016200075a565b9150509250925092565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168062000a4b57607f821691505b60208210810362000a6c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ac2576000816000526020600020601f850160051c8101602086101562000a9d5750805b601f850160051c820191505b8181101562000abe5782815560010162000aa9565b5050505b505050565b81516001600160401b0381111562000ae35762000ae362000652565b62000afb8162000af4845462000a36565b8462000a72565b602080601f83116001811462000b33576000841562000b1a5750858301515b600019600386901b1c1916600185901b17855562000abe565b600085815260208120601f198616915b8281101562000b645788860151825594840194600190910190840162000b43565b508582101562000b835787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6020808252825460ff811615158383015260081c6001600160401b0316604083015260608083015260018084018054600093929190849062000bd58162000a36565b80608089015260a0600183166000811462000bf9576001811462000c165762000c48565b60ff19841660a08b015260a083151560051b8b0101945062000c48565b85600052602060002060005b8481101562000c3f5781548c820185015290880190890162000c22565b8b0160a0019550505b50929998505050505050505050565b60805160a05160c05160e05161010051615dc762000cc66000396000818161023e0152612be801526000818161020f0152612ec20152600081816101e00152818161141801526114cf0152600081816101b001526127cc015260008181611caa0152611cf60152615dc76000f3fe608060405234801561001057600080fd5b50600436106101775760003560e01c806385572ffb116100d8578063d2a15d351161008c578063f2fde38b11610066578063f2fde38b146105ca578063f716f99f146105dd578063ff888fb1146105f057600080fd5b8063d2a15d3514610584578063e9d68a8e14610597578063ece670b6146105b757600080fd5b8063a12a9870116100bd578063a12a98701461050c578063c673e5841461051f578063ccd37ba31461053f57600080fd5b806385572ffb146104e35780638da5cb5b146104f157600080fd5b8063403b2d631161012f5780637437ff9f116101145780637437ff9f1461038557806379ba5097146104c85780637d4eef60146104d057600080fd5b8063403b2d63146103525780635e36480c1461036557600080fd5b80632d04ab76116101605780632d04ab761461030e578063311cd513146103235780633f4b04aa1461033657600080fd5b806306285c691461017c578063181f5a77146102c5575b600080fd5b61026e60408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516102bc9190815167ffffffffffffffff1681526020808301516001600160a01b0390811691830191909152604080840151821690830152606092830151169181019190915260800190565b60405180910390f35b6103016040518060400160405280601d81526020017f45564d3245564d4d756c74694f666652616d7020312e362e302d64657600000081525081565b6040516102bc9190613e34565b61032161031c366004613edf565b610613565b005b610321610331366004613f92565b6109d9565b600a5460405167ffffffffffffffff90911681526020016102bc565b61032161036036600461411b565b610a42565b6103786103733660046141ba565b610a56565b6040516102bc9190614217565b61045f6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a0810191909152506040805160c0810182526004546001600160a01b03808216835263ffffffff74010000000000000000000000000000000000000000830481166020850152780100000000000000000000000000000000000000000000000083048116948401949094527c010000000000000000000000000000000000000000000000000000000090910490921660608201526005548216608082015260065490911660a082015290565b6040516102bc9190600060c0820190506001600160a01b03808451168352602084015163ffffffff808216602086015280604087015116604086015280606087015116606086015250508060808501511660808401528060a08501511660a08401525092915050565b610321610aac565b6103216104de36600461481b565b610b6a565b610321610177366004614946565b6000546040516001600160a01b0390911681526020016102bc565b61032161051a36600461499a565b610d0a565b61053261052d366004614ab4565b610d1b565b6040516102bc9190614b14565b61057661054d366004614b89565b67ffffffffffffffff919091166000908152600960209081526040808320938352929052205490565b6040519081526020016102bc565b610321610592366004614bb3565b610e79565b6105aa6105a5366004614c28565b610f33565b6040516102bc9190614c43565b6103216105c5366004614c7e565b61101c565b6103216105d8366004614ce2565b61136f565b6103216105eb366004614d67565b611380565b6106036105fe366004614ea5565b6113c2565b60405190151581526020016102bc565b600061062187890189615043565b8051515190915015158061063a57508051602001515115155b1561073a57600a5460208a01359067ffffffffffffffff808316911610156106f957600a805467ffffffffffffffff191667ffffffffffffffff831617905560065482516040517f3937306f0000000000000000000000000000000000000000000000000000000081526001600160a01b0390921691633937306f916106c2916004016152ab565b600060405180830381600087803b1580156106dc57600080fd5b505af11580156106f0573d6000803e3d6000fd5b50505050610738565b816020015151600003610738576040517f2261116700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b60005b81602001515181101561092257600082602001518281518110610762576107626151ae565b6020026020010151905060008160000151905061077e81611483565b600061078982611585565b602084015151815491925067ffffffffffffffff908116610100909204161415806107cb575060208084015190810151905167ffffffffffffffff9182169116115b1561081457825160208401516040517feefb0cac00000000000000000000000000000000000000000000000000000000815261080b9291906004016152be565b60405180910390fd5b604083015180610850576040517f504570e300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b835167ffffffffffffffff166000908152600960209081526040808320848452909152902054156108c35783516040517f32cf0cbf00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024810182905260440161080b565b60208085015101516108d6906001615309565b825468ffffffffffffffff00191661010067ffffffffffffffff92831602179092559251166000908152600960209081526040808320948352939052919091204290555060010161073d565b507f3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d816040516109529190615331565b60405180910390a16109ce60008a8a8a8a8a8080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808e0282810182019093528d82529093508d92508c9182918501908490808284376000920191909152508b92506115e5915050565b505050505050505050565b610a196109e8828401846153ce565b6040805160008082526020820190925290610a13565b60608152602001906001900390816109fe5790505b5061195c565b604080516000808252602082019092529050610a3c6001858585858660006115e5565b50505050565b610a4a611a0c565b610a5381611a68565b50565b6000610a6460016004615403565b6002610a7160808561542c565b67ffffffffffffffff16610a859190615453565b610a8f8585611c60565b901c166003811115610aa357610aa36141ed565b90505b92915050565b6001546001600160a01b03163314610b065760405162461bcd60e51b815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e657200000000000000000000604482015260640161080b565b600080543373ffffffffffffffffffffffffffffffffffffffff19808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b72611ca7565b815181518114610bae576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610cfa576000848281518110610bcd57610bcd6151ae565b60200260200101519050600081602001515190506000858481518110610bf557610bf56151ae565b6020026020010151905080518214610c39576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82811015610ceb576000828281518110610c5857610c586151ae565b6020026020010151905080600014610ce25784602001518281518110610c8057610c806151ae565b602002602001015160800151811015610ce25784516040517fc8e9605100000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602481018390526044810182905260640161080b565b50600101610c3c565b50505050806001019050610bb1565b50610d05838361195c565b505050565b610d12611a0c565b610a5381611d28565b610d5e6040805160e081019091526000606082018181526080830182905260a0830182905260c08301919091528190815260200160608152602001606081525090565b60ff808316600090815260026020818152604092839020835160e081018552815460608201908152600183015480881660808401526101008104881660a0840152620100009004909616151560c082015294855291820180548451818402810184019095528085529293858301939092830182828015610e0757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610de9575b5050505050815260200160038201805480602002602001604051908101604052809291908181526020018280548015610e6957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e4b575b5050505050815250509050919050565b610e81611a0c565b60005b81811015610d05576000838383818110610ea057610ea06151ae565b905060400201803603810190610eb6919061546a565b9050610ec581602001516113c2565b610f2a57805167ffffffffffffffff1660009081526009602090815260408083208285018051855290835281842093909355915191519182527f202f1139a3e334b6056064c0e9b19fd07e44a88d8f6e5ded571b24cf8c371f12910160405180910390a15b50600101610e84565b60408051606080820183526000808352602080840182905283850183905267ffffffffffffffff8681168352600782529185902085519384018652805460ff811615158552610100900490921690830152600181018054939492939192840191610f9c906154a3565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc8906154a3565b8015610e695780601f10610fea57610100808354040283529160200191610e69565b820191906000526020600020905b815481529060010190602001808311610ff857505050919092525091949350505050565b333014611055576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611092565b604080518082019091526000808252602082015281526020019060019003908161106b5790505b5060a084015151909150156110c5576110c28360a001518460200151856060015186600001516020015186611fb4565b90505b6040805160a0810182528451518152845160209081015167ffffffffffffffff1681830152808601518351600094840192611101929101613e34565b60408051601f19818403018152918152908252868101516020830152018390526005549091506001600160a01b0316801561120e576040517f08d450a10000000000000000000000000000000000000000000000000000000081526001600160a01b038216906308d450a19061117b90859060040161557f565b600060405180830381600087803b15801561119557600080fd5b505af19250505080156111a6575060015b61120e573d8080156111d4576040519150601f19603f3d011682016040523d82523d6000602084013e6111d9565b606091505b50806040517f09c2532500000000000000000000000000000000000000000000000000000000815260040161080b9190613e34565b60408501515115801561122357506080850151155b8061123a575060608501516001600160a01b03163b155b8061127a57506060850151611278906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612092565b155b15611286575050505050565b60048054608087015160608801516040517f3cf9798300000000000000000000000000000000000000000000000000000000815260009485946001600160a01b031693633cf97983936112e1938a9361138893929101615592565b6000604051808303816000875af1158015611300573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261132891908101906155ce565b50915091508161136657806040517f0a8d6e8c00000000000000000000000000000000000000000000000000000000815260040161080b9190613e34565b50505050505050565b611377611a0c565b610a53816120ae565b611388611a0c565b60005b81518110156113be576113b68282815181106113a9576113a96151ae565b6020026020010151612164565b60010161138b565b5050565b6040805180820182523081526020810183815291517f4d61677100000000000000000000000000000000000000000000000000000000815290516001600160a01b039081166004830152915160248201526000917f00000000000000000000000000000000000000000000000000000000000000001690634d61677190604401602060405180830381865afa15801561145f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aa69190615664565b6040517f2cbc26bb000000000000000000000000000000000000000000000000000000008152608082901b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa15801561151e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115429190615664565b15610a53576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8216600482015260240161080b565b67ffffffffffffffff81166000908152600760205260408120805460ff16610aa6576040517fed053c5900000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8416600482015260240161080b565b60ff878116600090815260026020908152604080832081516080810183528154815260019091015480861693820193909352610100830485169181019190915262010000909104909216151560608301528735906116448760a4615681565b905082606001511561168c57845161165d906020615453565b865161166a906020615453565b6116759060a0615681565b61167f9190615681565b6116899082615681565b90505b3681146116ce576040517f8e1192e10000000000000000000000000000000000000000000000000000000081526004810182905236602482015260440161080b565b50815181146117165781516040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101919091526024810182905260440161080b565b61171e611ca7565b60ff808a166000908152600360209081526040808320338452825280832081518083019092528054808616835293949193909284019161010090910416600281111561176c5761176c6141ed565b600281111561177d5761177d6141ed565b905250905060028160200151600281111561179a5761179a6141ed565b1480156117ee5750600260008b60ff1660ff168152602001908152602001600020600301816000015160ff16815481106117d6576117d66151ae565b6000918252602090912001546001600160a01b031633145b611824576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5081606001511561190657602082015161183f906001615694565b60ff1685511461187b576040517f71253a2500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83518551146118b6576040517fa75d88af00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600087876040516118c89291906156ad565b6040519081900381206118df918b906020016156bd565b6040516020818303038152906040528051906020012090506119048a828888886124a8565b505b6040805182815260208a81013567ffffffffffffffff169082015260ff8b16917f198d6990ef96613a9026203077e422916918b03ff47f0be6bee7b02d8e139ef0910160405180910390a2505050505050505050565b8151600003611996576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805160408051600080825260208201909252911591905b8451811015611a05576119fd8582815181106119cb576119cb6151ae565b6020026020010151846119f7578583815181106119ea576119ea6151ae565b60200260200101516126bf565b836126bf565b6001016119ad565b5050505050565b6000546001600160a01b03163314611a665760405162461bcd60e51b815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e657200000000000000000000604482015260640161080b565b565b60a08101516001600160a01b03161580611a8a575080516001600160a01b0316155b15611ac1576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80516004805460208085018051604080880180516060808b0180516001600160a01b039b8c167fffffffffffffffff000000000000000000000000000000000000000000000000909a168a177401000000000000000000000000000000000000000063ffffffff988916021777ffffffffffffffffffffffffffffffffffffffffffffffff167801000000000000000000000000000000000000000000000000948816949094027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16939093177c010000000000000000000000000000000000000000000000000000000093871693909302929092179098556080808b0180516005805473ffffffffffffffffffffffffffffffffffffffff19908116928e1692909217905560a0808e01805160068054909416908f161790925586519a8b5297518716988a0198909852925185169388019390935251909216958501959095525185169383019390935251909216908201527f0da37fd00459f4f5f0b8210d31525e4910ae674b8bab34b561d146bb45773a4c9060c00160405180910390a150565b67ffffffffffffffff8216600090815260086020526040812081611c856080856156d1565b67ffffffffffffffff1681526020810191909152604001600020549392505050565b467f000000000000000000000000000000000000000000000000000000000000000014611a66576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015246602482015260440161080b565b60005b81518110156113be576000828281518110611d4857611d486151ae565b602002602001015190506000816000015190508067ffffffffffffffff16600003611d9f576040517fc656089500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600760205260408120600181018054919291611dca906154a3565b80601f0160208091040260200160405190810160405280929190818152602001828054611df6906154a3565b8015611e435780601f10611e1857610100808354040283529160200191611e43565b820191906000526020600020905b815481529060010190602001808311611e2657829003601f168201915b505050505090506000846040015190508151600003611efc578051600003611e97576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018301611ea58282615740565b50825468ffffffffffffffff00191661010017835560405167ffffffffffffffff851681527ff4c1390c70e5c0f491ae1ccbc06f9117cbbadf2767b247b3bc203280f24c0fb99060200160405180910390a1611f4f565b8080519060200120828051906020012014611f4f576040517fc39a620500000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8516600482015260240161080b565b6020850151835460ff191690151517835560405167ffffffffffffffff8516907f4f49973170c548fddd4a48341b75e131818913f38f44d47af57e8735eee588ba90611f9c908690615800565b60405180910390a25050505050806001019050611d2b565b6060855167ffffffffffffffff811115611fd057611fd0613fe6565b60405190808252806020026020018201604052801561201557816020015b6040805180820190915260008082526020820152815260200190600190039081611fee5790505b50905060005b865181101561208857612063878281518110612039576120396151ae565b6020026020010151878787878681518110612056576120566151ae565b6020026020010151612e61565b828281518110612075576120756151ae565b602090810291909101015260010161201b565b5095945050505050565b600061209d83613270565b8015610aa35750610aa383836132d4565b336001600160a01b038216036121065760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161080b565b6001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b806040015160ff1660000361218f576000604051631b3fab5160e11b815260040161080b91906158bc565b60208082015160ff808216600090815260029093526040832060018101549293909283921690036121fc57606084015160018201805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055612251565b6060840151600182015460ff6201000090910416151590151514612251576040517f87f6037c00000000000000000000000000000000000000000000000000000000815260ff8416600482015260240161080b565b60a08401518051601f60ff82161115612280576001604051631b3fab5160e11b815260040161080b91906158bc565b6122e685856003018054806020026020016040519081016040528092919081815260200182805480156122dc57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122be575b50505050506133a3565b8560600151156124155761235485856002018054806020026020016040519081016040528092919081815260200182805480156122dc576020028201919060005260206000209081546001600160a01b031681526001909101906020018083116122be5750505050506133a3565b6080860151805161236e9060028701906020840190613d3e565b5080516001850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010060ff841690810291909117909155601f10156123ce576002604051631b3fab5160e11b815260040161080b91906158bc565b60408801516123de9060036158d6565b60ff168160ff1611612406576003604051631b3fab5160e11b815260040161080b91906158bc565b6124128783600161340c565b50505b6124218583600261340c565b81516124369060038601906020850190613d3e565b5060408681015160018501805460ff191660ff8316179055875180865560a089015192517fab8b1b57514019638d7b5ce9c638fe71366fe8e2be1c40a7a80f1733d0e9f5479361248f938a939260028b019291906158f2565b60405180910390a16124a08561358c565b505050505050565b6124b0613db0565b835160005b818110156126b55760006001888684602081106124d4576124d46151ae565b6124e191901a601b615694565b8985815181106124f3576124f36151ae565b602002602001015189868151811061250d5761250d6151ae565b60200260200101516040516000815260200160405260405161254b949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa15801561256d573d6000803e3d6000fd5b505060408051601f1981015160ff808e166000908152600360209081528582206001600160a01b038516835281528582208587019096528554808416865293975090955092939284019161010090041660028111156125ce576125ce6141ed565b60028111156125df576125df6141ed565b90525090506001816020015160028111156125fc576125fc6141ed565b14612633576040517fca31867a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051859060ff16601f811061264a5761264a6151ae565b602002015115612686576040517ff67bc7c400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600185826000015160ff16601f81106126a1576126a16151ae565b9115156020909202015250506001016124b5565b5050505050505050565b81516126ca81611483565b60006126d582611585565b6020850151519091506000819003612718576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8460400151518114612756576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff81111561277157612771613fe6565b60405190808252806020026020018201604052801561279a578160200160208202803683370190505b50905060005b8281101561290f576000876020015182815181106127c0576127c06151ae565b602002602001015190507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681600001516040015167ffffffffffffffff161461285357805160409081015190517f38432a2200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260240161080b565b6128e981866001018054612866906154a3565b80601f0160208091040260200160405190810160405280929190818152602001828054612892906154a3565b80156128df5780601f106128b4576101008083540402835291602001916128df565b820191906000526020600020905b8154815290600101906020018083116128c257829003601f168201915b50505050506135a8565b8383815181106128fb576128fb6151ae565b6020908102919091010152506001016127a0565b506000612926858389606001518a608001516136ca565b90508060000361296e576040517f7dd17a7e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015260240161080b565b8551151560005b848110156109ce57600089602001518281518110612995576129956151ae565b6020026020010151905060006129b389836000015160600151610a56565b905060008160038111156129c9576129c96141ed565b14806129e6575060038160038111156129e4576129e46141ed565b145b612a3d578151606001516040805167ffffffffffffffff808d16825290921660208301527f3b575419319662b2a6f5e2467d84521517a3382b908eb3d557bb3fdb0c50e23c91015b60405180910390a15050612e59565b8315612b1e5760045460009074010000000000000000000000000000000000000000900463ffffffff16612a718742615403565b1190508080612a9157506003826003811115612a8f57612a8f6141ed565b145b612ad3576040517fa9cfc86200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8b16600482015260240161080b565b8a8481518110612ae557612ae56151ae565b6020026020010151600014612b18578a8481518110612b0657612b066151ae565b60200260200101518360800181815250505b50612b7f565b6000816003811115612b3257612b326141ed565b14612b7f578151606001516040805167ffffffffffffffff808d16825290921660208301527f3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe651209101612a2e565b81516080015167ffffffffffffffff1615612c6d576000816003811115612ba857612ba86141ed565b03612c6d5781516080015160208301516040517fe0e03cae0000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263e0e03cae92612c1f928e929190600401615978565b6020604051808303816000875af1158015612c3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c629190615664565b612c6d575050612e59565b60008b604001518481518110612c8557612c856151ae565b6020026020010151905080518360a001515114612ce9578251606001516040517f1cfe6d8b00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff808d166004830152909116602482015260440161080b565b612cfd8a8460000151606001516001613720565b600080612d0a85846137c8565b91509150612d218c86600001516060015184613720565b8615612d91576003826003811115612d3b57612d3b6141ed565b03612d91576000846003811115612d5457612d546141ed565b14612d91578451516040517f2b11b8d900000000000000000000000000000000000000000000000000000000815261080b919083906004016159a5565b6002826003811115612da557612da56141ed565b14612dff576003826003811115612dbe57612dbe6141ed565b14612dff578451606001516040517f926c5a3e00000000000000000000000000000000000000000000000000000000815261080b918e9185906004016159be565b8451805160609091015160405167ffffffffffffffff918216918f16907f8c324ce1367b83031769f6a813e3bb4c117aba2185789d66b98b791405be6df290612e4b90879087906159e4565b60405180910390a450505050505b600101612975565b60408051808201909152600080825260208201526000612e848760200151613892565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa158015612f09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2d9190615a04565b90506001600160a01b0381161580612f755750612f736001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612092565b155b15612fb7576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015260240161080b565b6000806130bd6040518061010001604052808b81526020018967ffffffffffffffff1681526020018a6001600160a01b031681526020018c606001518152602001866001600160a01b031681526020018c6000015181526020018c6040015181526020018881525060405160240161302f9190615a21565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f3907753700000000000000000000000000000000000000000000000000000000179052600454859063ffffffff7c0100000000000000000000000000000000000000000000000000000000909104166113886084613938565b5091509150816130fb57806040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161080b9190613e34565b80516020146131435780516040517f78ef802400000000000000000000000000000000000000000000000000000000815260206004820152602481019190915260440161080b565b6000818060200190518101906131599190615af8565b6040516001600160a01b038b166024820152604481018290529091506132069060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052600454879063ffffffff7801000000000000000000000000000000000000000000000000909104166113886084613938565b5090935091508261324557816040517fe1cd550900000000000000000000000000000000000000000000000000000000815260040161080b9190613e34565b604080518082019091526001600160a01b039095168552602085015250919250505095945050505050565b600061329c827f01ffc9a7000000000000000000000000000000000000000000000000000000006132d4565b8015610aa657506132cd827fffffffff000000000000000000000000000000000000000000000000000000006132d4565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561338c575060208210155b80156133985750600081115b979650505050505050565b60005b8151811015610d055760ff8316600090815260036020526040812083519091908490849081106133d8576133d86151ae565b6020908102919091018101516001600160a01b03168252810191909152604001600020805461ffff191690556001016133a6565b60005b82518160ff161015610a3c576000838260ff1681518110613432576134326151ae565b602002602001015190506000600281111561344f5761344f6141ed565b60ff80871660009081526003602090815260408083206001600160a01b0387168452909152902054610100900416600281111561348e5761348e6141ed565b146134af576004604051631b3fab5160e11b815260040161080b91906158bc565b6001600160a01b0381166134ef576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405180604001604052808360ff168152602001846002811115613515576135156141ed565b905260ff80871660009081526003602090815260408083206001600160a01b0387168452825290912083518154931660ff198416811782559184015190929091839161ffff191617610100836002811115613572576135726141ed565b0217905550905050508061358590615b11565b905061340f565b60ff8116610a5357600a805467ffffffffffffffff1916905550565b8151602080820151604092830151925160009384936135ee937f2425b0b9f9054c76ff151b0a175b18f37a4a4e82013a72e9f15c9caa095ed21f93909291889101615b30565b60408051601f1981840301815290829052805160209182012086518051888401516060808b0151908401516080808d015195015195976136379794969395929491939101615b63565b604051602081830303815290604052805190602001208560400151805190602001208660a0015160405160200161366e9190615c5a565b60408051601f198184030181528282528051602091820120908301969096528101939093526060830191909152608082015260a081019190915260c0015b60405160208183030381529060405280519060200120905092915050565b6000806136d8858585613a5e565b90506136e3816113c2565b6136f1576000915050613718565b67ffffffffffffffff86166000908152600960209081526040808320938352929052205490505b949350505050565b6000600261372f60808561542c565b67ffffffffffffffff166137439190615453565b905060006137518585611c60565b90508161376060016004615403565b901b191681836003811115613777576137776141ed565b67ffffffffffffffff871660009081526008602052604081209190921b929092179182916137a66080886156d1565b67ffffffffffffffff1681526020810191909152604001600020555050505050565b6040517fece670b6000000000000000000000000000000000000000000000000000000008152600090606090309063ece670b69061380c9087908790600401615cba565b600060405180830381600087803b15801561382657600080fd5b505af1925050508015613837575060015b613876573d808015613865576040519150601f19603f3d011682016040523d82523d6000602084013e61386a565b606091505b5060039250905061388b565b50506040805160208101909152600081526002905b9250929050565b600081516020146138d157816040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161080b9190613e34565b6000828060200190518101906138e79190615af8565b90506001600160a01b038111806138ff575061040081105b15610aa657826040517f8d666f6000000000000000000000000000000000000000000000000000000000815260040161080b9190613e34565b6000606060008361ffff1667ffffffffffffffff81111561395b5761395b613fe6565b6040519080825280601f01601f191660200182016040528015613985576020820181803683370190505b509150863b6139b8577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a858110156139eb577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b8590036040810481038710613a24577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d84811115613a475750835b808352806000602085013e50955095509592505050565b8251825160009190818303613a9f576040517f11a6b26400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6101018211801590613ab357506101018111155b613ad0576040516309bde33960e01b815260040160405180910390fd5b60001982820101610100811115613afa576040516309bde33960e01b815260040160405180910390fd5b80600003613b275786600081518110613b1557613b156151ae565b60200260200101519350505050613cf6565b60008167ffffffffffffffff811115613b4257613b42613fe6565b604051908082528060200260200182016040528015613b6b578160200160208202803683370190505b50905060008080805b85811015613c955760006001821b8b811603613bcf5788851015613bb8578c5160018601958e918110613ba957613ba96151ae565b60200260200101519050613bf1565b8551600185019487918110613ba957613ba96151ae565b8b5160018401938d918110613be657613be66151ae565b602002602001015190505b600089861015613c21578d5160018701968f918110613c1257613c126151ae565b60200260200101519050613c43565b8651600186019588918110613c3857613c386151ae565b602002602001015190505b82851115613c64576040516309bde33960e01b815260040160405180910390fd5b613c6e8282613cfd565b878481518110613c8057613c806151ae565b60209081029190910101525050600101613b74565b506001850382148015613ca757508683145b8015613cb257508581145b613ccf576040516309bde33960e01b815260040160405180910390fd5b836001860381518110613ce457613ce46151ae565b60200260200101519750505050505050505b9392505050565b6000818310613d1557613d108284613d1b565b610aa3565b610aa383835b6040805160016020820152908101839052606081018290526000906080016136ac565b828054828255906000526020600020908101928215613da0579160200282015b82811115613da0578251825473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909116178255602090920191600190910190613d5e565b50613dac929150613dcf565b5090565b604051806103e00160405280601f906020820280368337509192915050565b5b80821115613dac5760008155600101613dd0565b60005b83811015613dff578181015183820152602001613de7565b50506000910152565b60008151808452613e20816020860160208601613de4565b601f01601f19169290920160200192915050565b602081526000610aa36020830184613e08565b8060608101831015610aa657600080fd5b60008083601f840112613e6a57600080fd5b50813567ffffffffffffffff811115613e8257600080fd5b60208301915083602082850101111561388b57600080fd5b60008083601f840112613eac57600080fd5b50813567ffffffffffffffff811115613ec457600080fd5b6020830191508360208260051b850101111561388b57600080fd5b60008060008060008060008060e0898b031215613efb57600080fd5b613f058a8a613e47565b9750606089013567ffffffffffffffff80821115613f2257600080fd5b613f2e8c838d01613e58565b909950975060808b0135915080821115613f4757600080fd5b613f538c838d01613e9a565b909750955060a08b0135915080821115613f6c57600080fd5b50613f798b828c01613e9a565b999c989b50969995989497949560c00135949350505050565b600080600060808486031215613fa757600080fd5b613fb18585613e47565b9250606084013567ffffffffffffffff811115613fcd57600080fd5b613fd986828701613e58565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b60405160c0810167ffffffffffffffff8111828210171561401f5761401f613fe6565b60405290565b60405160a0810167ffffffffffffffff8111828210171561401f5761401f613fe6565b6040516080810167ffffffffffffffff8111828210171561401f5761401f613fe6565b6040516060810167ffffffffffffffff8111828210171561401f5761401f613fe6565b6040805190810167ffffffffffffffff8111828210171561401f5761401f613fe6565b604051601f8201601f1916810167ffffffffffffffff811182821017156140da576140da613fe6565b604052919050565b6001600160a01b0381168114610a5357600080fd5b8035614102816140e2565b919050565b803563ffffffff8116811461410257600080fd5b600060c0828403121561412d57600080fd5b614135613ffc565b8235614140816140e2565b815261414e60208401614107565b602082015261415f60408401614107565b604082015261417060608401614107565b60608201526080830135614183816140e2565b608082015260a0830135614196816140e2565b60a08201529392505050565b803567ffffffffffffffff8116811461410257600080fd5b600080604083850312156141cd57600080fd5b6141d6836141a2565b91506141e4602084016141a2565b90509250929050565b634e487b7160e01b600052602160045260246000fd5b60048110614213576142136141ed565b9052565b60208101610aa68284614203565b600067ffffffffffffffff82111561423f5761423f613fe6565b5060051b60200190565b600060a0828403121561425b57600080fd5b614263614025565b905081358152614275602083016141a2565b6020820152614286604083016141a2565b6040820152614297606083016141a2565b60608201526142a8608083016141a2565b608082015292915050565b600067ffffffffffffffff8211156142cd576142cd613fe6565b50601f01601f191660200190565b600082601f8301126142ec57600080fd5b81356142ff6142fa826142b3565b6140b1565b81815284602083860101111561431457600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f83011261434257600080fd5b813560206143526142fa83614225565b82815260059290921b8401810191818101908684111561437157600080fd5b8286015b8481101561444757803567ffffffffffffffff808211156143965760008081fd5b8189019150608080601f19848d030112156143b15760008081fd5b6143b9614048565b87840135838111156143cb5760008081fd5b6143d98d8a838801016142db565b825250604080850135848111156143f05760008081fd5b6143fe8e8b838901016142db565b8a84015250606080860135858111156144175760008081fd5b6144258f8c838a01016142db565b9284019290925294909201359381019390935250508352918301918301614375565b509695505050505050565b6000610140828403121561446557600080fd5b61446d613ffc565b90506144798383614249565b815260a082013567ffffffffffffffff8082111561449657600080fd5b6144a2858386016142db565b602084015260c08401359150808211156144bb57600080fd5b6144c7858386016142db565b60408401526144d860e085016140f7565b606084015261010084013560808401526101208401359150808211156144fd57600080fd5b5061450a84828501614331565b60a08301525092915050565b600082601f83011261452757600080fd5b813560206145376142fa83614225565b82815260059290921b8401810191818101908684111561455657600080fd5b8286015b8481101561444757803567ffffffffffffffff81111561457a5760008081fd5b6145888986838b0101614452565b84525091830191830161455a565b600082601f8301126145a757600080fd5b813560206145b76142fa83614225565b82815260059290921b840181019181810190868411156145d657600080fd5b8286015b8481101561444757803567ffffffffffffffff8111156145fa5760008081fd5b6146088986838b01016142db565b8452509183019183016145da565b600082601f83011261462757600080fd5b813560206146376142fa83614225565b82815260059290921b8401810191818101908684111561465657600080fd5b8286015b8481101561444757803567ffffffffffffffff81111561467a5760008081fd5b6146888986838b0101614596565b84525091830191830161465a565b600082601f8301126146a757600080fd5b813560206146b76142fa83614225565b8083825260208201915060208460051b8701019350868411156146d957600080fd5b602086015b8481101561444757803583529183019183016146de565b600082601f83011261470657600080fd5b813560206147166142fa83614225565b82815260059290921b8401810191818101908684111561473557600080fd5b8286015b8481101561444757803567ffffffffffffffff8082111561475a5760008081fd5b818901915060a080601f19848d030112156147755760008081fd5b61477d614025565b6147888885016141a2565b81526040808501358481111561479e5760008081fd5b6147ac8e8b83890101614516565b8a84015250606080860135858111156147c55760008081fd5b6147d38f8c838a0101614616565b83850152506080915081860135858111156147ee5760008081fd5b6147fc8f8c838a0101614696565b9184019190915250919093013590830152508352918301918301614739565b600080604080848603121561482f57600080fd5b833567ffffffffffffffff8082111561484757600080fd5b614853878388016146f5565b945060209150818601358181111561486a57600080fd5b8601601f8101881361487b57600080fd5b80356148896142fa82614225565b81815260059190911b8201840190848101908a8311156148a857600080fd5b8584015b83811015614934578035868111156148c45760008081fd5b8501603f81018d136148d65760008081fd5b878101356148e66142fa82614225565b81815260059190911b82018a0190898101908f8311156149065760008081fd5b928b01925b828410156149245783358252928a0192908a019061490b565b86525050509186019186016148ac565b50809750505050505050509250929050565b60006020828403121561495857600080fd5b813567ffffffffffffffff81111561496f57600080fd5b820160a08185031215613cf657600080fd5b8015158114610a5357600080fd5b803561410281614981565b600060208083850312156149ad57600080fd5b823567ffffffffffffffff808211156149c557600080fd5b818501915085601f8301126149d957600080fd5b81356149e76142fa82614225565b81815260059190911b83018401908481019088831115614a0657600080fd5b8585015b83811015614a9657803585811115614a225760008081fd5b86016060818c03601f1901811315614a3a5760008081fd5b614a4261406b565b614a4d8a84016141a2565b8152604080840135614a5e81614981565b828c0152918301359188831115614a755760008081fd5b614a838e8c858701016142db565b9082015285525050918601918601614a0a565b5098975050505050505050565b803560ff8116811461410257600080fd5b600060208284031215614ac657600080fd5b610aa382614aa3565b60008151808452602080850194506020840160005b83811015614b095781516001600160a01b031687529582019590820190600101614ae4565b509495945050505050565b60208152600082518051602084015260ff602082015116604084015260ff604082015116606084015260608101511515608084015250602083015160c060a0840152614b6360e0840182614acf565b90506040840151601f198483030160c0850152614b808282614acf565b95945050505050565b60008060408385031215614b9c57600080fd5b614ba5836141a2565b946020939093013593505050565b60008060208385031215614bc657600080fd5b823567ffffffffffffffff80821115614bde57600080fd5b818501915085601f830112614bf257600080fd5b813581811115614c0157600080fd5b8660208260061b8501011115614c1657600080fd5b60209290920196919550909350505050565b600060208284031215614c3a57600080fd5b610aa3826141a2565b6020815281511515602082015267ffffffffffffffff6020830151166040820152600060408301516060808401526137186080840182613e08565b60008060408385031215614c9157600080fd5b823567ffffffffffffffff80821115614ca957600080fd5b614cb586838701614452565b93506020850135915080821115614ccb57600080fd5b50614cd885828601614596565b9150509250929050565b600060208284031215614cf457600080fd5b8135613cf6816140e2565b600082601f830112614d1057600080fd5b81356020614d206142fa83614225565b8083825260208201915060208460051b870101935086841115614d4257600080fd5b602086015b84811015614447578035614d5a816140e2565b8352918301918301614d47565b60006020808385031215614d7a57600080fd5b823567ffffffffffffffff80821115614d9257600080fd5b818501915085601f830112614da657600080fd5b8135614db46142fa82614225565b81815260059190911b83018401908481019088831115614dd357600080fd5b8585015b83811015614a9657803585811115614dee57600080fd5b860160c0818c03601f19011215614e055760008081fd5b614e0d613ffc565b8882013581526040614e20818401614aa3565b8a8301526060614e31818501614aa3565b8284015260809150614e4482850161498f565b9083015260a08381013589811115614e5c5760008081fd5b614e6a8f8d83880101614cff565b838501525060c0840135915088821115614e845760008081fd5b614e928e8c84870101614cff565b9083015250845250918601918601614dd7565b600060208284031215614eb757600080fd5b5035919050565b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461410257600080fd5b600082601f830112614efb57600080fd5b81356020614f0b6142fa83614225565b82815260069290921b84018101918181019086841115614f2a57600080fd5b8286015b848110156144475760408189031215614f475760008081fd5b614f4f61408e565b614f58826141a2565b8152614f65858301614ebe565b81860152835291830191604001614f2e565b600082601f830112614f8857600080fd5b81356020614f986142fa83614225565b82815260079290921b84018101918181019086841115614fb757600080fd5b8286015b84811015614447578088036080811215614fd55760008081fd5b614fdd61406b565b614fe6836141a2565b8152604080601f1984011215614ffc5760008081fd5b61500461408e565b92506150118785016141a2565b835261501e8185016141a2565b8388015281870192909252606083013591810191909152835291830191608001614fbb565b6000602080838503121561505657600080fd5b823567ffffffffffffffff8082111561506e57600080fd5b8185019150604080838803121561508457600080fd5b61508c61408e565b83358381111561509b57600080fd5b84016040818a0312156150ad57600080fd5b6150b561408e565b8135858111156150c457600080fd5b8201601f81018b136150d557600080fd5b80356150e36142fa82614225565b81815260069190911b8201890190898101908d83111561510257600080fd5b928a01925b828410156151525787848f03121561511f5760008081fd5b61512761408e565b8435615132816140e2565b815261513f858d01614ebe565b818d0152825292870192908a0190615107565b84525050508187013593508484111561516a57600080fd5b6151768a858401614eea565b818801528252508385013591508282111561519057600080fd5b61519c88838601614f77565b85820152809550505050505092915050565b634e487b7160e01b600052603260045260246000fd5b805160408084528151848201819052600092602091908201906060870190855b8181101561523057835180516001600160a01b031684528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168584015292840192918501916001016151e4565b50508583015187820388850152805180835290840192506000918401905b8083101561529f578351805167ffffffffffffffff1683528501517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff168583015292840192600192909201919085019061524e565b50979650505050505050565b602081526000610aa360208301846151c4565b67ffffffffffffffff8316815260608101613cf66020830184805167ffffffffffffffff908116835260209182015116910152565b634e487b7160e01b600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561532a5761532a6152f3565b5092915050565b60006020808352606084516040808487015261535060608701836151c4565b87850151878203601f19016040890152805180835290860193506000918601905b80831015614a9657845167ffffffffffffffff8151168352878101516153b089850182805167ffffffffffffffff908116835260209182015116910152565b50840151828701529386019360019290920191608090910190615371565b6000602082840312156153e057600080fd5b813567ffffffffffffffff8111156153f757600080fd5b613718848285016146f5565b81810381811115610aa657610aa66152f3565b634e487b7160e01b600052601260045260246000fd5b600067ffffffffffffffff8084168061544757615447615416565b92169190910692915050565b8082028115828204841417610aa657610aa66152f3565b60006040828403121561547c57600080fd5b61548461408e565b61548d836141a2565b8152602083013560208201528091505092915050565b600181811c908216806154b757607f821691505b6020821081036154d757634e487b7160e01b600052602260045260246000fd5b50919050565b805182526000602067ffffffffffffffff81840151168185015260408084015160a0604087015261551160a0870182613e08565b90506060850151868203606088015261552a8282613e08565b608087810151898303918a01919091528051808352908601935060009250908501905b8083101561529f57835180516001600160a01b031683528601518683015292850192600192909201919084019061554d565b602081526000610aa360208301846154dd565b6080815260006155a560808301876154dd565b61ffff9590951660208301525060408101929092526001600160a01b0316606090910152919050565b6000806000606084860312156155e357600080fd5b83516155ee81614981565b602085015190935067ffffffffffffffff81111561560b57600080fd5b8401601f8101861361561c57600080fd5b805161562a6142fa826142b3565b81815287602083850101111561563f57600080fd5b615650826020830160208601613de4565b809450505050604084015190509250925092565b60006020828403121561567657600080fd5b8151613cf681614981565b80820180821115610aa657610aa66152f3565b60ff8181168382160190811115610aa657610aa66152f3565b8183823760009101908152919050565b828152606082602083013760800192915050565b600067ffffffffffffffff808416806156ec576156ec615416565b92169190910492915050565b601f821115610d05576000816000526020600020601f850160051c810160208610156157215750805b601f850160051c820191505b818110156124a05782815560010161572d565b815167ffffffffffffffff81111561575a5761575a613fe6565b61576e8161576884546154a3565b846156f8565b602080601f8311600181146157a3576000841561578b5750858301515b600019600386901b1c1916600185901b1785556124a0565b600085815260208120601f198616915b828110156157d2578886015182559484019460019091019084016157b3565b50858210156157f05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808352835460ff81161515602085015267ffffffffffffffff8160081c16604085015250600180850160608086015260008154615840816154a3565b80608089015260a06001831660008114615861576001811461587d576158ad565b60ff19841660a08b015260a083151560051b8b010194506158ad565b85600052602060002060005b848110156158a45781548c8201850152908801908901615889565b8b0160a0019550505b50929998505050505050505050565b60208101600583106158d0576158d06141ed565b91905290565b60ff818116838216029081169081811461532a5761532a6152f3565b600060a0820160ff88168352602087602085015260a0604085015281875480845260c086019150886000526020600020935060005b8181101561594c5784546001600160a01b031683526001948501949284019201615927565b505084810360608601526159608188614acf565b935050505060ff831660808301529695505050505050565b600067ffffffffffffffff808616835280851660208401525060606040830152614b806060830184613e08565b8281526040602082015260006137186040830184613e08565b67ffffffffffffffff848116825283166020820152606081016137186040830184614203565b6159ee8184614203565b6040602082015260006137186040830184613e08565b600060208284031215615a1657600080fd5b8151613cf6816140e2565b6020815260008251610100806020850152615a40610120850183613e08565b91506020850151615a5d604086018267ffffffffffffffff169052565b5060408501516001600160a01b038116606086015250606085015160808501526080850151615a9760a08601826001600160a01b03169052565b5060a0850151601f19808685030160c0870152615ab48483613e08565b935060c08701519150808685030160e0870152615ad18483613e08565b935060e0870151915080868503018387015250615aee8382613e08565b9695505050505050565b600060208284031215615b0a57600080fd5b5051919050565b600060ff821660ff8103615b2757615b276152f3565b60010192915050565b848152600067ffffffffffffffff808616602084015280851660408401525060806060830152615aee6080830184613e08565b86815260c060208201526000615b7c60c0830188613e08565b6001600160a01b039690961660408301525067ffffffffffffffff9384166060820152608081019290925290911660a09091015292915050565b600082825180855260208086019550808260051b84010181860160005b84811015615c4d57601f19868403018952815160808151818652615bf982870182613e08565b9150508582015185820387870152615c118282613e08565b91505060408083015186830382880152615c2b8382613e08565b6060948501519790940196909652505098840198925090830190600101615bd3565b5090979650505050505050565b602081526000610aa36020830184615bb6565b60008282518085526020808601955060208260051b8401016020860160005b84811015615c4d57601f19868403018952615ca8838351613e08565b98840198925090830190600101615c8c565b604081526000835180516040840152602081015167ffffffffffffffff80821660608601528060408401511660808601528060608401511660a08601528060808401511660c086015250505060208401516101408060e0850152615d22610180850183613e08565b915060408601517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08086850301610100870152615d5f8483613e08565b935060608801519150615d7e6101208701836001600160a01b03169052565b60808801518387015260a0880151925080868503016101608701525050615da58282615bb6565b9150508281036020840152614b808185615c6d56fea164736f6c6343000818000a",
}
var EVM2EVMMultiOffRampABI = EVM2EVMMultiOffRampMetaData.ABI
@@ -662,6 +662,124 @@ func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampTransactorSession) TransferOwners
return _EVM2EVMMultiOffRamp.Contract.TransferOwnership(&_EVM2EVMMultiOffRamp.TransactOpts, to)
}
+type EVM2EVMMultiOffRampAlreadyAttemptedIterator struct {
+ Event *EVM2EVMMultiOffRampAlreadyAttempted
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *EVM2EVMMultiOffRampAlreadyAttemptedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(EVM2EVMMultiOffRampAlreadyAttempted)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(EVM2EVMMultiOffRampAlreadyAttempted)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *EVM2EVMMultiOffRampAlreadyAttemptedIterator) Error() error {
+ return it.fail
+}
+
+func (it *EVM2EVMMultiOffRampAlreadyAttemptedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type EVM2EVMMultiOffRampAlreadyAttempted struct {
+ SourceChainSelector uint64
+ SequenceNumber uint64
+ Raw types.Log
+}
+
+func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) FilterAlreadyAttempted(opts *bind.FilterOpts) (*EVM2EVMMultiOffRampAlreadyAttemptedIterator, error) {
+
+ logs, sub, err := _EVM2EVMMultiOffRamp.contract.FilterLogs(opts, "AlreadyAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return &EVM2EVMMultiOffRampAlreadyAttemptedIterator{contract: _EVM2EVMMultiOffRamp.contract, event: "AlreadyAttempted", logs: logs, sub: sub}, nil
+}
+
+func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) WatchAlreadyAttempted(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOffRampAlreadyAttempted) (event.Subscription, error) {
+
+ logs, sub, err := _EVM2EVMMultiOffRamp.contract.WatchLogs(opts, "AlreadyAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(EVM2EVMMultiOffRampAlreadyAttempted)
+ if err := _EVM2EVMMultiOffRamp.contract.UnpackLog(event, "AlreadyAttempted", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) ParseAlreadyAttempted(log types.Log) (*EVM2EVMMultiOffRampAlreadyAttempted, error) {
+ event := new(EVM2EVMMultiOffRampAlreadyAttempted)
+ if err := _EVM2EVMMultiOffRamp.contract.UnpackLog(event, "AlreadyAttempted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
type EVM2EVMMultiOffRampCommitReportAcceptedIterator struct {
Event *EVM2EVMMultiOffRampCommitReportAccepted
@@ -2164,6 +2282,8 @@ func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRampFilterer) ParseTransmitted(log ty
func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRamp) ParseLog(log types.Log) (generated.AbigenLog, error) {
switch log.Topics[0] {
+ case _EVM2EVMMultiOffRamp.abi.Events["AlreadyAttempted"].ID:
+ return _EVM2EVMMultiOffRamp.ParseAlreadyAttempted(log)
case _EVM2EVMMultiOffRamp.abi.Events["CommitReportAccepted"].ID:
return _EVM2EVMMultiOffRamp.ParseCommitReportAccepted(log)
case _EVM2EVMMultiOffRamp.abi.Events["ConfigSet"].ID:
@@ -2194,6 +2314,10 @@ func (_EVM2EVMMultiOffRamp *EVM2EVMMultiOffRamp) ParseLog(log types.Log) (genera
}
}
+func (EVM2EVMMultiOffRampAlreadyAttempted) Topic() common.Hash {
+ return common.HexToHash("0x3ef2a99c550a751d4b0b261268f05a803dfb049ab43616a1ffb388f61fe65120")
+}
+
func (EVM2EVMMultiOffRampCommitReportAccepted) Topic() common.Hash {
return common.HexToHash("0x3a3950e13dd607cc37980db0ef14266c40d2bba9c01b2e44bfe549808883095d")
}
@@ -2289,6 +2413,12 @@ type EVM2EVMMultiOffRampInterface interface {
TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error)
+ FilterAlreadyAttempted(opts *bind.FilterOpts) (*EVM2EVMMultiOffRampAlreadyAttemptedIterator, error)
+
+ WatchAlreadyAttempted(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOffRampAlreadyAttempted) (event.Subscription, error)
+
+ ParseAlreadyAttempted(log types.Log) (*EVM2EVMMultiOffRampAlreadyAttempted, error)
+
FilterCommitReportAccepted(opts *bind.FilterOpts) (*EVM2EVMMultiOffRampCommitReportAcceptedIterator, error)
WatchCommitReportAccepted(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOffRampCommitReportAccepted) (event.Subscription, error)
diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
index 2a4605bfd2..8e2cab8d8f 100644
--- a/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
+++ b/core/gethwrappers/ccip/generated/evm_2_evm_offramp/evm_2_evm_offramp.go
@@ -104,8 +104,8 @@ type RateLimiterTokenBucket struct {
}
var EVM2EVMOffRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"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\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"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\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"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\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
- Bin: "0x6101a06040523480156200001257600080fd5b5060405162005e6138038062005e618339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051615798620006c9600039600081816102ec01528181611a52015261309e0152600081816102bd01528181611a2a0152611cdc01526000818161028e01528181610e7f01528181610ee401528181611a000152818161228401526122ee01526000611e7b01526000818161025f01526119d60152600081816101ff015261197a01526000818161022f015281816119ae01528181611c9901528181612d0001526131af0152600081816101d0015281816119550152611f5b015260008181611bf30152611c3f01526157986000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063f077b59211610066578063f077b592146105f3578063f2fde38b14610609578063f52121a51461061c57600080fd5b8063afcb95d7146105ad578063b1dc65a4146105cd578063c92b2832146105e057600080fd5b8063856c8247116100bd578063856c82471461055d578063873504d7146105895780638da5cb5b1461059c57600080fd5b806381ff70481461051f57806385572ffb1461054f57600080fd5b8063599f64311161013a578063740f415011610114578063740f4150146104615780637437ff9f1461047457806379ba50971461051757600080fd5b8063599f643114610414578063666cab8d14610439578063704b6c021461044e57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b578063546719cd146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103299190613ed9565b60405180910390f35b610345610340366004613f6f565b61062f565b6040516103299190613fcf565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b604051610329919061402d565b6103ae6103a9366004614256565b6106aa565b005b6103b8610a9e565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610441610b53565b6040516103299190614368565b6103ae61045c36600461437b565b610bb5565b6103ae61046f3660046147db565b610c7e565b61050a6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff8082168352640100000000820416602083015268010000000000000000810461ffff16928201929092526a01000000000000000000009091046001600160a01b039081166060830152600b5416608082015290565b6040516103299190614896565b6103ae610d70565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae6101823660046148ec565b61057061056b36600461437b565b610e53565b60405167ffffffffffffffff9091168152602001610329565b6103ae6105973660046149b8565b610f56565b6000546001600160a01b0316610421565b604080516001815260006020820181905291810191909152606001610329565b6103ae6105db366004614a61565b611124565b6103ae6105ee366004614b66565b61132f565b6105fb61139a565b604051610329929190614bd4565b6103ae61061736600461437b565b6114c0565b6103ae61062a366004614bf9565b6114d1565b600061063d60016004614c82565b600261064a608085614cc4565b67ffffffffffffffff1661065e9190614ceb565b6010600061066d608087614d02565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106a4576106a4613f8c565b92915050565b84518460ff16601f8211156106f75760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614d29565b60405180910390fd5b806000036107345760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614d29565b61073c611771565b610745856117e7565b60095460005b818110156107bc57600860006009838154811061076a5761076a614d43565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161074b565b5050865160005b8181101561095f5760008982815181106107df576107df614d43565b60200260200101519050600060028111156107fc576107fc613f8c565b6001600160a01b038216600090815260086020526040902054610100900460ff16600281111561082e5761082e613f8c565b146108685760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614d29565b6001600160a01b0381166108a8576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561094b5761094b613f8c565b0217905550905050508060010190506107c3565b5087516109739060099060208b0190613e47565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a1617179055600780546109f99146913091906000906109cb9063ffffffff16614d72565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611ab1565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610a8a9487949293918316921691909117908f908f908f908f908f908f90614d95565b60405180910390a150505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610b4e90611b3e565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610bab57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b8d575b5050505050905090565b6000546001600160a01b03163314801590610bdb57506002546001600160a01b03163314155b15610c12576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b610c86611bf0565b81515181518114610cc3576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d60576000838281518110610ce257610ce2614d43565b6020026020010151905080600014610d57578451805183908110610d0857610d08614d43565b602002602001015160800151811015610d57576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106ee565b50600101610cc6565b50610d6b8383611c71565b505050565b6001546001600160a01b03163314610de4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106ee565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106a4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106a4576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190614e2b565b9392505050565b610f5e611771565b60005b825181101561103157610f9b838281518110610f7f57610f7f614d43565b602002602001015160200151600c6126f490919063ffffffff16565b15611029577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d58782838281518110610fd357610fd3614d43565b602002602001015160000151848381518110610ff157610ff1614d43565b6020026020010151602001516040516110209291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101610f61565b5060005b8151811015610d6b5761108e82828151811061105357611053614d43565b60200260200101516020015183838151811061107157611071614d43565b602002602001015160000151600c6127099092919063ffffffff16565b1561111c577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a8282815181106110c6576110c6614d43565b6020026020010151600001518383815181106110e4576110e4614d43565b6020026020010151602001516040516111139291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611035565b61112e8787612727565b600554883590808214611177576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016106ee565b61117f611bf0565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561120757611207613f8c565b600281111561121857611218613f8c565b905250905060028160200151600281111561123557611235613f8c565b14801561126f57506009816000015160ff168154811061125757611257614d43565b6000918252602090912001546001600160a01b031633145b6112a5576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006112b3856020614ceb565b6112be886020614ceb565b6112ca8b610144614e48565b6112d49190614e48565b6112de9190614e48565b9050368114611322576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106ee565b5050505050505050505050565b6000546001600160a01b0316331480159061135557506002546001600160a01b03163314155b1561138c576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61139760038261274e565b50565b60608060006113a9600c612933565b90508067ffffffffffffffff8111156113c4576113c4614040565b6040519080825280602002602001820160405280156113ed578160200160208202803683370190505b5092508067ffffffffffffffff81111561140957611409614040565b604051908082528060200260200182016040528015611432578160200160208202803683370190505b50915060005b818110156114ba5760008061144e600c8461293e565b915091508086848151811061146557611465614d43565b60200260200101906001600160a01b031690816001600160a01b0316815250508185848151811061149857611498614d43565b6001600160a01b03909216602092830291909101909101525050600101611438565b50509091565b6114c8611771565b6113978161295c565b33301461150a576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611547565b60408051808201909152600080825260208201528152602001906001900390816115205790505b5061014084015151909150156115a7576115a4836101400151846020015160405160200161158491906001600160a01b0391909116815260200190565b604051602081830303815290604052856040015186610160015186612a37565b90505b610120830151511580156115bd57506080830151155b806115d4575060408301516001600160a01b03163b155b8061161457506040830151611612906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612b68565b155b1561161e57505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808861018001518152602001886000015167ffffffffffffffff168152602001886020015160405160200161169691906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001886101200151815260200186815250611388886080015189604001516040518563ffffffff1660e01b81526004016116e59493929190614ea0565b6000604051808303816000875af1158015611704573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261172c9190810190614faa565b50915091508161176a57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b5050505050565b6000546001600160a01b031633146117e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106ee565b565b6000818060200190518101906117fd9190615018565b60608101519091506001600160a01b0316611844576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015160408087015160608089015163ffffffff9889167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909716969096176401000000009890941697909702929092177fffff00000000000000000000000000000000000000000000ffffffffffffffff166801000000000000000061ffff909316929092027fffff0000000000000000000000000000000000000000ffffffffffffffffffff16919091176a01000000000000000000006001600160a01b039485160217909355608080860151600b80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918516919091179055835160e0810185527f0000000000000000000000000000000000000000000000000000000000000000841681527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff908116938201939093527f0000000000000000000000000000000000000000000000000000000000000000909216828501527f00000000000000000000000000000000000000000000000000000000000000008316948201949094527f00000000000000000000000000000000000000000000000000000000000000008216938101939093527f0000000000000000000000000000000000000000000000000000000000000000811660a08401527f00000000000000000000000000000000000000000000000000000000000000001660c0830152517f7879e20bb60a503429de4a2c912b5904f08a39f2af054c10fb46434b5d61126091611aa59184906150b3565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611ad599989796959493929190615175565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611bcc82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611bb09190614c82565b85608001516fffffffffffffffffffffffffffffffff16612b84565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b467f0000000000000000000000000000000000000000000000000000000000000000146117e5576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106ee565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4f91906151fd565b15611d86576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611dc3576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611e01576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611e1c57611e1c614040565b604051908082528060200260200182016040528015611e45578160200160208202803683370190505b50905060005b82811015611f1d57600085600001518281518110611e6b57611e6b614d43565b60200260200101519050611e9f817f0000000000000000000000000000000000000000000000000000000000000000612ba3565b838381518110611eb157611eb1614d43565b602002602001018181525050806101800151838381518110611ed557611ed5614d43565b602002602001015114611f14576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611e4b565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592611f919287929160040161524b565b602060405180830381865afa158015611fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd29190615281565b90508060000361200e576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156126eb5760008760000151828151811061203557612035614d43565b60200260200101519050600061204e826060015161062f565b9050600281600381111561206457612064613f8c565b036120ab57816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a250506126e3565b60008160038111156120bf576120bf613f8c565b14806120dc575060038160038111156120da576120da613f8c565b145b6121245760608201516040517f50a6e05200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106ee565b83156121e157600a5460009063ffffffff166121408742614c82565b11905080806121605750600382600381111561215e5761215e613f8c565b145b612196576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8884815181106121a8576121a8614d43565b60200260200101516000146121db578884815181106121c9576121c9614d43565b60200260200101518360800181815250505b5061223e565b60008160038111156121f5576121f5613f8c565b1461223e5760608201516040517f67d9ba0f00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016106ee565b60c082015167ffffffffffffffff16156124bd576020808301516001600160a01b03166000908152600f909152604081205467ffffffffffffffff1690819003612428577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156124285760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa158015612337573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235b9190614e2b565b60c084015190915067ffffffffffffffff1661237882600161529a565b67ffffffffffffffff16146123d85782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a35050506126e3565b6020838101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b600082600381111561243c5761243c613f8c565b036124bb5760c083015167ffffffffffffffff1661245b82600161529a565b67ffffffffffffffff16146124bb5782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a35050506126e3565b505b6000896020015184815181106124d5576124d5614d43565b602002602001015190506125018360600151846000015185610140015151866101200151518551612cfe565b61251083606001516001612e78565b60008061251d8584612f22565b9150915061252f856060015183612e78565b861561259b57600382600381111561254957612549613f8c565b0361259b57600084600381111561256257612562613f8c565b1461259b57806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b60028260038111156125af576125af613f8c565b146126075760038260038111156125c8576125c8613f8c565b14612607578460600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016106ee9291906152bb565b60c085015167ffffffffffffffff161561268f57600084600381111561262f5761262f613f8c565b0361268f576020808601516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff1691612667836152d9565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef6584846040516126d59291906152f6565b60405180910390a350505050505b600101612015565b50505050505050565b6000610f4f836001600160a01b038416612feb565b600061271f846001600160a01b03851684612ff7565b949350505050565b61274a61273682840184615316565b604080516000815260208101909152611c71565b5050565b815460009061277790700100000000000000000000000000000000900463ffffffff1642614c82565b9050801561281957600183015483546127bf916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612b84565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b6020820151835461283f916fffffffffffffffffffffffffffffffff908116911661300d565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906129269084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106a482613023565b600080808061294d868661302e565b909450925050505b9250929050565b336001600160a01b038216036129ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106ee565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612b4d57612ab4888281518110612a5a57612a5a614d43565b6020026020010151602001518888888581518110612a7a57612a7a614d43565b6020026020010151806020019051810190612a95919061534b565b888681518110612aa757612aa7614d43565b602002602001015161303d565b838281518110612ac657612ac6614d43565b6020026020010181905250612b02838281518110612ae657612ae6614d43565b602002602001015160000151600c61343d90919063ffffffff16565b15612b4557612b38838281518110612b1c57612b1c614d43565b6020908102919091010151600b546001600160a01b0316613452565b612b429083614e48565b91505b600101612a3c565b508015612b5d57612b5d81613573565b505b95945050505050565b6000612b7383613580565b8015610f4f5750610f4f83836135e4565b6000612b5f85612b948486614ceb565b612b9e9087614e48565b61300d565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612c399897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612c729190615411565b60405160208183030381529060405280519060200120876101600151604051602001612c9e919061547e565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612d77576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106ee565b600a5468010000000000000000900461ffff16831115612dcf576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b808314612e14576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b600a54640100000000900463ffffffff1682111561176a57600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff166004820152602481018390526044016106ee565b60006002612e87608085614cc4565b67ffffffffffffffff16612e9b9190614ceb565b90506000601081612ead608087614d02565b67ffffffffffffffff168152602081019190915260400160002054905081612ed760016004614c82565b901b191681836003811115612eee57612eee613f8c565b901b178060106000612f01608088614d02565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590612f669087908790600401615491565b600060405180830381600087803b158015612f8057600080fd5b505af1925050508015612f91575060015b612fd0573d808015612fbf576040519150601f19603f3d011682016040523d82523d6000602084013e612fc4565b606091505b50600392509050612955565b50506040805160208101909152600081526002909250929050565b6000610f4f83836136b3565b600061271f84846001600160a01b0385166136d0565b600081831061301c5781610f4f565b5090919050565b60006106a4826136ed565b600080808061294d86866136f8565b604080518082019091526000808252602082015260006130608460200151613723565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa1580156130e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310991906155f4565b90506001600160a01b0381161580613151575061314f6001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612b68565b155b15613193576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106ee565b60008060006132986040518061010001604052808c81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018b6001600160a01b031681526020018d8152602001876001600160a01b031681526020018a6000015181526020018a604001518152602001898152506040516024016132299190615611565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f390775370000000000000000000000000000000000000000000000000000000017905260608a0151869063ffffffff1661138860846137c9565b925092509250826132d757816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b815160201461331f5781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106ee565b6000828060200190518101906133359190615281565b6040516001600160a01b038c166024820152604481018290529091506133d29060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260608b015188906133c890869063ffffffff16614c82565b61138860846137c9565b5090945092508361341157826040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b604080518082019091526001600160a01b03909616865260208601525092935050505095945050505050565b6000610f4f836001600160a01b0384166138ef565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa1580156134b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134dc91906156e8565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036135455783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016106ee565b602084015161271f907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906138fb565b6113976003826000613938565b60006135ac827f01ffc9a7000000000000000000000000000000000000000000000000000000006135e4565b80156106a457506135dd827fffffffff000000000000000000000000000000000000000000000000000000006135e4565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d9150600051905082801561369c575060208210155b80156136a85750600081115b979650505050505050565b60008181526002830160205260408120819055610f4f8383613c87565b6000828152600284016020526040812082905561271f8484613c93565b60006106a482613c9f565b600080806137068585613ca9565b600081815260029690960160205260409095205494959350505050565b6000815160201461376257816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b6000828060200190518101906137789190615281565b90506001600160a01b03811180613790575061040081105b156106a457826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee919061402d565b6000606060008361ffff1667ffffffffffffffff8111156137ec576137ec614040565b6040519080825280601f01601f191660200182016040528015613816576020820181803683370190505b509150863b613849577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a8581101561387c577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b85900360408104810387106138b5577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156138d85750835b808352806000602085013e50955095509592505050565b6000610f4f8383613cb5565b6000670de0b6b3a764000061392e837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616614ceb565b610f4f9190615748565b825474010000000000000000000000000000000000000000900460ff16158061395f575081155b1561396957505050565b825460018401546fffffffffffffffffffffffffffffffff808316929116906000906139af90700100000000000000000000000000000000900463ffffffff1642614c82565b90508015613a6f57818311156139f1576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001860154613a2b9083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612b84565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613b0c576001600160a01b038416613ac1576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016106ee565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b03851660448201526064016106ee565b84831015613c055760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613b509082614c82565b613b5a878a614c82565b613b649190614e48565b613b6e9190615748565b90506001600160a01b038616613bba576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016106ee565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b03871660448201526064016106ee565b613c0f8584614c82565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610f4f8383613cd4565b6000610f4f8383613dce565b60006106a4825490565b6000610f4f8383613e1d565b6000610f4f838360008181526001830160205260408120541515610f4f565b60008181526001830160205260408120548015613dbd576000613cf8600183614c82565b8554909150600090613d0c90600190614c82565b9050818114613d71576000866000018281548110613d2c57613d2c614d43565b9060005260206000200154905080876000018481548110613d4f57613d4f614d43565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613d8257613d8261575c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106a4565b60009150506106a4565b5092915050565b6000818152600183016020526040812054613e15575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106a4565b5060006106a4565b6000826000018281548110613e3457613e34614d43565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215613eb4579160200282015b82811115613eb457825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613e67565b50613ec0929150613ec4565b5090565b5b80821115613ec05760008155600101613ec5565b60e081016106a482846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff8116811461139757600080fd5b8035613f6a81613f49565b919050565b600060208284031215613f8157600080fd5b8135610f4f81613f49565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613fcb57613fcb613f8c565b9052565b602081016106a48284613fbb565b60005b83811015613ff8578181015183820152602001613fe0565b50506000910152565b60008151808452614019816020860160208601613fdd565b601f01601f19169290920160200192915050565b602081526000610f4f6020830184614001565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561409257614092614040565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561409257614092614040565b6040516080810167ffffffffffffffff8111828210171561409257614092614040565b604051601f8201601f1916810167ffffffffffffffff8111828210171561410857614108614040565b604052919050565b600067ffffffffffffffff82111561412a5761412a614040565b5060051b60200190565b6001600160a01b038116811461139757600080fd5b8035613f6a81614134565b600082601f83011261416557600080fd5b8135602061417a61417583614110565b6140df565b8083825260208201915060208460051b87010193508684111561419c57600080fd5b602086015b848110156141c15780356141b481614134565b83529183019183016141a1565b509695505050505050565b803560ff81168114613f6a57600080fd5b600067ffffffffffffffff8211156141f7576141f7614040565b50601f01601f191660200190565b600082601f83011261421657600080fd5b8135614224614175826141dd565b81815284602083860101111561423957600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561426f57600080fd5b863567ffffffffffffffff8082111561428757600080fd5b6142938a838b01614154565b975060208901359150808211156142a957600080fd5b6142b58a838b01614154565b96506142c360408a016141cc565b955060608901359150808211156142d957600080fd5b6142e58a838b01614205565b94506142f360808a01613f5f565b935060a089013591508082111561430957600080fd5b5061431689828a01614205565b9150509295509295509295565b60008151808452602080850194506020840160005b8381101561435d5781516001600160a01b031687529582019590820190600101614338565b509495945050505050565b602081526000610f4f6020830184614323565b60006020828403121561438d57600080fd5b8135610f4f81614134565b801515811461139757600080fd5b8035613f6a81614398565b600082601f8301126143c257600080fd5b813560206143d261417583614110565b82815260069290921b840181019181810190868411156143f157600080fd5b8286015b848110156141c1576040818903121561440e5760008081fd5b61441661406f565b813561442181614134565b815281850135858201528352918301916040016143f5565b600082601f83011261444a57600080fd5b8135602061445a61417583614110565b82815260059290921b8401810191818101908684111561447957600080fd5b8286015b848110156141c157803567ffffffffffffffff81111561449d5760008081fd5b6144ab8986838b0101614205565b84525091830191830161447d565b60006101a082840312156144cc57600080fd5b6144d4614098565b90506144df82613f5f565b81526144ed60208301614149565b60208201526144fe60408301614149565b604082015261450f60608301613f5f565b60608201526080820135608082015261452a60a083016143a6565b60a082015261453b60c08301613f5f565b60c082015261454c60e08301614149565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561457957600080fd5b61458586838701614205565b838501526101409250828501359150808211156145a157600080fd5b6145ad868387016143b1565b838501526101609250828501359150808211156145c957600080fd5b506145d685828601614439565b82840152505061018080830135818301525092915050565b600082601f8301126145ff57600080fd5b8135602061460f61417583614110565b82815260059290921b8401810191818101908684111561462e57600080fd5b8286015b848110156141c157803567ffffffffffffffff8111156146525760008081fd5b6146608986838b0101614439565b845250918301918301614632565b600082601f83011261467f57600080fd5b8135602061468f61417583614110565b8083825260208201915060208460051b8701019350868411156146b157600080fd5b602086015b848110156141c157803583529183019183016146b6565b6000608082840312156146df57600080fd5b6146e76140bc565b9050813567ffffffffffffffff8082111561470157600080fd5b818401915084601f83011261471557600080fd5b8135602061472561417583614110565b82815260059290921b8401810191818101908884111561474457600080fd5b8286015b8481101561477c578035868111156147605760008081fd5b61476e8b86838b01016144b9565b845250918301918301614748565b508652508581013593508284111561479357600080fd5b61479f878588016145ee565b908501525060408401359150808211156147b857600080fd5b506147c58482850161466e565b6040830152506060820135606082015292915050565b600080604083850312156147ee57600080fd5b823567ffffffffffffffff8082111561480657600080fd5b614812868387016146cd565b935060209150818501358181111561482957600080fd5b85019050601f8101861361483c57600080fd5b803561484a61417582614110565b81815260059190911b8201830190838101908883111561486957600080fd5b928401925b828410156148875783358252928401929084019061486e565b80955050505050509250929050565b60a081016106a4828463ffffffff8082511683528060208301511660208401525061ffff604082015116604083015260608101516001600160a01b03808216606085015280608084015116608085015250505050565b6000602082840312156148fe57600080fd5b813567ffffffffffffffff81111561491557600080fd5b820160a08185031215610f4f57600080fd5b600082601f83011261493857600080fd5b8135602061494861417583614110565b82815260069290921b8401810191818101908684111561496757600080fd5b8286015b848110156141c157604081890312156149845760008081fd5b61498c61406f565b813561499781614134565b8152818501356149a681614134565b8186015283529183019160400161496b565b600080604083850312156149cb57600080fd5b823567ffffffffffffffff808211156149e357600080fd5b6149ef86838701614927565b93506020850135915080821115614a0557600080fd5b50614a1285828601614927565b9150509250929050565b60008083601f840112614a2e57600080fd5b50813567ffffffffffffffff811115614a4657600080fd5b6020830191508360208260051b850101111561295557600080fd5b60008060008060008060008060e0898b031215614a7d57600080fd5b606089018a811115614a8e57600080fd5b8998503567ffffffffffffffff80821115614aa857600080fd5b818b0191508b601f830112614abc57600080fd5b813581811115614acb57600080fd5b8c6020828501011115614add57600080fd5b6020830199508098505060808b0135915080821115614afb57600080fd5b614b078c838d01614a1c565b909750955060a08b0135915080821115614b2057600080fd5b50614b2d8b828c01614a1c565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff81168114613f6a57600080fd5b600060608284031215614b7857600080fd5b6040516060810181811067ffffffffffffffff82111715614b9b57614b9b614040565b6040528235614ba981614398565b8152614bb760208401614b46565b6020820152614bc860408401614b46565b60408201529392505050565b604081526000614be76040830185614323565b8281036020840152612b5f8185614323565b60008060408385031215614c0c57600080fd5b823567ffffffffffffffff80821115614c2457600080fd5b614c30868387016144b9565b93506020850135915080821115614c4657600080fd5b50614a1285828601614439565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106a4576106a4614c53565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614cdf57614cdf614c95565b92169190910692915050565b80820281158282048414176106a4576106a4614c53565b600067ffffffffffffffff80841680614d1d57614d1d614c95565b92169190910492915050565b6020810160038310614d3d57614d3d613f8c565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818103614d8b57614d8b614c53565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614dc58184018a614323565b90508281036080840152614dd98189614323565b905060ff871660a084015282810360c0840152614df68187614001565b905067ffffffffffffffff851660e0840152828103610100840152614e1b8185614001565b9c9b505050505050505050505050565b600060208284031215614e3d57600080fd5b8151610f4f81613f49565b808201808211156106a4576106a4614c53565b60008151808452602080850194506020840160005b8381101561435d57815180516001600160a01b031688528301518388015260409096019590820190600101614e70565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614edb610120840182614001565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152614f178383614001565b925060808901519150808584030161010086015250614f368282614e5b565b92505050614f4a602083018661ffff169052565b836040830152612b5f60608301846001600160a01b03169052565b600082601f830112614f7657600080fd5b8151614f84614175826141dd565b818152846020838601011115614f9957600080fd5b61271f826020830160208701613fdd565b600080600060608486031215614fbf57600080fd5b8351614fca81614398565b602085015190935067ffffffffffffffff811115614fe757600080fd5b614ff386828701614f65565b925050604084015190509250925092565b805163ffffffff81168114613f6a57600080fd5b600060a0828403121561502a57600080fd5b60405160a0810181811067ffffffffffffffff8211171561504d5761504d614040565b60405261505983615004565b815261506760208401615004565b6020820152604083015161ffff8116811461508157600080fd5b6040820152606083015161509481614134565b606082015260808301516150a781614134565b60808201529392505050565b610180810161512482856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e0840152602084015116610100830152604083015161ffff1661012083015260608301516001600160a01b03908116610140840152608084015116610160830152610f4f565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526151af8285018b614323565b915083820360808501526151c3828a614323565b915060ff881660a085015283820360c08501526151e08288614001565b90861660e08501528381036101008501529050614e1b8185614001565b60006020828403121561520f57600080fd5b8151610f4f81614398565b60008151808452602080850194506020840160005b8381101561435d5781518752958201959082019060010161522f565b60608152600061525e606083018661521a565b8281036020840152615270818661521a565b915050826040830152949350505050565b60006020828403121561529357600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115613dc757613dc7614c53565b67ffffffffffffffff8316815260408101610f4f6020830184613fbb565b600067ffffffffffffffff808316818103614d8b57614d8b614c53565b6153008184613fbb565b60406020820152600061271f6040830184614001565b60006020828403121561532857600080fd5b813567ffffffffffffffff81111561533f57600080fd5b61271f848285016146cd565b60006020828403121561535d57600080fd5b815167ffffffffffffffff8082111561537557600080fd5b908301906080828603121561538957600080fd5b6153916140bc565b8251828111156153a057600080fd5b6153ac87828601614f65565b8252506020830151828111156153c157600080fd5b6153cd87828601614f65565b6020830152506040830151828111156153e557600080fd5b6153f187828601614f65565b60408301525061540360608401615004565b606082015295945050505050565b602081526000610f4f6020830184614e5b565b60008282518085526020808601955060208260051b8401016020860160005b8481101561547157601f1986840301895261545f838351614001565b98840198925090830190600101615443565b5090979650505050505050565b602081526000610f4f6020830184615424565b604081526154ac60408201845167ffffffffffffffff169052565b600060208401516154c860608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006155298185018367ffffffffffffffff169052565b60e08601519150610120615547818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a061016081818701526155776101e0870185614001565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc06101808188870301818901526155b68686614e5b565b9550828a015194508188870301848901526155d18686615424565b9550808a01516101c089015250505050508281036020840152612b5f8185615424565b60006020828403121561560657600080fd5b8151610f4f81614134565b6020815260008251610100806020850152615630610120850183614001565b9150602085015161564d604086018267ffffffffffffffff169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161568760a08601826001600160a01b03169052565b5060a0850151601f19808685030160c08701526156a48483614001565b935060c08701519150808685030160e08701526156c18483614001565b935060e08701519150808685030183870152506156de8382614001565b9695505050505050565b6000604082840312156156fa57600080fd5b61570261406f565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461572e57600080fd5b815261573c60208401615004565b60208201529392505050565b60008261575757615757614c95565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"rateLimiterConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"}],\"name\":\"AggregateValueMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"}],\"name\":\"AggregateValueRateLimitReached\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyExecuted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BucketOverfilled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CanOnlySelfCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CommitStoreAlreadyInUse\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"actual\",\"type\":\"bytes32\"}],\"name\":\"ConfigDigestMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptyReport\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ExecutionError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"ForkedChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumOCR2BaseNoChecks.InvalidConfigErrorType\",\"name\":\"errorType\",\"type\":\"uint8\"}],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"}],\"name\":\"InvalidDataLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newLimit\",\"type\":\"uint256\"}],\"name\":\"InvalidManualExecutionGasLimit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidMessageId\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"newState\",\"type\":\"uint8\"}],\"name\":\"InvalidNewState\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidSourceChain\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionGasLimitMismatch\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ManualExecutionNotYetEnabled\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"notPool\",\"type\":\"address\"}],\"name\":\"NotACompatiblePool\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByAdminOrOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OracleCannotBeZeroAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"PriceNotFoundForToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"ReceiverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RootNotCommitted\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"TokenDataMismatch\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"err\",\"type\":\"bytes\"}],\"name\":\"TokenHandlingError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"capacity\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"requested\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenMaxCapacityExceeded\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"minWaitInSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"available\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRateLimitReached\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnauthorizedTransmitter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnexpectedTokenData\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expected\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actual\",\"type\":\"uint256\"}],\"name\":\"WrongMessageLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"AlreadyAttempted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"indexed\":false,\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"ConfigChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"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\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"state\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ExecutionStateChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"SkippedAlreadyExecutedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedIncorrectNonce\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"SkippedSenderWithPreviousRampMessageInflight\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"name\":\"TokenAggregateRateLimitRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokens\",\"type\":\"uint256\"}],\"name\":\"TokensConsumed\",\"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\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"sender\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"destTokenAmounts\",\"type\":\"tuple[]\"}],\"internalType\":\"structClient.Any2EVMMessage\",\"name\":\"\",\"type\":\"tuple\"}],\"name\":\"ccipReceive\",\"outputs\":[],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentRateLimiterState\",\"outputs\":[{\"components\":[{\"internalType\":\"uint128\",\"name\":\"tokens\",\"type\":\"uint128\"},{\"internalType\":\"uint32\",\"name\":\"lastUpdated\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.TokenBucket\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"bytes[]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[]\"}],\"name\":\"executeSingleMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllRateLimitTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"sourceTokens\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"destTokens\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"permissionLessExecutionThresholdSeconds\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.DynamicConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"}],\"name\":\"getExecutionState\",\"outputs\":[{\"internalType\":\"enumInternal.MessageExecutionState\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"getSenderNonce\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"commitStore\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"onRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"prevOffRamp\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTokenLimitAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTransmitters\",\"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\":[{\"components\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"strict\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[]\",\"name\":\"sourceTokenData\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"}],\"internalType\":\"structInternal.EVM2EVMMessage[]\",\"name\":\"messages\",\"type\":\"tuple[]\"},{\"internalType\":\"bytes[][]\",\"name\":\"offchainTokenData\",\"type\":\"bytes[][]\"},{\"internalType\":\"bytes32[]\",\"name\":\"proofs\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint256\",\"name\":\"proofFlagBits\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.ExecutionReport\",\"name\":\"report\",\"type\":\"tuple\"},{\"internalType\":\"uint256[]\",\"name\":\"gasLimitOverrides\",\"type\":\"uint256[]\"}],\"name\":\"manuallyExecute\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"setAdmin\",\"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\":\"onchainConfig\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"name\":\"setOCR2Config\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint128\",\"name\":\"capacity\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"rate\",\"type\":\"uint128\"}],\"internalType\":\"structRateLimiter.Config\",\"name\":\"config\",\"type\":\"tuple\"}],\"name\":\"setRateLimiterConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[3]\",\"name\":\"reportContext\",\"type\":\"bytes32[3]\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"rs\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"ss\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"transmit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"removes\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"destToken\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMOffRamp.RateLimitToken[]\",\"name\":\"adds\",\"type\":\"tuple[]\"}],\"name\":\"updateRateLimitTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ Bin: "0x6101a06040523480156200001257600080fd5b5060405162005e0a38038062005e0a8339810160408190526200003591620004ec565b8033806000816200008d5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c057620000c081620002ca565b50506040805160a081018252602084810180516001600160801b039081168085524263ffffffff169385018490528751151585870181905292518216606080870182905298909601519091166080948501819052600380546001600160a01b031916909217600160801b9485021760ff60a01b1916600160a01b90930292909217905502909117600455469052508201516001600160a01b031615806200016f575081516001600160a01b0316155b8062000186575060c08201516001600160a01b0316155b15620001a5576040516342bcdf7f60e11b815260040160405180910390fd5b81600001516001600160a01b0316634120fccd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620001e8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020e9190620005b5565b6001600160401b03166001146200023857604051636fc2a20760e11b815260040160405180910390fd5b81516001600160a01b0390811660a090815260408401516001600160401b0390811660c0908152602086015190911660e05260608501518316610100526080850151831661014052908401518216610160528301511661018052620002bd7f8acd72527118c8324937b1a42e02cd246697c3b633f1742f3cae11de233722b362000375565b6101205250620005da9050565b336001600160a01b03821603620003245760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000084565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008160c05160e05161010051604051602001620003bf94939291909384526001600160401b039283166020850152911660408301526001600160a01b0316606082015260800190565b604051602081830303815290604052805190602001209050919050565b60405160e081016001600160401b03811182821017156200040d57634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b03811681146200042b57600080fd5b919050565b80516001600160401b03811681146200042b57600080fd5b80516001600160801b03811681146200042b57600080fd5b6000606082840312156200047357600080fd5b604051606081016001600160401b0381118282101715620004a457634e487b7160e01b600052604160045260246000fd5b806040525080915082518015158114620004bd57600080fd5b8152620004cd6020840162000448565b6020820152620004e06040840162000448565b60408201525092915050565b6000808284036101408112156200050257600080fd5b60e08112156200051157600080fd5b506200051c620003dc565b620005278462000413565b8152620005376020850162000430565b60208201526200054a6040850162000430565b60408201526200055d6060850162000413565b6060820152620005706080850162000413565b60808201526200058360a0850162000413565b60a08201526200059660c0850162000413565b60c08201529150620005ac8460e0850162000460565b90509250929050565b600060208284031215620005c857600080fd5b620005d38262000430565b9392505050565b60805160a05160c05160e0516101005161012051610140516101605161018051615741620006c9600039600081816102ec01528181611a5201526130470152600081816102bd01528181611a2a0152611cdc01526000818161028e01528181610e7f01528181610ee401528181611a000152818161222d015261229701526000611e7b01526000818161025f01526119d60152600081816101ff015261197a01526000818161022f015281816119ae01528181611c9901528181612ca901526131580152600081816101d0015281816119550152611f5b015260008181611bf30152611c3f01526157416000f3fe608060405234801561001057600080fd5b50600436106101825760003560e01c806381ff7048116100d8578063afcb95d71161008c578063f077b59211610066578063f077b592146105f3578063f2fde38b14610609578063f52121a51461061c57600080fd5b8063afcb95d7146105ad578063b1dc65a4146105cd578063c92b2832146105e057600080fd5b8063856c8247116100bd578063856c82471461055d578063873504d7146105895780638da5cb5b1461059c57600080fd5b806381ff70481461051f57806385572ffb1461054f57600080fd5b8063599f64311161013a578063740f415011610114578063740f4150146104615780637437ff9f1461047457806379ba50971461051757600080fd5b8063599f643114610414578063666cab8d14610439578063704b6c021461044e57600080fd5b8063181f5a771161016b578063181f5a77146103525780631ef381741461039b578063546719cd146103b057600080fd5b806306285c6914610187578063142a98fc14610332575b600080fd5b61031c6040805160e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316815250905090565b6040516103299190613e82565b60405180910390f35b610345610340366004613f18565b61062f565b6040516103299190613f78565b61038e6040518060400160405280601881526020017f45564d3245564d4f666652616d7020312e352e302d646576000000000000000081525081565b6040516103299190613fd6565b6103ae6103a93660046141ff565b6106aa565b005b6103b8610a9e565b604051610329919081516fffffffffffffffffffffffffffffffff908116825260208084015163ffffffff1690830152604080840151151590830152606080840151821690830152608092830151169181019190915260a00190565b6002546001600160a01b03165b6040516001600160a01b039091168152602001610329565b610441610b53565b6040516103299190614311565b6103ae61045c366004614324565b610bb5565b6103ae61046f366004614784565b610c7e565b61050a6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152506040805160a081018252600a5463ffffffff8082168352640100000000820416602083015268010000000000000000810461ffff16928201929092526a01000000000000000000009091046001600160a01b039081166060830152600b5416608082015290565b604051610329919061483f565b6103ae610d70565b6007546005546040805163ffffffff80851682526401000000009094049093166020840152820152606001610329565b6103ae610182366004614895565b61057061056b366004614324565b610e53565b60405167ffffffffffffffff9091168152602001610329565b6103ae610597366004614961565b610f56565b6000546001600160a01b0316610421565b604080516001815260006020820181905291810191909152606001610329565b6103ae6105db366004614a0a565b611124565b6103ae6105ee366004614b0f565b61132f565b6105fb61139a565b604051610329929190614b7d565b6103ae610617366004614324565b6114c0565b6103ae61062a366004614ba2565b6114d1565b600061063d60016004614c2b565b600261064a608085614c6d565b67ffffffffffffffff1661065e9190614c94565b6010600061066d608087614cab565b67ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002054901c1660038111156106a4576106a4613f35565b92915050565b84518460ff16601f8211156106f75760016040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614cd2565b60405180910390fd5b806000036107345760006040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614cd2565b61073c611771565b610745856117e7565b60095460005b818110156107bc57600860006009838154811061076a5761076a614cec565b60009182526020808320909101546001600160a01b03168352820192909252604001902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560010161074b565b5050865160005b8181101561095f5760008982815181106107df576107df614cec565b60200260200101519050600060028111156107fc576107fc613f35565b6001600160a01b038216600090815260086020526040902054610100900460ff16600281111561082e5761082e613f35565b146108685760026040517f367f56a20000000000000000000000000000000000000000000000000000000081526004016106ee9190614cd2565b6001600160a01b0381166108a8576040517fd6c62c9b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915260ff8316815260208101600290526001600160a01b03821660009081526008602090815260409091208251815460ff9091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0082168117835592840151919283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000161761010083600281111561094b5761094b613f35565b0217905550905050508060010190506107c3565b5087516109739060099060208b0190613df0565b506006805460ff838116610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909216908a1617179055600780546109f99146913091906000906109cb9063ffffffff16614d1b565b91906101000a81548163ffffffff021916908363ffffffff160217905563ffffffff168c8c8c8c8c8c611ab1565b6005819055600780544363ffffffff9081166401000000009081027fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff841681179094556040519083048216947f1591690b8638f5fb2dbec82ac741805ac5da8b45dc5263f4875b0496fdce4e0594610a8a9487949293918316921691909117908f908f908f908f908f908f90614d3e565b60405180910390a150505050505050505050565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091526040805160a0810182526003546fffffffffffffffffffffffffffffffff808216835270010000000000000000000000000000000080830463ffffffff1660208501527401000000000000000000000000000000000000000090920460ff161515938301939093526004548084166060840152049091166080820152610b4e90611b3e565b905090565b60606009805480602002602001604051908101604052809291908181526020018280548015610bab57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b8d575b5050505050905090565b6000546001600160a01b03163314801590610bdb57506002546001600160a01b03163314155b15610c12576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c9060200160405180910390a150565b610c86611bf0565b81515181518114610cc3576040517f83e3f56400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610d60576000838281518110610ce257610ce2614cec565b6020026020010151905080600014610d57578451805183908110610d0857610d08614cec565b602002602001015160800151811015610d57576040517f085e39cf00000000000000000000000000000000000000000000000000000000815260048101839052602481018290526044016106ee565b50600101610cc6565b50610d6b8383611c71565b505050565b6001546001600160a01b03163314610de4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016106ee565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000808316821784556001805490911690556040516001600160a01b0390921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6001600160a01b0381166000908152600f602052604081205467ffffffffffffffff168082036106a4577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156106a4576040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063856c824790602401602060405180830381865afa158015610f2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f4f9190614dd4565b9392505050565b610f5e611771565b60005b825181101561103157610f9b838281518110610f7f57610f7f614cec565b602002602001015160200151600c61269d90919063ffffffff16565b15611029577fcbf3cbeaed4ac1d605ed30f4af06c35acaeff2379db7f6146c9cceee83d58782838281518110610fd357610fd3614cec565b602002602001015160000151848381518110610ff157610ff1614cec565b6020026020010151602001516040516110209291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101610f61565b5060005b8151811015610d6b5761108e82828151811061105357611053614cec565b60200260200101516020015183838151811061107157611071614cec565b602002602001015160000151600c6126b29092919063ffffffff16565b1561111c577ffc23abf7ddbd3c02b1420dafa2355c56c1a06fbb8723862ac14d6bd74177361a8282815181106110c6576110c6614cec565b6020026020010151600001518383815181106110e4576110e4614cec565b6020026020010151602001516040516111139291906001600160a01b0392831681529116602082015260400190565b60405180910390a15b600101611035565b61112e87876126d0565b600554883590808214611177576040517f93df584c00000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044016106ee565b61117f611bf0565b6040805183815260208c81013560081c63ffffffff16908201527fb04e63db38c49950639fa09d29872f21f5d49d614f3a969d8adf3d4b52e41a62910160405180910390a13360009081526008602090815260408083208151808301909252805460ff8082168452929391929184019161010090910416600281111561120757611207613f35565b600281111561121857611218613f35565b905250905060028160200151600281111561123557611235613f35565b14801561126f57506009816000015160ff168154811061125757611257614cec565b6000918252602090912001546001600160a01b031633145b6112a5576040517fda0f08e800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060006112b3856020614c94565b6112be886020614c94565b6112ca8b610144614df1565b6112d49190614df1565b6112de9190614df1565b9050368114611322576040517f8e1192e1000000000000000000000000000000000000000000000000000000008152600481018290523660248201526044016106ee565b5050505050505050505050565b6000546001600160a01b0316331480159061135557506002546001600160a01b03163314155b1561138c576040517ff6cd562000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113976003826126f7565b50565b60608060006113a9600c6128dc565b90508067ffffffffffffffff8111156113c4576113c4613fe9565b6040519080825280602002602001820160405280156113ed578160200160208202803683370190505b5092508067ffffffffffffffff81111561140957611409613fe9565b604051908082528060200260200182016040528015611432578160200160208202803683370190505b50915060005b818110156114ba5760008061144e600c846128e7565b915091508086848151811061146557611465614cec565b60200260200101906001600160a01b031690816001600160a01b0316815250508185848151811061149857611498614cec565b6001600160a01b03909216602092830291909101909101525050600101611438565b50509091565b6114c8611771565b61139781612905565b33301461150a576040517f371a732800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820190925281611547565b60408051808201909152600080825260208201528152602001906001900390816115205790505b5061014084015151909150156115a7576115a4836101400151846020015160405160200161158491906001600160a01b0391909116815260200190565b6040516020818303038152906040528560400151866101600151866129e0565b90505b610120830151511580156115bd57506080830151155b806115d4575060408301516001600160a01b03163b155b8061161457506040830151611612906001600160a01b03167f85572ffb00000000000000000000000000000000000000000000000000000000612b11565b155b1561161e57505050565b600080600a600001600a9054906101000a90046001600160a01b03166001600160a01b0316633cf979836040518060a001604052808861018001518152602001886000015167ffffffffffffffff168152602001886020015160405160200161169691906001600160a01b0391909116815260200190565b6040516020818303038152906040528152602001886101200151815260200186815250611388886080015189604001516040518563ffffffff1660e01b81526004016116e59493929190614e49565b6000604051808303816000875af1158015611704573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261172c9190810190614f53565b50915091508161176a57806040517f0a8d6e8c0000000000000000000000000000000000000000000000000000000081526004016106ee9190613fd6565b5050505050565b6000546001600160a01b031633146117e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016106ee565b565b6000818060200190518101906117fd9190614fc1565b60608101519091506001600160a01b0316611844576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600a805460208085015160408087015160608089015163ffffffff9889167fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909716969096176401000000009890941697909702929092177fffff00000000000000000000000000000000000000000000ffffffffffffffff166801000000000000000061ffff909316929092027fffff0000000000000000000000000000000000000000ffffffffffffffffffff16919091176a01000000000000000000006001600160a01b039485160217909355608080860151600b80547fffffffffffffffffffffffff000000000000000000000000000000000000000016918516919091179055835160e0810185527f0000000000000000000000000000000000000000000000000000000000000000841681527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff908116938201939093527f0000000000000000000000000000000000000000000000000000000000000000909216828501527f00000000000000000000000000000000000000000000000000000000000000008316948201949094527f00000000000000000000000000000000000000000000000000000000000000008216938101939093527f0000000000000000000000000000000000000000000000000000000000000000811660a08401527f00000000000000000000000000000000000000000000000000000000000000001660c0830152517f7879e20bb60a503429de4a2c912b5904f08a39f2af054c10fb46434b5d61126091611aa591849061505c565b60405180910390a15050565b6000808a8a8a8a8a8a8a8a8a604051602001611ad59998979695949392919061511e565b60408051601f1981840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e01000000000000000000000000000000000000000000000000000000000000179150509998505050505050505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152611bcc82606001516fffffffffffffffffffffffffffffffff1683600001516fffffffffffffffffffffffffffffffff16846020015163ffffffff1642611bb09190614c2b565b85608001516fffffffffffffffffffffffffffffffff16612b2d565b6fffffffffffffffffffffffffffffffff1682525063ffffffff4216602082015290565b467f0000000000000000000000000000000000000000000000000000000000000000146117e5576040517f0f01ce850000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060048201524660248201526044016106ee565b6040517f2cbc26bb0000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060801b77ffffffffffffffff000000000000000000000000000000001660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632cbc26bb90602401602060405180830381865afa158015611d2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d4f91906151a6565b15611d86576040517f53ad11d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151516000819003611dc3576040517ebf199700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8260200151518114611e01576040517f57e0e08300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008167ffffffffffffffff811115611e1c57611e1c613fe9565b604051908082528060200260200182016040528015611e45578160200160208202803683370190505b50905060005b82811015611f1d57600085600001518281518110611e6b57611e6b614cec565b60200260200101519050611e9f817f0000000000000000000000000000000000000000000000000000000000000000612b4c565b838381518110611eb157611eb1614cec565b602002602001018181525050806101800151838381518110611ed557611ed5614cec565b602002602001015114611f14576040517f7185cf6b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600101611e4b565b50604080850151606086015191517f320488750000000000000000000000000000000000000000000000000000000081526000926001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001692633204887592611f91928792916004016151f4565b602060405180830381865afa158015611fae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd2919061522a565b90508060000361200e576040517fea75680100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8351151560005b848110156126945760008760000151828151811061203557612035614cec565b60200260200101519050600061204e826060015161062f565b9050600081600381111561206457612064613f35565b14806120815750600381600381111561207f5761207f613f35565b145b6120c757816060015167ffffffffffffffff167fe3dd0bec917c965a133ddb2c84874725ee1e2fd8d763c19efa36d6a11cd82b1f60405160405180910390a2505061268c565b831561218457600a5460009063ffffffff166120e38742614c2b565b11905080806121035750600382600381111561210157612101613f35565b145b612139576040517f6358b0d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b88848151811061214b5761214b614cec565b602002602001015160001461217e5788848151811061216c5761216c614cec565b60200260200101518360800181815250505b506121e7565b600081600381111561219857612198613f35565b146121e757606082015160405167ffffffffffffffff90911681527f67d9ba0f63d427c482c2736300e6d5a34c6691dbcdea8ad35828a1f1ba47e8729060200160405180910390a1505061268c565b60c082015167ffffffffffffffff1615612466576020808301516001600160a01b03166000908152600f909152604081205467ffffffffffffffff16908190036123d1577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316156123d15760208301516040517f856c82470000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201527f00000000000000000000000000000000000000000000000000000000000000009091169063856c824790602401602060405180830381865afa1580156122e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123049190614dd4565b60c084015190915067ffffffffffffffff16612321826001615243565b67ffffffffffffffff16146123815782602001516001600160a01b03168360c0015167ffffffffffffffff167fe44a20935573a783dd0d5991c92d7b6a0eb3173566530364db3ec10e9a990b5d60405160405180910390a350505061268c565b6020838101516001600160a01b03166000908152600f9091526040902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff83161790555b60008260038111156123e5576123e5613f35565b036124645760c083015167ffffffffffffffff16612404826001615243565b67ffffffffffffffff16146124645782602001516001600160a01b03168360c0015167ffffffffffffffff167fd32ddb11d71e3d63411d37b09f9a8b28664f1cb1338bfd1413c173b0ebf4123760405160405180910390a350505061268c565b505b60008960200151848151811061247e5761247e614cec565b602002602001015190506124aa8360600151846000015185610140015151866101200151518551612ca7565b6124b983606001516001612e21565b6000806124c68584612ecb565b915091506124d8856060015183612e21565b86156125445760038260038111156124f2576124f2613f35565b0361254457600084600381111561250b5761250b613f35565b1461254457806040517fcf19edfd0000000000000000000000000000000000000000000000000000000081526004016106ee9190613fd6565b600282600381111561255857612558613f35565b146125b057600382600381111561257157612571613f35565b146125b0578460600151826040517f9e2616030000000000000000000000000000000000000000000000000000000081526004016106ee929190615264565b60c085015167ffffffffffffffff16156126385760008460038111156125d8576125d8613f35565b03612638576020808601516001600160a01b03166000908152600f90915260408120805467ffffffffffffffff169161261083615282565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550505b846101800151856060015167ffffffffffffffff167fd4f851956a5d67c3997d1c9205045fef79bae2947fdee7e9e2641abc7391ef65848460405161267e92919061529f565b60405180910390a350505050505b600101612015565b50505050505050565b6000610f4f836001600160a01b038416612f94565b60006126c8846001600160a01b03851684612fa0565b949350505050565b6126f36126df828401846152bf565b604080516000815260208101909152611c71565b5050565b815460009061272090700100000000000000000000000000000000900463ffffffff1642614c2b565b905080156127c25760018301548354612768916fffffffffffffffffffffffffffffffff80821692811691859170010000000000000000000000000000000090910416612b2d565b83546fffffffffffffffffffffffffffffffff919091167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116177001000000000000000000000000000000004263ffffffff16021783555b602082015183546127e8916fffffffffffffffffffffffffffffffff9081169116612fb6565b83548351151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffff000000000000000000000000000000009091166fffffffffffffffffffffffffffffffff92831617178455602083015160408085015183167001000000000000000000000000000000000291909216176001850155517f9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19906128cf9084908151151581526020808301516fffffffffffffffffffffffffffffffff90811691830191909152604092830151169181019190915260600190565b60405180910390a1505050565b60006106a482612fcc565b60008080806128f68686612fd7565b909450925050505b9250929050565b336001600160a01b03821603612977576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016106ee565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b846000805b8751811015612af657612a5d888281518110612a0357612a03614cec565b6020026020010151602001518888888581518110612a2357612a23614cec565b6020026020010151806020019051810190612a3e91906152f4565b888681518110612a5057612a50614cec565b6020026020010151612fe6565b838281518110612a6f57612a6f614cec565b6020026020010181905250612aab838281518110612a8f57612a8f614cec565b602002602001015160000151600c6133e690919063ffffffff16565b15612aee57612ae1838281518110612ac557612ac5614cec565b6020908102919091010151600b546001600160a01b03166133fb565b612aeb9083614df1565b91505b6001016129e5565b508015612b0657612b068161351c565b505b95945050505050565b6000612b1c83613529565b8015610f4f5750610f4f838361358d565b6000612b0885612b3d8486614c94565b612b479087614df1565b612fb6565b60008060001b8284602001518560400151866060015187608001518860a001518960c001518a60e001518b6101000151604051602001612be29897969594939291906001600160a01b039889168152968816602088015267ffffffffffffffff95861660408801526060870194909452911515608086015290921660a0840152921660c082015260e08101919091526101000190565b6040516020818303038152906040528051906020012085610120015180519060200120866101400151604051602001612c1b91906153ba565b60405160208183030381529060405280519060200120876101600151604051602001612c479190615427565b60408051601f198184030181528282528051602091820120908301979097528101949094526060840192909252608083015260a082015260c081019190915260e00160405160208183030381529060405280519060200120905092915050565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168467ffffffffffffffff1614612d20576040517f1279ec8a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff851660048201526024016106ee565b600a5468010000000000000000900461ffff16831115612d78576040517f099d3f7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b808314612dbd576040517f8808f8e700000000000000000000000000000000000000000000000000000000815267ffffffffffffffff861660048201526024016106ee565b600a54640100000000900463ffffffff1682111561176a57600a546040517f8693378900000000000000000000000000000000000000000000000000000000815264010000000090910463ffffffff166004820152602481018390526044016106ee565b60006002612e30608085614c6d565b67ffffffffffffffff16612e449190614c94565b90506000601081612e56608087614cab565b67ffffffffffffffff168152602081019190915260400160002054905081612e8060016004614c2b565b901b191681836003811115612e9757612e97613f35565b901b178060106000612eaa608088614cab565b67ffffffffffffffff16815260208101919091526040016000205550505050565b6040517ff52121a5000000000000000000000000000000000000000000000000000000008152600090606090309063f52121a590612f0f908790879060040161543a565b600060405180830381600087803b158015612f2957600080fd5b505af1925050508015612f3a575060015b612f79573d808015612f68576040519150601f19603f3d011682016040523d82523d6000602084013e612f6d565b606091505b506003925090506128fe565b50506040805160208101909152600081526002909250929050565b6000610f4f838361365c565b60006126c884846001600160a01b038516613679565b6000818310612fc55781610f4f565b5090919050565b60006106a482613696565b60008080806128f686866136a1565b6040805180820190915260008082526020820152600061300984602001516136cc565b6040517fbbe4f6db0000000000000000000000000000000000000000000000000000000081526001600160a01b0380831660048301529192506000917f0000000000000000000000000000000000000000000000000000000000000000169063bbe4f6db90602401602060405180830381865afa15801561308e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130b2919061559d565b90506001600160a01b03811615806130fa57506130f86001600160a01b0382167faff2afbf00000000000000000000000000000000000000000000000000000000612b11565b155b1561313c576040517fae9b4ce90000000000000000000000000000000000000000000000000000000081526001600160a01b03821660048201526024016106ee565b60008060006132416040518061010001604052808c81526020017f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020018b6001600160a01b031681526020018d8152602001876001600160a01b031681526020018a6000015181526020018a604001518152602001898152506040516024016131d291906155ba565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f390775370000000000000000000000000000000000000000000000000000000017905260608a0151869063ffffffff166113886084613772565b9250925092508261328057816040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee9190613fd6565b81516020146132c85781516040517f78ef80240000000000000000000000000000000000000000000000000000000081526020600482015260248101919091526044016106ee565b6000828060200190518101906132de919061522a565b6040516001600160a01b038c1660248201526044810182905290915061337b9060640160408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905260608b0151889061337190869063ffffffff16614c2b565b6113886084613772565b509094509250836133ba57826040517fe1cd55090000000000000000000000000000000000000000000000000000000081526004016106ee9190613fd6565b604080518082019091526001600160a01b03909616865260208601525092935050505095945050505050565b6000610f4f836001600160a01b038416613898565b81516040517fd02641a00000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009182919084169063d02641a0906024016040805180830381865afa158015613461573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134859190615691565b5190507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff81166000036134ee5783516040517f9a655f7b0000000000000000000000000000000000000000000000000000000081526001600160a01b0390911660048201526024016106ee565b60208401516126c8907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8316906138a4565b61139760038260006138e1565b6000613555827f01ffc9a70000000000000000000000000000000000000000000000000000000061358d565b80156106a45750613586827fffffffff0000000000000000000000000000000000000000000000000000000061358d565b1592915050565b604080517fffffffff000000000000000000000000000000000000000000000000000000008316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a700000000000000000000000000000000000000000000000000000000178152825160009392849283928392918391908a617530fa92503d91506000519050828015613645575060208210155b80156136515750600081115b979650505050505050565b60008181526002830160205260408120819055610f4f8383613c30565b600082815260028401602052604081208290556126c88484613c3c565b60006106a482613c48565b600080806136af8585613c52565b600081815260029690960160205260409095205494959350505050565b6000815160201461370b57816040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee9190613fd6565b600082806020019051810190613721919061522a565b90506001600160a01b03811180613739575061040081105b156106a457826040517f8d666f600000000000000000000000000000000000000000000000000000000081526004016106ee9190613fd6565b6000606060008361ffff1667ffffffffffffffff81111561379557613795613fe9565b6040519080825280601f01601f1916602001820160405280156137bf576020820181803683370190505b509150863b6137f2577f0c3b563c0000000000000000000000000000000000000000000000000000000060005260046000fd5b5a85811015613825577fafa32a2c0000000000000000000000000000000000000000000000000000000060005260046000fd5b859003604081048103871061385e577f37c3be290000000000000000000000000000000000000000000000000000000060005260046000fd5b505a6000808a5160208c0160008c8cf193505a900390503d848111156138815750835b808352806000602085013e50955095509592505050565b6000610f4f8383613c5e565b6000670de0b6b3a76400006138d7837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8616614c94565b610f4f91906156f1565b825474010000000000000000000000000000000000000000900460ff161580613908575081155b1561391257505050565b825460018401546fffffffffffffffffffffffffffffffff8083169291169060009061395890700100000000000000000000000000000000900463ffffffff1642614c2b565b90508015613a18578183111561399a576040517f9725942a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018601546139d49083908590849070010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16612b2d565b86547fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff167001000000000000000000000000000000004263ffffffff160217875592505b84821015613ab5576001600160a01b038416613a6a576040517ff94ebcd100000000000000000000000000000000000000000000000000000000815260048101839052602481018690526044016106ee565b6040517f1a76572a00000000000000000000000000000000000000000000000000000000815260048101839052602481018690526001600160a01b03851660448201526064016106ee565b84831015613bae5760018681015470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16906000908290613af99082614c2b565b613b03878a614c2b565b613b0d9190614df1565b613b1791906156f1565b90506001600160a01b038616613b63576040517f15279c0800000000000000000000000000000000000000000000000000000000815260048101829052602481018690526044016106ee565b6040517fd0c8d23a00000000000000000000000000000000000000000000000000000000815260048101829052602481018690526001600160a01b03871660448201526064016106ee565b613bb88584614c2b565b86547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff82161787556040518681529093507f1871cdf8010e63f2eb8384381a68dfa7416dc571a5517e66e88b2d2d0c0a690a9060200160405180910390a1505050505050565b6000610f4f8383613c7d565b6000610f4f8383613d77565b60006106a4825490565b6000610f4f8383613dc6565b6000610f4f838360008181526001830160205260408120541515610f4f565b60008181526001830160205260408120548015613d66576000613ca1600183614c2b565b8554909150600090613cb590600190614c2b565b9050818114613d1a576000866000018281548110613cd557613cd5614cec565b9060005260206000200154905080876000018481548110613cf857613cf8614cec565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613d2b57613d2b615705565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106a4565b60009150506106a4565b5092915050565b6000818152600183016020526040812054613dbe575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106a4565b5060006106a4565b6000826000018281548110613ddd57613ddd614cec565b9060005260206000200154905092915050565b828054828255906000526020600020908101928215613e5d579160200282015b82811115613e5d57825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909116178255602090920191600190910190613e10565b50613e69929150613e6d565b5090565b5b80821115613e695760008155600101613e6e565b60e081016106a482846001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b67ffffffffffffffff8116811461139757600080fd5b8035613f1381613ef2565b919050565b600060208284031215613f2a57600080fd5b8135610f4f81613ef2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60048110613f7457613f74613f35565b9052565b602081016106a48284613f64565b60005b83811015613fa1578181015183820152602001613f89565b50506000910152565b60008151808452613fc2816020860160208601613f86565b601f01601f19169290920160200192915050565b602081526000610f4f6020830184613faa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561403b5761403b613fe9565b60405290565b6040516101a0810167ffffffffffffffff8111828210171561403b5761403b613fe9565b6040516080810167ffffffffffffffff8111828210171561403b5761403b613fe9565b604051601f8201601f1916810167ffffffffffffffff811182821017156140b1576140b1613fe9565b604052919050565b600067ffffffffffffffff8211156140d3576140d3613fe9565b5060051b60200190565b6001600160a01b038116811461139757600080fd5b8035613f13816140dd565b600082601f83011261410e57600080fd5b8135602061412361411e836140b9565b614088565b8083825260208201915060208460051b87010193508684111561414557600080fd5b602086015b8481101561416a57803561415d816140dd565b835291830191830161414a565b509695505050505050565b803560ff81168114613f1357600080fd5b600067ffffffffffffffff8211156141a0576141a0613fe9565b50601f01601f191660200190565b600082601f8301126141bf57600080fd5b81356141cd61411e82614186565b8181528460208386010111156141e257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060008060008060c0878903121561421857600080fd5b863567ffffffffffffffff8082111561423057600080fd5b61423c8a838b016140fd565b9750602089013591508082111561425257600080fd5b61425e8a838b016140fd565b965061426c60408a01614175565b9550606089013591508082111561428257600080fd5b61428e8a838b016141ae565b945061429c60808a01613f08565b935060a08901359150808211156142b257600080fd5b506142bf89828a016141ae565b9150509295509295509295565b60008151808452602080850194506020840160005b838110156143065781516001600160a01b0316875295820195908201906001016142e1565b509495945050505050565b602081526000610f4f60208301846142cc565b60006020828403121561433657600080fd5b8135610f4f816140dd565b801515811461139757600080fd5b8035613f1381614341565b600082601f83011261436b57600080fd5b8135602061437b61411e836140b9565b82815260069290921b8401810191818101908684111561439a57600080fd5b8286015b8481101561416a57604081890312156143b75760008081fd5b6143bf614018565b81356143ca816140dd565b8152818501358582015283529183019160400161439e565b600082601f8301126143f357600080fd5b8135602061440361411e836140b9565b82815260059290921b8401810191818101908684111561442257600080fd5b8286015b8481101561416a57803567ffffffffffffffff8111156144465760008081fd5b6144548986838b01016141ae565b845250918301918301614426565b60006101a0828403121561447557600080fd5b61447d614041565b905061448882613f08565b8152614496602083016140f2565b60208201526144a7604083016140f2565b60408201526144b860608301613f08565b6060820152608082013560808201526144d360a0830161434f565b60a08201526144e460c08301613f08565b60c08201526144f560e083016140f2565b60e082015261010082810135908201526101208083013567ffffffffffffffff8082111561452257600080fd5b61452e868387016141ae565b8385015261014092508285013591508082111561454a57600080fd5b6145568683870161435a565b8385015261016092508285013591508082111561457257600080fd5b5061457f858286016143e2565b82840152505061018080830135818301525092915050565b600082601f8301126145a857600080fd5b813560206145b861411e836140b9565b82815260059290921b840181019181810190868411156145d757600080fd5b8286015b8481101561416a57803567ffffffffffffffff8111156145fb5760008081fd5b6146098986838b01016143e2565b8452509183019183016145db565b600082601f83011261462857600080fd5b8135602061463861411e836140b9565b8083825260208201915060208460051b87010193508684111561465a57600080fd5b602086015b8481101561416a578035835291830191830161465f565b60006080828403121561468857600080fd5b614690614065565b9050813567ffffffffffffffff808211156146aa57600080fd5b818401915084601f8301126146be57600080fd5b813560206146ce61411e836140b9565b82815260059290921b840181019181810190888411156146ed57600080fd5b8286015b84811015614725578035868111156147095760008081fd5b6147178b86838b0101614462565b8452509183019183016146f1565b508652508581013593508284111561473c57600080fd5b61474887858801614597565b9085015250604084013591508082111561476157600080fd5b5061476e84828501614617565b6040830152506060820135606082015292915050565b6000806040838503121561479757600080fd5b823567ffffffffffffffff808211156147af57600080fd5b6147bb86838701614676565b93506020915081850135818111156147d257600080fd5b85019050601f810186136147e557600080fd5b80356147f361411e826140b9565b81815260059190911b8201830190838101908883111561481257600080fd5b928401925b8284101561483057833582529284019290840190614817565b80955050505050509250929050565b60a081016106a4828463ffffffff8082511683528060208301511660208401525061ffff604082015116604083015260608101516001600160a01b03808216606085015280608084015116608085015250505050565b6000602082840312156148a757600080fd5b813567ffffffffffffffff8111156148be57600080fd5b820160a08185031215610f4f57600080fd5b600082601f8301126148e157600080fd5b813560206148f161411e836140b9565b82815260069290921b8401810191818101908684111561491057600080fd5b8286015b8481101561416a576040818903121561492d5760008081fd5b614935614018565b8135614940816140dd565b81528185013561494f816140dd565b81860152835291830191604001614914565b6000806040838503121561497457600080fd5b823567ffffffffffffffff8082111561498c57600080fd5b614998868387016148d0565b935060208501359150808211156149ae57600080fd5b506149bb858286016148d0565b9150509250929050565b60008083601f8401126149d757600080fd5b50813567ffffffffffffffff8111156149ef57600080fd5b6020830191508360208260051b85010111156128fe57600080fd5b60008060008060008060008060e0898b031215614a2657600080fd5b606089018a811115614a3757600080fd5b8998503567ffffffffffffffff80821115614a5157600080fd5b818b0191508b601f830112614a6557600080fd5b813581811115614a7457600080fd5b8c6020828501011115614a8657600080fd5b6020830199508098505060808b0135915080821115614aa457600080fd5b614ab08c838d016149c5565b909750955060a08b0135915080821115614ac957600080fd5b50614ad68b828c016149c5565b999c989b50969995989497949560c00135949350505050565b80356fffffffffffffffffffffffffffffffff81168114613f1357600080fd5b600060608284031215614b2157600080fd5b6040516060810181811067ffffffffffffffff82111715614b4457614b44613fe9565b6040528235614b5281614341565b8152614b6060208401614aef565b6020820152614b7160408401614aef565b60408201529392505050565b604081526000614b9060408301856142cc565b8281036020840152612b0881856142cc565b60008060408385031215614bb557600080fd5b823567ffffffffffffffff80821115614bcd57600080fd5b614bd986838701614462565b93506020850135915080821115614bef57600080fd5b506149bb858286016143e2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b818103818111156106a4576106a4614bfc565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600067ffffffffffffffff80841680614c8857614c88614c3e565b92169190910692915050565b80820281158282048414176106a4576106a4614bfc565b600067ffffffffffffffff80841680614cc657614cc6614c3e565b92169190910492915050565b6020810160038310614ce657614ce6613f35565b91905290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600063ffffffff808316818103614d3457614d34614bfc565b6001019392505050565b600061012063ffffffff808d1684528b6020850152808b16604085015250806060840152614d6e8184018a6142cc565b90508281036080840152614d8281896142cc565b905060ff871660a084015282810360c0840152614d9f8187613faa565b905067ffffffffffffffff851660e0840152828103610100840152614dc48185613faa565b9c9b505050505050505050505050565b600060208284031215614de657600080fd5b8151610f4f81613ef2565b808201808211156106a4576106a4614bfc565b60008151808452602080850194506020840160005b8381101561430657815180516001600160a01b031688528301518388015260409096019590820190600101614e19565b608081528451608082015267ffffffffffffffff60208601511660a08201526000604086015160a060c0840152614e84610120840182613faa565b905060608701517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff80808584030160e0860152614ec08383613faa565b925060808901519150808584030161010086015250614edf8282614e04565b92505050614ef3602083018661ffff169052565b836040830152612b0860608301846001600160a01b03169052565b600082601f830112614f1f57600080fd5b8151614f2d61411e82614186565b818152846020838601011115614f4257600080fd5b6126c8826020830160208701613f86565b600080600060608486031215614f6857600080fd5b8351614f7381614341565b602085015190935067ffffffffffffffff811115614f9057600080fd5b614f9c86828701614f0e565b925050604084015190509250925092565b805163ffffffff81168114613f1357600080fd5b600060a08284031215614fd357600080fd5b60405160a0810181811067ffffffffffffffff82111715614ff657614ff6613fe9565b60405261500283614fad565b815261501060208401614fad565b6020820152604083015161ffff8116811461502a57600080fd5b6040820152606083015161503d816140dd565b60608201526080830151615050816140dd565b60808201529392505050565b61018081016150cd82856001600160a01b03808251168352602082015167ffffffffffffffff808216602086015280604085015116604086015250508060608301511660608401528060808301511660808401528060a08301511660a08401528060c08301511660c0840152505050565b825163ffffffff90811660e0840152602084015116610100830152604083015161ffff1661012083015260608301516001600160a01b03908116610140840152608084015116610160830152610f4f565b60006101208b83526001600160a01b038b16602084015267ffffffffffffffff808b1660408501528160608501526151588285018b6142cc565b9150838203608085015261516c828a6142cc565b915060ff881660a085015283820360c08501526151898288613faa565b90861660e08501528381036101008501529050614dc48185613faa565b6000602082840312156151b857600080fd5b8151610f4f81614341565b60008151808452602080850194506020840160005b83811015614306578151875295820195908201906001016151d8565b60608152600061520760608301866151c3565b828103602084015261521981866151c3565b915050826040830152949350505050565b60006020828403121561523c57600080fd5b5051919050565b67ffffffffffffffff818116838216019080821115613d7057613d70614bfc565b67ffffffffffffffff8316815260408101610f4f6020830184613f64565b600067ffffffffffffffff808316818103614d3457614d34614bfc565b6152a98184613f64565b6040602082015260006126c86040830184613faa565b6000602082840312156152d157600080fd5b813567ffffffffffffffff8111156152e857600080fd5b6126c884828501614676565b60006020828403121561530657600080fd5b815167ffffffffffffffff8082111561531e57600080fd5b908301906080828603121561533257600080fd5b61533a614065565b82518281111561534957600080fd5b61535587828601614f0e565b82525060208301518281111561536a57600080fd5b61537687828601614f0e565b60208301525060408301518281111561538e57600080fd5b61539a87828601614f0e565b6040830152506153ac60608401614fad565b606082015295945050505050565b602081526000610f4f6020830184614e04565b60008282518085526020808601955060208260051b8401016020860160005b8481101561541a57601f19868403018952615408838351613faa565b988401989250908301906001016153ec565b5090979650505050505050565b602081526000610f4f60208301846153cd565b6040815261545560408201845167ffffffffffffffff169052565b6000602084015161547160608401826001600160a01b03169052565b5060408401516001600160a01b038116608084015250606084015167ffffffffffffffff811660a084015250608084015160c083015260a084015180151560e08401525060c08401516101006154d28185018367ffffffffffffffff169052565b60e086015191506101206154f0818601846001600160a01b03169052565b81870151925061014091508282860152808701519250506101a061016081818701526155206101e0870185613faa565b93508288015192507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc061018081888703018189015261555f8686614e04565b9550828a0151945081888703018489015261557a86866153cd565b9550808a01516101c089015250505050508281036020840152612b0881856153cd565b6000602082840312156155af57600080fd5b8151610f4f816140dd565b60208152600082516101008060208501526155d9610120850183613faa565b915060208501516155f6604086018267ffffffffffffffff169052565b5060408501516001600160a01b03811660608601525060608501516080850152608085015161563060a08601826001600160a01b03169052565b5060a0850151601f19808685030160c087015261564d8483613faa565b935060c08701519150808685030160e087015261566a8483613faa565b935060e08701519150808685030183870152506156878382613faa565b9695505050505050565b6000604082840312156156a357600080fd5b6156ab614018565b82517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811681146156d757600080fd5b81526156e560208401614fad565b60208201529392505050565b60008261570057615700614c3e565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var EVM2EVMOffRampABI = EVM2EVMOffRampMetaData.ABI
@@ -779,6 +779,123 @@ func (_EVM2EVMOffRamp *EVM2EVMOffRampFilterer) ParseAdminSet(log types.Log) (*EV
return event, nil
}
+type EVM2EVMOffRampAlreadyAttemptedIterator struct {
+ Event *EVM2EVMOffRampAlreadyAttempted
+
+ contract *bind.BoundContract
+ event string
+
+ logs chan types.Log
+ sub ethereum.Subscription
+ done bool
+ fail error
+}
+
+func (it *EVM2EVMOffRampAlreadyAttemptedIterator) Next() bool {
+
+ if it.fail != nil {
+ return false
+ }
+
+ if it.done {
+ select {
+ case log := <-it.logs:
+ it.Event = new(EVM2EVMOffRampAlreadyAttempted)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ default:
+ return false
+ }
+ }
+
+ select {
+ case log := <-it.logs:
+ it.Event = new(EVM2EVMOffRampAlreadyAttempted)
+ if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
+ it.fail = err
+ return false
+ }
+ it.Event.Raw = log
+ return true
+
+ case err := <-it.sub.Err():
+ it.done = true
+ it.fail = err
+ return it.Next()
+ }
+}
+
+func (it *EVM2EVMOffRampAlreadyAttemptedIterator) Error() error {
+ return it.fail
+}
+
+func (it *EVM2EVMOffRampAlreadyAttemptedIterator) Close() error {
+ it.sub.Unsubscribe()
+ return nil
+}
+
+type EVM2EVMOffRampAlreadyAttempted struct {
+ SequenceNumber uint64
+ Raw types.Log
+}
+
+func (_EVM2EVMOffRamp *EVM2EVMOffRampFilterer) FilterAlreadyAttempted(opts *bind.FilterOpts) (*EVM2EVMOffRampAlreadyAttemptedIterator, error) {
+
+ logs, sub, err := _EVM2EVMOffRamp.contract.FilterLogs(opts, "AlreadyAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return &EVM2EVMOffRampAlreadyAttemptedIterator{contract: _EVM2EVMOffRamp.contract, event: "AlreadyAttempted", logs: logs, sub: sub}, nil
+}
+
+func (_EVM2EVMOffRamp *EVM2EVMOffRampFilterer) WatchAlreadyAttempted(opts *bind.WatchOpts, sink chan<- *EVM2EVMOffRampAlreadyAttempted) (event.Subscription, error) {
+
+ logs, sub, err := _EVM2EVMOffRamp.contract.WatchLogs(opts, "AlreadyAttempted")
+ if err != nil {
+ return nil, err
+ }
+ return event.NewSubscription(func(quit <-chan struct{}) error {
+ defer sub.Unsubscribe()
+ for {
+ select {
+ case log := <-logs:
+
+ event := new(EVM2EVMOffRampAlreadyAttempted)
+ if err := _EVM2EVMOffRamp.contract.UnpackLog(event, "AlreadyAttempted", log); err != nil {
+ return err
+ }
+ event.Raw = log
+
+ select {
+ case sink <- event:
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ case err := <-sub.Err():
+ return err
+ case <-quit:
+ return nil
+ }
+ }
+ }), nil
+}
+
+func (_EVM2EVMOffRamp *EVM2EVMOffRampFilterer) ParseAlreadyAttempted(log types.Log) (*EVM2EVMOffRampAlreadyAttempted, error) {
+ event := new(EVM2EVMOffRampAlreadyAttempted)
+ if err := _EVM2EVMOffRamp.contract.UnpackLog(event, "AlreadyAttempted", log); err != nil {
+ return nil, err
+ }
+ event.Raw = log
+ return event, nil
+}
+
type EVM2EVMOffRampConfigChangedIterator struct {
Event *EVM2EVMOffRampConfigChanged
@@ -2438,6 +2555,8 @@ func (_EVM2EVMOffRamp *EVM2EVMOffRamp) ParseLog(log types.Log) (generated.Abigen
switch log.Topics[0] {
case _EVM2EVMOffRamp.abi.Events["AdminSet"].ID:
return _EVM2EVMOffRamp.ParseAdminSet(log)
+ case _EVM2EVMOffRamp.abi.Events["AlreadyAttempted"].ID:
+ return _EVM2EVMOffRamp.ParseAlreadyAttempted(log)
case _EVM2EVMOffRamp.abi.Events["ConfigChanged"].ID:
return _EVM2EVMOffRamp.ParseConfigChanged(log)
case _EVM2EVMOffRamp.abi.Events["ConfigSet"].ID:
@@ -2474,6 +2593,10 @@ func (EVM2EVMOffRampAdminSet) Topic() common.Hash {
return common.HexToHash("0x8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c")
}
+func (EVM2EVMOffRampAlreadyAttempted) Topic() common.Hash {
+ return common.HexToHash("0x67d9ba0f63d427c482c2736300e6d5a34c6691dbcdea8ad35828a1f1ba47e872")
+}
+
func (EVM2EVMOffRampConfigChanged) Topic() common.Hash {
return common.HexToHash("0x9ea3374b67bf275e6bb9c8ae68f9cae023e1c528b4b27e092f0bb209d3531c19")
}
@@ -2587,6 +2710,12 @@ type EVM2EVMOffRampInterface interface {
ParseAdminSet(log types.Log) (*EVM2EVMOffRampAdminSet, error)
+ FilterAlreadyAttempted(opts *bind.FilterOpts) (*EVM2EVMOffRampAlreadyAttemptedIterator, error)
+
+ WatchAlreadyAttempted(opts *bind.WatchOpts, sink chan<- *EVM2EVMOffRampAlreadyAttempted) (event.Subscription, error)
+
+ ParseAlreadyAttempted(log types.Log) (*EVM2EVMOffRampAlreadyAttempted, error)
+
FilterConfigChanged(opts *bind.FilterOpts) (*EVM2EVMOffRampConfigChangedIterator, error)
WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *EVM2EVMOffRampConfigChanged) (event.Subscription, error)
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index c9da4f5973..71552045c6 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -10,9 +10,9 @@ ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderT
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51
commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69
ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
-evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 25a7bf3aa46252844c7afabc15db1051e7b6a717e296fc4c6e2f2f93d16033c5
+evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 3ea3974c9848e0df0dbe1fc7192134589e7735017c2ea8d4755084b3c95035d1
evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin 9478aedc9f0072fbdafb54a6f82248de1efbcd7bdff18a90d8556b9aaff67455
-evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin bca94c29d523e7679db6ef86ffffcc52864a7499e9f0c51807c901bcc1927fda
+evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin bdafc343d33f1eb753871ea6d215339cd8e087c1a8c7297257791dd1e453be8f
evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin bf1a3090a2f8d1632b82a6d45200cf6f3833a1e27303745405c1ed13ffc0cf83
lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin f049909cfef0aa3b8158c85e7b64516b9d7b32f4930705574090e5b9cab534b1
lock_release_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPoolAndProxy/LockReleaseTokenPoolAndProxy.bin d897366aa5c58f426eaf3fc748d9def8f78111d9ac8c122e390952f640de22fc
diff --git a/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go b/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go
index 6da66583e6..9d63c34b02 100644
--- a/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go
+++ b/core/gethwrappers/ccip/mocks/evm2_evm_off_ramp_interface.go
@@ -358,6 +358,64 @@ func (_c *EVM2EVMOffRampInterface_FilterAdminSet_Call) RunAndReturn(run func(*bi
return _c
}
+// FilterAlreadyAttempted provides a mock function with given fields: opts
+func (_m *EVM2EVMOffRampInterface) FilterAlreadyAttempted(opts *bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttemptedIterator, error) {
+ ret := _m.Called(opts)
+
+ if len(ret) == 0 {
+ panic("no return value specified for FilterAlreadyAttempted")
+ }
+
+ var r0 *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttemptedIterator
+ var r1 error
+ if rf, ok := ret.Get(0).(func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttemptedIterator, error)); ok {
+ return rf(opts)
+ }
+ if rf, ok := ret.Get(0).(func(*bind.FilterOpts) *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttemptedIterator); ok {
+ r0 = rf(opts)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttemptedIterator)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(*bind.FilterOpts) error); ok {
+ r1 = rf(opts)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterAlreadyAttempted'
+type EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call struct {
+ *mock.Call
+}
+
+// FilterAlreadyAttempted is a helper method to define mock.On call
+// - opts *bind.FilterOpts
+func (_e *EVM2EVMOffRampInterface_Expecter) FilterAlreadyAttempted(opts interface{}) *EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call {
+ return &EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call{Call: _e.mock.On("FilterAlreadyAttempted", opts)}
+}
+
+func (_c *EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call) Run(run func(opts *bind.FilterOpts)) *EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(*bind.FilterOpts))
+ })
+ return _c
+}
+
+func (_c *EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttemptedIterator, _a1 error) *EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call) RunAndReturn(run func(*bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttemptedIterator, error)) *EVM2EVMOffRampInterface_FilterAlreadyAttempted_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// FilterConfigChanged provides a mock function with given fields: opts
func (_m *EVM2EVMOffRampInterface) FilterConfigChanged(opts *bind.FilterOpts) (*evm_2_evm_offramp.EVM2EVMOffRampConfigChangedIterator, error) {
ret := _m.Called(opts)
@@ -1809,6 +1867,64 @@ func (_c *EVM2EVMOffRampInterface_ParseAdminSet_Call) RunAndReturn(run func(type
return _c
}
+// ParseAlreadyAttempted provides a mock function with given fields: log
+func (_m *EVM2EVMOffRampInterface) ParseAlreadyAttempted(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted, error) {
+ ret := _m.Called(log)
+
+ if len(ret) == 0 {
+ panic("no return value specified for ParseAlreadyAttempted")
+ }
+
+ var r0 *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted
+ var r1 error
+ if rf, ok := ret.Get(0).(func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted, error)); ok {
+ return rf(log)
+ }
+ if rf, ok := ret.Get(0).(func(types.Log) *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted); ok {
+ r0 = rf(log)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(*evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(types.Log) error); ok {
+ r1 = rf(log)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParseAlreadyAttempted'
+type EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call struct {
+ *mock.Call
+}
+
+// ParseAlreadyAttempted is a helper method to define mock.On call
+// - log types.Log
+func (_e *EVM2EVMOffRampInterface_Expecter) ParseAlreadyAttempted(log interface{}) *EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call {
+ return &EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call{Call: _e.mock.On("ParseAlreadyAttempted", log)}
+}
+
+func (_c *EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call) Run(run func(log types.Log)) *EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(types.Log))
+ })
+ return _c
+}
+
+func (_c *EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call) Return(_a0 *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted, _a1 error) *EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call) RunAndReturn(run func(types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted, error)) *EVM2EVMOffRampInterface_ParseAlreadyAttempted_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// ParseConfigChanged provides a mock function with given fields: log
func (_m *EVM2EVMOffRampInterface) ParseConfigChanged(log types.Log) (*evm_2_evm_offramp.EVM2EVMOffRampConfigChanged, error) {
ret := _m.Called(log)
@@ -3100,6 +3216,65 @@ func (_c *EVM2EVMOffRampInterface_WatchAdminSet_Call) RunAndReturn(run func(*bin
return _c
}
+// WatchAlreadyAttempted provides a mock function with given fields: opts, sink
+func (_m *EVM2EVMOffRampInterface) WatchAlreadyAttempted(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted) (event.Subscription, error) {
+ ret := _m.Called(opts, sink)
+
+ if len(ret) == 0 {
+ panic("no return value specified for WatchAlreadyAttempted")
+ }
+
+ var r0 event.Subscription
+ var r1 error
+ if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted) (event.Subscription, error)); ok {
+ return rf(opts, sink)
+ }
+ if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted) event.Subscription); ok {
+ r0 = rf(opts, sink)
+ } else {
+ if ret.Get(0) != nil {
+ r0 = ret.Get(0).(event.Subscription)
+ }
+ }
+
+ if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted) error); ok {
+ r1 = rf(opts, sink)
+ } else {
+ r1 = ret.Error(1)
+ }
+
+ return r0, r1
+}
+
+// EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchAlreadyAttempted'
+type EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call struct {
+ *mock.Call
+}
+
+// WatchAlreadyAttempted is a helper method to define mock.On call
+// - opts *bind.WatchOpts
+// - sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted
+func (_e *EVM2EVMOffRampInterface_Expecter) WatchAlreadyAttempted(opts interface{}, sink interface{}) *EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call {
+ return &EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call{Call: _e.mock.On("WatchAlreadyAttempted", opts, sink)}
+}
+
+func (_c *EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted)) *EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call {
+ _c.Call.Run(func(args mock.Arguments) {
+ run(args[0].(*bind.WatchOpts), args[1].(chan<- *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted))
+ })
+ return _c
+}
+
+func (_c *EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call) Return(_a0 event.Subscription, _a1 error) *EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call {
+ _c.Call.Return(_a0, _a1)
+ return _c
+}
+
+func (_c *EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *evm_2_evm_offramp.EVM2EVMOffRampAlreadyAttempted) (event.Subscription, error)) *EVM2EVMOffRampInterface_WatchAlreadyAttempted_Call {
+ _c.Call.Return(run)
+ return _c
+}
+
// WatchConfigChanged provides a mock function with given fields: opts, sink
func (_m *EVM2EVMOffRampInterface) WatchConfigChanged(opts *bind.WatchOpts, sink chan<- *evm_2_evm_offramp.EVM2EVMOffRampConfigChanged) (event.Subscription, error) {
ret := _m.Called(opts, sink)
From acb585270e15a6cc2e5b3c64ec563b763ff70655 Mon Sep 17 00:00:00 2001
From: Makram
Date: Fri, 2 Aug 2024 23:59:52 +0300
Subject: [PATCH 23/28] core/services/ocr3/plugins/ccip_integration_tests: exec
(#1238)
## Motivation
We want to start testing the exec plugin in the integration test.
## Solution
* Simplify the test setup, don't use ping pongs because the behavior of
the execution introduces more CCIP requests which might get mixed with
requests created by the test.
* Add some code to watch for `ExecutionStateChanged` events
Related PR: https://github.com/smartcontractkit/chainlink-ccip/pull/55
---------
Co-authored-by: dimkouv
---
.../ccipreader/ccipreader_test.go | 24 +-
.../ccip/ccip_integration_tests/helpers.go | 111 ++++++++--
.../ccip_integration_tests/ocr3_node_test.go | 209 ++++++++----------
.../ccip_integration_tests/ocr_node_helper.go | 2 -
core/capabilities/ccip/ccipevm/helpers.go | 4 +
.../ccip/ocrimpls/contract_transmitter.go | 2 +-
core/chains/evm/txmgr/client.go | 1 +
core/scripts/go.mod | 2 +-
core/scripts/go.sum | 4 +-
go.mod | 2 +-
go.sum | 4 +-
integration-tests/go.mod | 2 +-
integration-tests/go.sum | 4 +-
integration-tests/load/go.mod | 2 +-
integration-tests/load/go.sum | 4 +-
15 files changed, 228 insertions(+), 149 deletions(-)
diff --git a/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go b/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go
index 89d69a12b1..66c47f4741 100644
--- a/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go
+++ b/core/capabilities/ccip/ccip_integration_tests/ccipreader/ccipreader_test.go
@@ -13,6 +13,7 @@ import (
"github.com/ethereum/go-ethereum/crypto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
+ "go.uber.org/zap/zapcore"
"golang.org/x/exp/maps"
"github.com/smartcontractkit/chainlink-common/pkg/types"
@@ -30,6 +31,7 @@ import (
evmtypes "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/types"
"github.com/smartcontractkit/chainlink-ccip/pkg/consts"
+ "github.com/smartcontractkit/chainlink-ccip/pkg/contractreader"
ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader"
"github.com/smartcontractkit/chainlink-ccip/plugintypes"
)
@@ -167,6 +169,10 @@ func TestCCIPReader_ExecutedMessageRanges(t *testing.T) {
assert.NoError(t, err)
s.sb.Commit()
+ // Need to replay as sometimes the logs are not picked up by the log poller (?)
+ // Maybe another situation where chain reader doesn't register filters as expected.
+ require.NoError(t, s.lp.Replay(ctx, 1))
+
var executedRanges []cciptypes.SeqNumRange
require.Eventually(t, func() bool {
executedRanges, err = s.reader.ExecutedMessageRanges(
@@ -253,7 +259,7 @@ func TestCCIPReader_MsgsBetweenSeqNums(t *testing.T) {
)
require.NoError(t, err)
return len(msgs) == 2
- }, testutils.WaitTimeout(t), 100*time.Millisecond)
+ }, 10*time.Second, 100*time.Millisecond)
require.Len(t, msgs, 2)
require.Equal(t, cciptypes.SeqNum(10), msgs[0].Header.SequenceNumber)
@@ -324,6 +330,7 @@ func testSetup(ctx context.Context, t *testing.T, readerChain, destChain cciptyp
assert.NoError(t, err)
lggr := logger.TestLogger(t)
+ lggr.SetLogLevel(zapcore.ErrorLevel)
db := pgtest.NewSqlxDB(t)
lpOpts := logpoller.Opts{
PollPeriod: time.Millisecond,
@@ -358,20 +365,23 @@ func testSetup(ctx context.Context, t *testing.T, readerChain, destChain cciptyp
assert.Len(t, contractNames, 1, "test setup assumes there is only one contract")
cr, err := evm.NewChainReaderService(ctx, lggr, lp, headTracker, cl, cfg)
- assert.NoError(t, err)
- err = cr.Bind(ctx, []types.BoundContract{
+ require.NoError(t, err)
+
+ extendedCr := contractreader.NewExtendedContractReader(cr)
+ err = extendedCr.Bind(ctx, []types.BoundContract{
{
Address: address.String(),
Name: contractNames[0],
},
})
- assert.NoError(t, err)
+ require.NoError(t, err)
+
err = cr.Start(ctx)
- assert.NoError(t, err)
+ require.NoError(t, err)
- contractReaders := map[cciptypes.ChainSelector]types.ContractReader{readerChain: cr}
+ contractReaders := map[cciptypes.ChainSelector]contractreader.Extended{readerChain: extendedCr}
contractWriters := make(map[cciptypes.ChainSelector]types.ChainWriter)
- reader := ccipreaderpkg.NewCCIPReader(lggr, contractReaders, contractWriters, destChain)
+ reader := ccipreaderpkg.NewCCIPReaderWithExtendedContractReaders(lggr, contractReaders, contractWriters, destChain)
t.Cleanup(func() {
require.NoError(t, cr.Close())
diff --git a/core/capabilities/ccip/ccip_integration_tests/helpers.go b/core/capabilities/ccip/ccip_integration_tests/helpers.go
index 3a87b72351..057e48b3e7 100644
--- a/core/capabilities/ccip/ccip_integration_tests/helpers.go
+++ b/core/capabilities/ccip/ccip_integration_tests/helpers.go
@@ -25,6 +25,7 @@ import (
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ccip_config"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp"
+ "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/maybe_revert_message_receiver"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/mock_arm_contract"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/nonce_manager"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ocr3_config_encoder"
@@ -42,13 +43,19 @@ import (
)
var (
- homeChainID = chainsel.GETH_TESTNET.EvmChainID
+ homeChainID = chainsel.GETH_TESTNET.EvmChainID
+ ccipSendRequestedTopic = evm_2_evm_multi_onramp.EVM2EVMMultiOnRampCCIPSendRequested{}.Topic()
+ commitReportAcceptedTopic = evm_2_evm_multi_offramp.EVM2EVMMultiOffRampCommitReportAccepted{}.Topic()
+ executionStateChangedTopic = evm_2_evm_multi_offramp.EVM2EVMMultiOffRampExecutionStateChanged{}.Topic()
)
const (
CapabilityLabelledName = "ccip"
CapabilityVersion = "v1.0.0"
NodeOperatorID = 1
+ // TODO: this is 8 hours now to match what is hardcoded in the exec plugin.
+ // Eventually this should drive what is set in the exec plugin.
+ FirstBlockAge = 8 * time.Hour
)
func e18Mult(amount uint64) *big.Int {
@@ -81,6 +88,43 @@ type onchainUniverse struct {
priceRegistry *price_registry.PriceRegistry
tokenAdminRegistry *token_admin_registry.TokenAdminRegistry
nonceManager *nonce_manager.NonceManager
+ receiver *maybe_revert_message_receiver.MaybeRevertMessageReceiver
+}
+
+type requestData struct {
+ destChainSelector uint64
+ receiverAddress common.Address
+ data []byte
+}
+
+func (u *onchainUniverse) SendCCIPRequests(t *testing.T, requestDatas []requestData) {
+ for _, reqData := range requestDatas {
+ msg := router.ClientEVM2AnyMessage{
+ Receiver: common.LeftPadBytes(reqData.receiverAddress.Bytes(), 32),
+ Data: reqData.data,
+ TokenAmounts: nil, // TODO: no tokens for now
+ FeeToken: u.weth.Address(),
+ ExtraArgs: nil, // TODO: no extra args for now, falls back to default
+ }
+ fee, err := u.router.GetFee(&bind.CallOpts{Context: testutils.Context(t)}, reqData.destChainSelector, msg)
+ require.NoError(t, err)
+ _, err = u.weth.Deposit(&bind.TransactOpts{
+ From: u.owner.From,
+ Signer: u.owner.Signer,
+ Value: fee,
+ })
+ require.NoError(t, err)
+ u.backend.Commit()
+ _, err = u.weth.Approve(u.owner, u.router.Address(), fee)
+ require.NoError(t, err)
+ u.backend.Commit()
+
+ t.Logf("Sending CCIP request from chain %d (selector %d) to chain selector %d",
+ u.chainID, getSelector(u.chainID), reqData.destChainSelector)
+ _, err = u.router.CcipSend(u.owner, reqData.destChainSelector, msg)
+ require.NoError(t, err)
+ u.backend.Commit()
+ }
}
type chainBase struct {
@@ -171,6 +215,16 @@ func createUniverses(
offramp, err := evm_2_evm_multi_offramp.NewEVM2EVMMultiOffRamp(offrampAddr, backend)
require.NoError(t, err)
+ receiverAddress, _, _, err := maybe_revert_message_receiver.DeployMaybeRevertMessageReceiver(
+ owner,
+ backend,
+ false,
+ )
+ require.NoError(t, err, "failed to deploy MaybeRevertMessageReceiver on chain id %d", chainID)
+ backend.Commit()
+ receiver, err := maybe_revert_message_receiver.NewMaybeRevertMessageReceiver(receiverAddress, backend)
+ require.NoError(t, err)
+
universe := onchainUniverse{
backend: backend,
owner: owner,
@@ -185,6 +239,7 @@ func createUniverses(
priceRegistry: priceRegistry,
tokenAdminRegistry: tokenAdminRegistry,
nonceManager: nonceManager,
+ receiver: receiver,
}
// Set up the initial configurations for the contracts
setupUniverseBasics(t, universe)
@@ -213,6 +268,11 @@ func createUniverses(
)
}
+ // print out topic hashes of relevant events for debugging purposes
+ t.Logf("Topic hash of CommitReportAccepted: %s", commitReportAcceptedTopic.Hex())
+ t.Logf("Topic hash of ExecutionStateChanged: %s", executionStateChangedTopic.Hex())
+ t.Logf("Topic hash of CCIPSendRequested: %s", ccipSendRequestedTopic.Hex())
+
return homeChainUniverse, universes
}
@@ -221,30 +281,51 @@ func createChains(t *testing.T, numChains int) map[uint64]chainBase {
chains := make(map[uint64]chainBase)
homeChainOwner := testutils.MustNewSimTransactor(t)
+ homeChainBackend := backends.NewSimulatedBackend(core.GenesisAlloc{
+ homeChainOwner.From: core.GenesisAccount{
+ Balance: assets.Ether(10_000).ToInt(),
+ },
+ }, 30e6)
+ tweakChainTimestamp(t, homeChainBackend, FirstBlockAge)
+
chains[homeChainID] = chainBase{
- owner: homeChainOwner,
- backend: backends.NewSimulatedBackend(core.GenesisAlloc{
- homeChainOwner.From: core.GenesisAccount{
- Balance: assets.Ether(10_000).ToInt(),
- },
- }, 30e6),
+ owner: homeChainOwner,
+ backend: homeChainBackend,
}
for chainID := chainsel.TEST_90000001.EvmChainID; len(chains) < numChains && chainID < chainsel.TEST_90000020.EvmChainID; chainID++ {
owner := testutils.MustNewSimTransactor(t)
+ backend := backends.NewSimulatedBackend(core.GenesisAlloc{
+ owner.From: core.GenesisAccount{
+ Balance: assets.Ether(10_000).ToInt(),
+ },
+ }, 30e6)
+
+ tweakChainTimestamp(t, backend, FirstBlockAge)
+
chains[chainID] = chainBase{
- owner: owner,
- backend: backends.NewSimulatedBackend(core.GenesisAlloc{
- owner.From: core.GenesisAccount{
- Balance: assets.Ether(10_000).ToInt(),
- },
- }, 30e6),
+ owner: owner,
+ backend: backend,
}
}
return chains
}
+// CCIP relies on block timestamps, but SimulatedBackend uses by default clock starting from 1970-01-01
+// This trick is used to move the clock closer to the current time. We set first block to be X hours ago.
+// Tests create plenty of transactions so this number can't be too low, every new block mined will tick the clock,
+// if you mine more than "X hours" transactions, SimulatedBackend will panic because generated timestamps will be in the future.
+func tweakChainTimestamp(t *testing.T, backend *backends.SimulatedBackend, tweak time.Duration) {
+ blockTime := time.Unix(int64(backend.Blockchain().CurrentHeader().Time), 0)
+ sinceBlockTime := time.Since(blockTime)
+ diff := sinceBlockTime - tweak
+ err := backend.AdjustTime(diff)
+ require.NoError(t, err, "unable to adjust time on simulated chain")
+ backend.Commit()
+ backend.Commit()
+}
+
func setupHomeChain(t *testing.T, owner *bind.TransactOpts, backend *backends.SimulatedBackend) homeChain {
// deploy the capability registry on the home chain
crAddress, _, _, err := kcr.DeployCapabilitiesRegistry(owner, backend)
@@ -361,8 +442,8 @@ func (h *homeChain) AddDON(
10*time.Second, // deltaResend
20*time.Second, // deltaInitial
2*time.Second, // deltaRound
- 20*time.Second, // deltaGrace
- 10*time.Second, // deltaCertifiedCommitRequest
+ 2*time.Second, // deltaGrace
+ 10*time.Second, // deltaCertifiedCommitRequest TODO: whats a good value for this?
10*time.Second, // deltaStage
3, // rmax
schedule,
diff --git a/core/capabilities/ccip/ccip_integration_tests/ocr3_node_test.go b/core/capabilities/ccip/ccip_integration_tests/ocr3_node_test.go
index 7b8877d70f..8cafb90172 100644
--- a/core/capabilities/ccip/ccip_integration_tests/ocr3_node_test.go
+++ b/core/capabilities/ccip/ccip_integration_tests/ocr3_node_test.go
@@ -8,12 +8,10 @@ import (
"time"
"github.com/ethereum/go-ethereum/accounts/abi/bind"
- "github.com/ethereum/go-ethereum/common"
"github.com/hashicorp/consul/sdk/freeport"
"go.uber.org/zap/zapcore"
- "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/ping_pong_demo"
-
+ "github.com/smartcontractkit/chainlink-common/pkg/types/ccipocr3"
"github.com/smartcontractkit/chainlink/v2/core/gethwrappers/ccip/generated/evm_2_evm_multi_offramp"
"github.com/smartcontractkit/chainlink/v2/core/internal/testutils"
"github.com/smartcontractkit/chainlink/v2/core/services/chainlink"
@@ -25,11 +23,13 @@ import (
"github.com/stretchr/testify/require"
)
+const STATE_SUCCESS = uint8(2)
+
/*
* If you want to debug, set log level to info and use the following commands for easier logs filtering.
*
* // Run the test and redirect logs to logs.txt
-* go test -v -run "^TestIntegration_OCR3Nodes" ./core/services/ocr3/plugins/ccip_integration_tests 2>&1 > logs.txt
+* go test -v -run "^TestIntegration_OCR3Nodes" ./core/capabilities/ccip/ccip_integration_tests 2>&1 > logs.txt
*
* // Reads logs.txt as a stream and apply filters using grep
* tail -fn0 logs.txt | grep "CCIPExecPlugin"
@@ -42,7 +42,7 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
simulatedBackendBlockTime = 900 * time.Millisecond // Simulated backend blocks committing interval
oraclesBootWaitTime = 30 * time.Second // Time to wait for oracles to come up (HACK)
fChain = 1 // fChain value for all the chains
- oracleLogLevel = zapcore.ErrorLevel // Log level for the oracle / plugins.
+ oracleLogLevel = zapcore.InfoLevel // Log level for the oracle / plugins.
)
t.Logf("creating %d universes", numChains)
@@ -113,7 +113,6 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
cfgs, err := homeChainUni.ccipConfig.GetAllChainConfigs(callCtx)
require.NoError(t, err)
- t.Logf("Got all homechain configs %#v", cfgs)
require.Len(t, cfgs, numChains)
// Create a DON for each chain
@@ -144,15 +143,11 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
require.NoErrorf(t, tApp.AddJobV2(ctx, &jb), "Wasn't able to create ccip job for node %d", i)
}
- t.Logf("Initializing PingPong contracts")
- pingPongs := initializePingPongContracts(t, universes)
-
- // NOTE: messageIDs are populated in the sendPingPong function
- var messageIDs = make(map[uint64]map[uint64][32]byte) // sourceChain->destChain->messageID
- var replayBlocks = make(map[uint64]uint64) // chainID -> blocksToReplay
-
- t.Logf("Sending ping pong from each chain to each other")
- sendPingPong(t, universes, pingPongs, messageIDs, replayBlocks, 1)
+ t.Logf("Sending ccip requests from each chain to all other chains")
+ for _, uni := range universes {
+ requests := genRequestData(uni.chainID, universes)
+ uni.SendCCIPRequests(t, requests)
+ }
// Wait for the oracles to come up.
// TODO: We need some data driven way to do this e.g. wait until LP filters to be registered.
@@ -161,136 +156,126 @@ func TestIntegration_OCR3Nodes(t *testing.T) {
// Replay the log poller on all the chains so that the logs are in the db.
// otherwise the plugins won't pick them up.
for _, node := range nodes {
- for chainID, replayBlock := range replayBlocks {
- t.Logf("Replaying logs for chain %d from block %d", chainID, replayBlock)
- require.NoError(t, node.app.ReplayFromBlock(big.NewInt(int64(chainID)), replayBlock, false), "failed to replay logs")
+ for chainID := range universes {
+ t.Logf("Replaying logs for chain %d from block %d", chainID, 1)
+ require.NoError(t, node.app.ReplayFromBlock(big.NewInt(int64(chainID)), 1, false), "failed to replay logs")
}
}
- // Wait for the commit reports to be generated and reported on all chains.
- numUnis := len(universes)
+ // with only one request sent from each chain to each other chain,
+ // and with sequence numbers on incrementing by 1 on a per-dest chain
+ // basis, we expect the min sequence number to be 1 on all chains.
+ expectedSeqNrRange := ccipocr3.NewSeqNumRange(1, 1)
var wg sync.WaitGroup
for _, uni := range universes {
- wg.Add(1)
- go func(uni onchainUniverse) {
- defer wg.Done()
- waitForCommit(t, uni, numUnis, nil)
- }(uni)
+ for remoteSelector := range universes {
+ if remoteSelector == uni.chainID {
+ continue
+ }
+ wg.Add(1)
+ go func(uni onchainUniverse, remoteSelector uint64) {
+ defer wg.Done()
+ waitForCommitWithInterval(t, uni, getSelector(remoteSelector), expectedSeqNrRange)
+ }(uni, remoteSelector)
+ }
}
- tStart := time.Now()
- t.Log("Waiting for commit reports")
+ start := time.Now()
wg.Wait()
- t.Logf("Commit reports received after %s", time.Since(tStart))
+ t.Logf("All chains received the expected commit report in %s", time.Since(start))
- var preRequestBlocks = make(map[uint64]uint64)
+ // with only one request sent from each chain to each other chain,
+ // all ExecutionStateChanged events should have the sequence number 1.
+ expectedSeqNr := uint64(1)
for _, uni := range universes {
- preRequestBlocks[uni.chainID] = uni.backend.Blockchain().CurrentBlock().Number.Uint64()
- }
-
- t.Log("Sending ping pong from each chain to each other again for a second time")
- sendPingPong(t, universes, pingPongs, messageIDs, replayBlocks, 2)
-
- for _, uni := range universes {
- startBlock := preRequestBlocks[uni.chainID]
- wg.Add(1)
- go func(uni onchainUniverse, startBlock *uint64) {
- defer wg.Done()
- waitForCommit(t, uni, numUnis, startBlock)
- }(uni, &startBlock)
+ for remoteSelector := range universes {
+ if remoteSelector == uni.chainID {
+ continue
+ }
+ wg.Add(1)
+ go func(uni onchainUniverse, remoteSelector uint64) {
+ defer wg.Done()
+ waitForExecWithSeqNr(t, uni, getSelector(remoteSelector), expectedSeqNr)
+ }(uni, remoteSelector)
+ }
}
- tStart = time.Now()
- t.Log("Waiting for second batch of commit reports")
+ start = time.Now()
wg.Wait()
- t.Logf("Second batch of commit reports received after %s", time.Since(tStart))
+ t.Logf("All chains received the expected ExecutionStateChanged event in %s", time.Since(start))
}
-func sendPingPong(t *testing.T, universes map[uint64]onchainUniverse, pingPongs map[uint64]map[uint64]*ping_pong_demo.PingPongDemo, messageIDs map[uint64]map[uint64][32]byte, replayBlocks map[uint64]uint64, expectedSeqNum uint64) {
- for chainID, uni := range universes {
- var replayBlock uint64
- for otherChain, pingPong := range pingPongs[chainID] {
- t.Log("PingPong From: ", chainID, " To: ", otherChain)
-
- expNextSeqNr, err1 := uni.onramp.GetExpectedNextSequenceNumber(&bind.CallOpts{}, getSelector(otherChain))
- require.NoError(t, err1)
- require.Equal(t, expectedSeqNum, expNextSeqNr, "expected next sequence number should be 1")
-
- uni.backend.Commit()
-
- _, err2 := pingPong.StartPingPong(uni.owner)
- require.NoError(t, err2)
- uni.backend.Commit()
-
- endBlock := uni.backend.Blockchain().CurrentBlock().Number.Uint64()
- logIter, err3 := uni.onramp.FilterCCIPSendRequested(&bind.FilterOpts{
- Start: endBlock - 1,
- End: &endBlock,
- }, []uint64{getSelector(otherChain)})
- require.NoError(t, err3)
- // Iterate until latest event
- var count int
- for logIter.Next() {
- count++
- }
- require.Equal(t, 1, count, "expected 1 CCIPSendRequested log only")
-
- log := logIter.Event
- require.Equal(t, getSelector(otherChain), log.DestChainSelector)
- require.Equal(t, pingPong.Address(), log.Message.Sender)
- chainPingPongAddr := pingPongs[otherChain][chainID].Address().Bytes()
-
- // Receiver address is abi-encoded if destination is EVM.
- paddedAddr := common.LeftPadBytes(chainPingPongAddr, len(log.Message.Receiver))
- require.Equal(t, paddedAddr, log.Message.Receiver)
-
- // check that sequence number is equal to the expected next sequence number.
- // and that the sequence number is bumped in the onramp.
- require.Equalf(t, log.Message.Header.SequenceNumber, expNextSeqNr, "incorrect sequence number in CCIPSendRequested event on chain %d", log.DestChainSelector)
- newExpNextSeqNr, err := uni.onramp.GetExpectedNextSequenceNumber(&bind.CallOpts{}, getSelector(otherChain))
- require.NoError(t, err)
- require.Equal(t, expNextSeqNr+1, newExpNextSeqNr, "expected next sequence number should be bumped by 1")
-
- _, ok := messageIDs[chainID]
- if !ok {
- messageIDs[chainID] = make(map[uint64][32]byte)
- }
- messageIDs[chainID][otherChain] = log.Message.Header.MessageId
-
- // replay block should be the earliest block that has a ccip message.
- if replayBlock == 0 {
- replayBlock = endBlock
- }
+func genRequestData(chainID uint64, universes map[uint64]onchainUniverse) []requestData {
+ var res []requestData
+ for destChainID, destUni := range universes {
+ if destChainID == chainID {
+ continue
}
- replayBlocks[chainID] = replayBlock
+ res = append(res, requestData{
+ destChainSelector: getSelector(destChainID),
+ receiverAddress: destUni.receiver.Address(),
+ data: []byte(fmt.Sprintf("msg from chain %d to chain %d", chainID, destChainID)),
+ })
}
+ return res
}
-func waitForCommit(t *testing.T, uni onchainUniverse, numUnis int, startBlock *uint64) {
+func waitForCommitWithInterval(
+ t *testing.T,
+ uni onchainUniverse,
+ expectedSourceChainSelector uint64,
+ expectedSeqNumRange ccipocr3.SeqNumRange,
+) {
sink := make(chan *evm_2_evm_multi_offramp.EVM2EVMMultiOffRampCommitReportAccepted)
subscription, err := uni.offramp.WatchCommitReportAccepted(&bind.WatchOpts{
- Start: startBlock,
Context: testutils.Context(t),
}, sink)
require.NoError(t, err)
for {
select {
- case <-time.After(5 * time.Second):
- t.Logf("Waiting for commit report on chain id %d (selector %d)", uni.chainID, getSelector(uni.chainID))
+ case <-time.After(10 * time.Second):
+ t.Logf("Waiting for commit report on chain id %d (selector %d) from source selector %d expected seq nr range %s",
+ uni.chainID, getSelector(uni.chainID), expectedSourceChainSelector, expectedSeqNumRange.String())
case subErr := <-subscription.Err():
t.Fatalf("Subscription error: %+v", subErr)
case report := <-sink:
if len(report.Report.MerkleRoots) > 0 {
- if len(report.Report.MerkleRoots) == numUnis-1 {
- t.Logf("Received commit report with %d merkle roots on chain id %d (selector %d): %+v",
- len(report.Report.MerkleRoots), uni.chainID, getSelector(uni.chainID), report)
- return
+ // Check the interval of sequence numbers and make sure it matches
+ // the expected range.
+ for _, mr := range report.Report.MerkleRoots {
+ if mr.SourceChainSelector == expectedSourceChainSelector &&
+ uint64(expectedSeqNumRange.Start()) == mr.Interval.Min &&
+ uint64(expectedSeqNumRange.End()) == mr.Interval.Max {
+ t.Logf("Received commit report on chain id %d (selector %d) from source selector %d expected seq nr range %s",
+ uni.chainID, getSelector(uni.chainID), expectedSourceChainSelector, expectedSeqNumRange.String())
+ return
+ }
}
- t.Fatalf("Received commit report with %d merkle roots, expected %d", len(report.Report.MerkleRoots), numUnis)
- } else {
- t.Logf("Received commit report without merkle roots on chain id %d (selector %d): %+v", uni.chainID, getSelector(uni.chainID), report)
}
}
}
}
+
+func waitForExecWithSeqNr(t *testing.T, uni onchainUniverse, expectedSourceChainSelector, expectedSeqNr uint64) {
+ for {
+ scc, err := uni.offramp.GetSourceChainConfig(nil, expectedSourceChainSelector)
+ require.NoError(t, err)
+ t.Logf("Waiting for ExecutionStateChanged on chain %d (selector %d) from chain %d with expected sequence number %d, current onchain minSeqNr: %d",
+ uni.chainID, getSelector(uni.chainID), expectedSourceChainSelector, expectedSeqNr, scc.MinSeqNr)
+ iter, err := uni.offramp.FilterExecutionStateChanged(nil, []uint64{expectedSourceChainSelector}, []uint64{expectedSeqNr}, nil)
+ require.NoError(t, err)
+ var count int
+ for iter.Next() {
+ if iter.Event.SequenceNumber == expectedSeqNr && iter.Event.SourceChainSelector == expectedSourceChainSelector {
+ count++
+ }
+ }
+ if count == 1 {
+ t.Logf("Received ExecutionStateChanged on chain %d (selector %d) from chain %d with expected sequence number %d",
+ uni.chainID, getSelector(uni.chainID), expectedSourceChainSelector, expectedSeqNr)
+ return
+ }
+ time.Sleep(5 * time.Second)
+ }
+}
diff --git a/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go b/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go
index 11fb203de5..ec35621bf8 100644
--- a/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go
+++ b/core/capabilities/ccip/ccip_integration_tests/ocr_node_helper.go
@@ -119,7 +119,6 @@ func setupNodeOCR3(
ChainOpts: legacyevm.ChainOpts{
AppConfig: cfg,
GenEthClient: func(i *big.Int) client.Client {
- t.Log("genning eth client for chain id:", i.String())
client, ok := clients[i.Uint64()]
if !ok {
t.Fatal("no backend for chainID", i)
@@ -218,7 +217,6 @@ type EthKeystoreSim struct {
// override
func (e *EthKeystoreSim) SignTx(ctx context.Context, address common.Address, tx *gethtypes.Transaction, chainID *big.Int) (*gethtypes.Transaction, error) {
// always sign with chain id 1337 for the simulated backend
- e.t.Log("always signing tx for chain id:", chainID.String(), "with chain id 1337, tx hash:", tx.Hash())
return e.Eth.SignTx(ctx, address, tx, big.NewInt(1337))
}
diff --git a/core/capabilities/ccip/ccipevm/helpers.go b/core/capabilities/ccip/ccipevm/helpers.go
index bd9605bc34..ee83230a4c 100644
--- a/core/capabilities/ccip/ccipevm/helpers.go
+++ b/core/capabilities/ccip/ccipevm/helpers.go
@@ -7,6 +7,10 @@ import (
)
func decodeExtraArgsV1V2(extraArgs []byte) (gasLimit *big.Int, err error) {
+ if len(extraArgs) < 4 {
+ return nil, fmt.Errorf("extra args too short: %d, should be at least 4 (i.e the extraArgs tag)", len(extraArgs))
+ }
+
var method string
if bytes.Equal(extraArgs[:4], evmExtraArgsV1Tag) {
method = "decodeEVMExtraArgsV1"
diff --git a/core/capabilities/ccip/ocrimpls/contract_transmitter.go b/core/capabilities/ccip/ocrimpls/contract_transmitter.go
index a74c9e0522..fd8e206d0e 100644
--- a/core/capabilities/ccip/ocrimpls/contract_transmitter.go
+++ b/core/capabilities/ccip/ocrimpls/contract_transmitter.go
@@ -176,7 +176,7 @@ func (c *commitTransmitter[RI]) Transmit(
return fmt.Errorf("failed to generate UUID: %w", err)
}
zero := big.NewInt(0)
- if err := c.cw.SubmitTransaction(ctx, c.contractName, c.method, args, txID.String(), c.offrampAddress, &meta, zero); err != nil {
+ if err := c.cw.SubmitTransaction(ctx, c.contractName, c.method, args, fmt.Sprintf("%s-%s-%s", c.contractName, c.offrampAddress, txID.String()), c.offrampAddress, &meta, zero); err != nil {
return fmt.Errorf("failed to submit transaction thru chainwriter: %w", err)
}
diff --git a/core/chains/evm/txmgr/client.go b/core/chains/evm/txmgr/client.go
index 661a180af5..7d3570ed77 100644
--- a/core/chains/evm/txmgr/client.go
+++ b/core/chains/evm/txmgr/client.go
@@ -140,6 +140,7 @@ func (c *evmTxmClient) BatchGetReceipts(ctx context.Context, attempts []TxAttemp
for _, req := range reqs {
txErr = append(txErr, req.Error)
}
+
return txReceipt, txErr, nil
}
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index 458061502e..8d4cdd2cf3 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -274,7 +274,7 @@ require (
github.com/sethvargo/go-retry v0.2.4 // indirect
github.com/shirou/gopsutil v3.21.11+incompatible // indirect
github.com/shirou/gopsutil/v3 v3.24.3 // indirect
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e // indirect
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827 // indirect
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index 06cd475fbd..e882613371 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -1070,8 +1070,8 @@ github.com/smartcontractkit/chain-selectors v1.0.19 h1:y82TyWaOA6gSvi26bbyDYgfZv
github.com/smartcontractkit/chain-selectors v1.0.19/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e h1:aFYsUujFGiVwPAlvG94GHMIaLm8AFQ0V+d10AQD9ogY=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e/go.mod h1:K67FldZZmg+//7yyI0yBMXEw6uvYevTj/ErBEvXaBXM=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 h1:2PmmxcZY1/7Zp65BG0X5uXoxo1l+F5u8OdtulPHJjyA=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956/go.mod h1:K67FldZZmg+//7yyI0yBMXEw6uvYevTj/ErBEvXaBXM=
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834 h1:pTf4xdcmiWBqWZ6rTy2RMTDBzhHk89VC1pM7jXKQztI=
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 h1:NBQLtqk8zsyY4qTJs+NElI3aDFTcAo83JHvqD04EvB0=
diff --git a/go.mod b/go.mod
index c34c41b1b7..c8bf31f166 100644
--- a/go.mod
+++ b/go.mod
@@ -74,7 +74,7 @@ require (
github.com/shopspring/decimal v1.4.0
github.com/smartcontractkit/chain-selectors v1.0.19
github.com/smartcontractkit/chainlink-automation v1.0.4
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa
diff --git a/go.sum b/go.sum
index acb9c8fc1a..936cc6c5ad 100644
--- a/go.sum
+++ b/go.sum
@@ -1027,8 +1027,8 @@ github.com/smartcontractkit/chain-selectors v1.0.19 h1:y82TyWaOA6gSvi26bbyDYgfZv
github.com/smartcontractkit/chain-selectors v1.0.19/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e h1:aFYsUujFGiVwPAlvG94GHMIaLm8AFQ0V+d10AQD9ogY=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e/go.mod h1:K67FldZZmg+//7yyI0yBMXEw6uvYevTj/ErBEvXaBXM=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 h1:2PmmxcZY1/7Zp65BG0X5uXoxo1l+F5u8OdtulPHJjyA=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956/go.mod h1:K67FldZZmg+//7yyI0yBMXEw6uvYevTj/ErBEvXaBXM=
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834 h1:pTf4xdcmiWBqWZ6rTy2RMTDBzhHk89VC1pM7jXKQztI=
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 h1:NBQLtqk8zsyY4qTJs+NElI3aDFTcAo83JHvqD04EvB0=
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index b1db1f2a54..c0ef987bdb 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -384,7 +384,7 @@ require (
github.com/shirou/gopsutil/v3 v3.24.3 // indirect
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e // indirect
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827 // indirect
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index 0b84f673da..dcc2c5d5ab 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -1392,8 +1392,8 @@ github.com/smartcontractkit/chain-selectors v1.0.19 h1:y82TyWaOA6gSvi26bbyDYgfZv
github.com/smartcontractkit/chain-selectors v1.0.19/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e h1:aFYsUujFGiVwPAlvG94GHMIaLm8AFQ0V+d10AQD9ogY=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e/go.mod h1:K67FldZZmg+//7yyI0yBMXEw6uvYevTj/ErBEvXaBXM=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 h1:2PmmxcZY1/7Zp65BG0X5uXoxo1l+F5u8OdtulPHJjyA=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956/go.mod h1:K67FldZZmg+//7yyI0yBMXEw6uvYevTj/ErBEvXaBXM=
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834 h1:pTf4xdcmiWBqWZ6rTy2RMTDBzhHk89VC1pM7jXKQztI=
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 h1:NBQLtqk8zsyY4qTJs+NElI3aDFTcAo83JHvqD04EvB0=
diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod
index 5cd1ff6858..8df4ab0444 100644
--- a/integration-tests/load/go.mod
+++ b/integration-tests/load/go.mod
@@ -40,7 +40,7 @@ require (
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sagikazarmark/locafero v0.4.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
- github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e // indirect
+ github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 // indirect
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 // indirect
k8s.io/apimachinery v0.30.2 // indirect
)
diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum
index 37e168efd3..1b37a565d2 100644
--- a/integration-tests/load/go.sum
+++ b/integration-tests/load/go.sum
@@ -1374,8 +1374,8 @@ github.com/smartcontractkit/chain-selectors v1.0.19 h1:y82TyWaOA6gSvi26bbyDYgfZv
github.com/smartcontractkit/chain-selectors v1.0.19/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e h1:aFYsUujFGiVwPAlvG94GHMIaLm8AFQ0V+d10AQD9ogY=
-github.com/smartcontractkit/chainlink-ccip v0.0.0-20240729211818-87f9bb698f6e/go.mod h1:K67FldZZmg+//7yyI0yBMXEw6uvYevTj/ErBEvXaBXM=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 h1:2PmmxcZY1/7Zp65BG0X5uXoxo1l+F5u8OdtulPHJjyA=
+github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956/go.mod h1:K67FldZZmg+//7yyI0yBMXEw6uvYevTj/ErBEvXaBXM=
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834 h1:pTf4xdcmiWBqWZ6rTy2RMTDBzhHk89VC1pM7jXKQztI=
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834/go.mod h1:fh9eBbrReCmv31bfz52ENCAMa7nTKQbdhb2B3+S2VGo=
github.com/smartcontractkit/chainlink-cosmos v0.4.1-0.20240710121324-3ed288aa9b45 h1:NBQLtqk8zsyY4qTJs+NElI3aDFTcAo83JHvqD04EvB0=
From d06cd73e1bf330c259118b22d0074cddfd5c72d9 Mon Sep 17 00:00:00 2001
From: amit-momin <108959691+amit-momin@users.noreply.github.com>
Date: Fri, 2 Aug 2024 10:35:40 -0500
Subject: [PATCH 24/28] Update AutoPurge config interface and add header for
Scroll API (#13999)
* Updated AutoPurge heuristic configs to be optional
* Added content-type header for Scroll stuck tx API call
* Fixed linting
* Added changeset
---
.changeset/violet-clouds-rhyme.md | 5 ++++
.../evm/config/chain_scoped_transactions.go | 8 +++----
core/chains/evm/config/config.go | 4 ++--
core/chains/evm/txmgr/stuck_tx_detector.go | 23 ++++++++++++++-----
.../evm/txmgr/stuck_tx_detector_test.go | 16 ++++++-------
5 files changed, 36 insertions(+), 20 deletions(-)
create mode 100644 .changeset/violet-clouds-rhyme.md
diff --git a/.changeset/violet-clouds-rhyme.md b/.changeset/violet-clouds-rhyme.md
new file mode 100644
index 0000000000..b6db0e85c4
--- /dev/null
+++ b/.changeset/violet-clouds-rhyme.md
@@ -0,0 +1,5 @@
+---
+"chainlink": minor
+---
+
+Updated AutoPurge.Threshold and AutoPurge.MinAttempts configs to only be required for heuristic and added content-type header for Scroll API #internal
diff --git a/core/chains/evm/config/chain_scoped_transactions.go b/core/chains/evm/config/chain_scoped_transactions.go
index 87031a4c66..27edb12648 100644
--- a/core/chains/evm/config/chain_scoped_transactions.go
+++ b/core/chains/evm/config/chain_scoped_transactions.go
@@ -47,12 +47,12 @@ func (a *autoPurgeConfig) Enabled() bool {
return *a.c.Enabled
}
-func (a *autoPurgeConfig) Threshold() uint32 {
- return *a.c.Threshold
+func (a *autoPurgeConfig) Threshold() *uint32 {
+ return a.c.Threshold
}
-func (a *autoPurgeConfig) MinAttempts() uint32 {
- return *a.c.MinAttempts
+func (a *autoPurgeConfig) MinAttempts() *uint32 {
+ return a.c.MinAttempts
}
func (a *autoPurgeConfig) DetectionApiUrl() *url.URL {
diff --git a/core/chains/evm/config/config.go b/core/chains/evm/config/config.go
index ea0d52f570..3ecdd9e4b1 100644
--- a/core/chains/evm/config/config.go
+++ b/core/chains/evm/config/config.go
@@ -109,8 +109,8 @@ type Transactions interface {
type AutoPurgeConfig interface {
Enabled() bool
- Threshold() uint32
- MinAttempts() uint32
+ Threshold() *uint32
+ MinAttempts() *uint32
DetectionApiUrl() *url.URL
}
diff --git a/core/chains/evm/txmgr/stuck_tx_detector.go b/core/chains/evm/txmgr/stuck_tx_detector.go
index 1beb857af8..5901be0b02 100644
--- a/core/chains/evm/txmgr/stuck_tx_detector.go
+++ b/core/chains/evm/txmgr/stuck_tx_detector.go
@@ -4,6 +4,7 @@ import (
"bytes"
"context"
"encoding/json"
+ "errors"
"fmt"
"math/big"
"net/http"
@@ -37,8 +38,8 @@ type stuckTxDetectorTxStore interface {
type stuckTxDetectorConfig interface {
Enabled() bool
- Threshold() uint32
- MinAttempts() uint32
+ Threshold() *uint32
+ MinAttempts() *uint32
DetectionApiUrl() *url.URL
}
@@ -78,7 +79,7 @@ func NewStuckTxDetector(lggr logger.Logger, chainID *big.Int, chainType chaintyp
func (d *stuckTxDetector) LoadPurgeBlockNumMap(ctx context.Context, addresses []common.Address) error {
// Skip loading purge block num map if auto-purge feature disabled or Threshold is set to 0
- if !d.cfg.Enabled() || d.cfg.Threshold() == 0 {
+ if !d.cfg.Enabled() || d.cfg.Threshold() == nil || *d.cfg.Threshold() == 0 {
return nil
}
d.purgeBlockNumLock.Lock()
@@ -172,6 +173,11 @@ func (d *stuckTxDetector) FindUnconfirmedTxWithLowestNonce(ctx context.Context,
// 4. If 3 is true, check if the latest attempt's gas price is higher than what our gas estimator's GetFee method returns
// 5. If 4 is true, the transaction is likely stuck due to overflow
func (d *stuckTxDetector) detectStuckTransactionsHeuristic(ctx context.Context, txs []Tx, blockNum int64) ([]Tx, error) {
+ if d.cfg.Threshold() == nil || d.cfg.MinAttempts() == nil {
+ err := errors.New("missing required configs for the stuck transaction heuristic. Transactions.AutoPurge.Threshold and Transactions.AutoPurge.MinAttempts are required")
+ d.lggr.Error(err.Error())
+ return txs, err
+ }
d.purgeBlockNumLock.RLock()
defer d.purgeBlockNumLock.RUnlock()
// Get gas price from internal gas estimator
@@ -187,17 +193,17 @@ func (d *stuckTxDetector) detectStuckTransactionsHeuristic(ctx context.Context,
d.purgeBlockNumLock.RLock()
lastPurgeBlockNum := d.purgeBlockNumMap[tx.FromAddress]
d.purgeBlockNumLock.RUnlock()
- if lastPurgeBlockNum > blockNum-int64(d.cfg.Threshold()) {
+ if lastPurgeBlockNum > blockNum-int64(*d.cfg.Threshold()) {
continue
}
// Tx attempts are loaded from newest to oldest
oldestBroadcastAttempt, newestBroadcastAttempt, broadcastedAttemptsCount := findBroadcastedAttempts(tx)
// 2. Check if Threshold amount of blocks have passed since the oldest attempt's broadcast block num
- if *oldestBroadcastAttempt.BroadcastBeforeBlockNum > blockNum-int64(d.cfg.Threshold()) {
+ if *oldestBroadcastAttempt.BroadcastBeforeBlockNum > blockNum-int64(*d.cfg.Threshold()) {
continue
}
// 3. Check if the transaction has at least MinAttempts amount of broadcasted attempts
- if broadcastedAttemptsCount < d.cfg.MinAttempts() {
+ if broadcastedAttemptsCount < *d.cfg.MinAttempts() {
continue
}
// 4. Check if the newest broadcasted attempt's gas price is higher than what our gas estimator's GetFee method returns
@@ -278,6 +284,10 @@ func (d *stuckTxDetector) detectStuckTransactionsScroll(ctx context.Context, txs
if err != nil {
return nil, fmt.Errorf("failed to make new request with context: %w", err)
}
+
+ // Add Content-Type header
+ postReq.Header.Add("Content-Type", "application/json")
+
// Send request
resp, err := d.httpClient.Do(postReq)
if err != nil {
@@ -287,6 +297,7 @@ func (d *stuckTxDetector) detectStuckTransactionsScroll(ctx context.Context, txs
if resp.StatusCode != 200 {
return nil, fmt.Errorf("request failed with status %d", resp.StatusCode)
}
+
// Decode the response into expected type
scrollResp := new(scrollResponse)
err = json.NewDecoder(resp.Body).Decode(scrollResp)
diff --git a/core/chains/evm/txmgr/stuck_tx_detector_test.go b/core/chains/evm/txmgr/stuck_tx_detector_test.go
index e980527c98..5f0d73be18 100644
--- a/core/chains/evm/txmgr/stuck_tx_detector_test.go
+++ b/core/chains/evm/txmgr/stuck_tx_detector_test.go
@@ -78,8 +78,8 @@ func TestStuckTxDetector_LoadPurgeBlockNumMap(t *testing.T) {
autoPurgeMinAttempts := uint32(3)
autoPurgeCfg := testAutoPurgeConfig{
enabled: true, // Enable auto-purge feature for testing
- threshold: autoPurgeThreshold,
- minAttempts: autoPurgeMinAttempts,
+ threshold: &autoPurgeThreshold,
+ minAttempts: &autoPurgeMinAttempts,
}
stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), autoPurgeCfg, feeEstimator, txStore, ethClient)
@@ -176,8 +176,8 @@ func TestStuckTxDetector_DetectStuckTransactionsHeuristic(t *testing.T) {
autoPurgeMinAttempts := uint32(3)
autoPurgeCfg := testAutoPurgeConfig{
enabled: true, // Enable auto-purge feature for testing
- threshold: autoPurgeThreshold,
- minAttempts: autoPurgeMinAttempts,
+ threshold: &autoPurgeThreshold,
+ minAttempts: &autoPurgeMinAttempts,
}
blockNum := int64(100)
stuckTxDetector := txmgr.NewStuckTxDetector(lggr, testutils.FixtureChainID, "", assets.NewWei(assets.NewEth(100).ToInt()), autoPurgeCfg, feeEstimator, txStore, ethClient)
@@ -423,12 +423,12 @@ func mustInsertUnconfirmedEthTxWithBroadcastPurgeAttempt(t *testing.T, txStore t
type testAutoPurgeConfig struct {
enabled bool
- threshold uint32
- minAttempts uint32
+ threshold *uint32
+ minAttempts *uint32
detectionApiUrl *url.URL
}
func (t testAutoPurgeConfig) Enabled() bool { return t.enabled }
-func (t testAutoPurgeConfig) Threshold() uint32 { return t.threshold }
-func (t testAutoPurgeConfig) MinAttempts() uint32 { return t.minAttempts }
+func (t testAutoPurgeConfig) Threshold() *uint32 { return t.threshold }
+func (t testAutoPurgeConfig) MinAttempts() *uint32 { return t.minAttempts }
func (t testAutoPurgeConfig) DetectionApiUrl() *url.URL { return t.detectionApiUrl }
From b446f451b1c4a813d32ff91bf9f2737d5ecbd9cc Mon Sep 17 00:00:00 2001
From: Mateusz Sekara
Date: Mon, 5 Aug 2024 16:28:37 +0200
Subject: [PATCH 25/28] Load test config adjustments (#1259)
Minor changes in load tests config reflecting current behavior in CCIP
* Reducing number of tokens per message.
* Reducing the number of tokens configured per chain. We assume that
dynamic token prices will be limited to very small number of tokens
(native, link etc). The rest of them would be either static (doesn't
require price update) or self serve
---
.../baseline.toml | 10 +++++-----
.../prod-testnet.toml | 0
.../sample-scalability.toml | 0
.../tier-a.toml | 2 +-
.../tier-b.toml | 0
5 files changed, 6 insertions(+), 6 deletions(-)
rename integration-tests/ccip-tests/testconfig/tomls/{ccip1.4-stress-2024-06-27 => ccip1.4-stress}/baseline.toml (96%)
rename integration-tests/ccip-tests/testconfig/tomls/{ccip1.4-stress-2024-06-27 => ccip1.4-stress}/prod-testnet.toml (100%)
rename integration-tests/ccip-tests/testconfig/tomls/{ccip1.4-stress-2024-06-27 => ccip1.4-stress}/sample-scalability.toml (100%)
rename integration-tests/ccip-tests/testconfig/tomls/{ccip1.4-stress-2024-06-27 => ccip1.4-stress}/tier-a.toml (98%)
rename integration-tests/ccip-tests/testconfig/tomls/{ccip1.4-stress-2024-06-27 => ccip1.4-stress}/tier-b.toml (100%)
diff --git a/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/baseline.toml b/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/baseline.toml
similarity index 96%
rename from integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/baseline.toml
rename to integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/baseline.toml
index ef7fbadee2..d48c0b0f79 100644
--- a/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/baseline.toml
+++ b/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/baseline.toml
@@ -7,7 +7,7 @@
##
## make test_load_ccip testimage=.dkr.ecr..amazonaws.com/chainlink-ccip-tests:ccip-develop \
## testname=TestLoadCCIPStableRequestTriggeringWithNetworkChaos \
-## override_toml=./testconfig/tomls/baseline.toml \
+## override_toml=./testconfig/tomls/ccip-1.4-stress/baseline.toml \
## secret_toml=./testconfig/tomls/secrets.toml
[CCIP]
@@ -148,8 +148,8 @@ BatchGasLimit = 11000000
[CCIP.Groups.load.TokenConfig]
TimeoutForPriceUpdate = '15m'
-NoOfTokensPerChain = 60
-NoOfTokensWithDynamicPrice = 15
+NoOfTokensPerChain = 10
+NoOfTokensWithDynamicPrice = 10
DynamicPriceUpdateInterval ='15s'
CCIPOwnerTokens = true
@@ -168,14 +168,14 @@ Frequencies = [4,12,3,1]
MsgType = 'Token'
DestGasLimit = 0
DataLength = 0
-NoOfTokens = 5
+NoOfTokens = 1
AmountPerToken = 1
[[CCIP.Groups.load.LoadProfile.MsgProfile.MsgDetails]]
MsgType = 'DataWithToken'
DestGasLimit = 500000
DataLength = 5000
-NoOfTokens = 5
+NoOfTokens = 1
AmountPerToken = 1
[[CCIP.Groups.load.LoadProfile.MsgProfile.MsgDetails]]
diff --git a/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/prod-testnet.toml b/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/prod-testnet.toml
similarity index 100%
rename from integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/prod-testnet.toml
rename to integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/prod-testnet.toml
diff --git a/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/sample-scalability.toml b/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/sample-scalability.toml
similarity index 100%
rename from integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/sample-scalability.toml
rename to integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/sample-scalability.toml
diff --git a/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/tier-a.toml b/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/tier-a.toml
similarity index 98%
rename from integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/tier-a.toml
rename to integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/tier-a.toml
index e3ece56203..5270de7f6d 100644
--- a/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/tier-a.toml
+++ b/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/tier-a.toml
@@ -7,7 +7,7 @@
##
## make test_load_ccip testimage=.dkr.ecr..amazonaws.com/chainlink-ccip-tests:ccip-develop \
## testname=TestLoadCCIPStableRequestTriggeringWithNetworkChaos \
-## override_toml=./testconfig/tomls/ccip1.4-stress-2024-06-27/tier-a.toml \
+## override_toml=./testconfig/tomls/ccip1.4-stress/tier-a.toml \
## secret_toml=./testconfig/tomls/secrets.toml
[CCIP]
diff --git a/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/tier-b.toml b/integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/tier-b.toml
similarity index 100%
rename from integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress-2024-06-27/tier-b.toml
rename to integration-tests/ccip-tests/testconfig/tomls/ccip1.4-stress/tier-b.toml
From 49cfead8cf251f08be57eb979be17de86e738573 Mon Sep 17 00:00:00 2001
From: Ryan <80392855+RayXpub@users.noreply.github.com>
Date: Mon, 5 Aug 2024 19:02:38 +0400
Subject: [PATCH 26/28] Static analysis fixes (#1255)
## Motivation
This PR applies several fixes from static analysis findings.
## Solution
Fixes include:
- Unused state variables removal
- Unused imports removal
- Unused events removal
- Unused custom errors removal
- Add of missing zero address check
- Implementation of missing getter
- Use of constants instead of magic numbers
---
contracts/gas-snapshots/ccip.gas-snapshot | 68 ++--
.../v0.8/ccip/MultiAggregateRateLimiter.sol | 3 -
contracts/src/v0.8/ccip/PriceRegistry.sol | 5 -
.../src/v0.8/ccip/capability/CCIPConfig.sol | 21 +-
.../v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol | 2 +-
.../v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol | 13 -
.../src/v0.8/ccip/test/NonceManager.t.sol | 2 +-
.../ccip/test/capability/CCIPConfig.t.sol | 23 +-
.../ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol | 2 +-
.../ccip/generated/ccip_config/ccip_config.go | 28 +-
.../evm_2_evm_multi_onramp.go | 131 +------
.../price_registry/price_registry.go | 282 +-------------
...rapper-dependency-versions-do-not-edit.txt | 6 +-
.../ccip/mocks/price_registry_interface.go | 354 ------------------
14 files changed, 104 insertions(+), 836 deletions(-)
diff --git a/contracts/gas-snapshots/ccip.gas-snapshot b/contracts/gas-snapshots/ccip.gas-snapshot
index 07822638c6..4bb6701f8f 100644
--- a/contracts/gas-snapshots/ccip.gas-snapshot
+++ b/contracts/gas-snapshots/ccip.gas-snapshot
@@ -35,43 +35,45 @@ BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurnRevertNotHealthy_Revert() (gas
BurnWithFromMintTokenPool_lockOrBurn:test_PoolBurn_Success() (gas: 243517)
BurnWithFromMintTokenPool_lockOrBurn:test_Setup_Success() (gas: 24304)
CCIPClientExample_sanity:test_ImmutableExamples_Success() (gas: 2132877)
-CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9495)
-CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70755)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363647)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 488774)
-CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 453384)
+CCIPConfigSetup:test_getCapabilityConfiguration_Success() (gas: 9517)
+CCIPConfig_ConfigStateMachine:test__computeConfigDigest_Success() (gas: 70831)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_InitToRunning_Success() (gas: 363708)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_RunningToStaging_Success() (gas: 488870)
+CCIPConfig_ConfigStateMachine:test__computeNewConfigWithMeta_StagingToRunning_Success() (gas: 453483)
CCIPConfig_ConfigStateMachine:test__groupByPluginType_TooManyOCR3Configs_Reverts() (gas: 37027)
CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeCommitConfigs_Reverts() (gas: 61043)
CCIPConfig_ConfigStateMachine:test__groupByPluginType_threeExecutionConfigs_Reverts() (gas: 60963)
-CCIPConfig_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11764)
-CCIPConfig_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8765)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 311991)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 49663)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 32275)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 376576)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 120943)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 157105)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 376352)
-CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 157172)
-CCIPConfig_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9583)
-CCIPConfig__updatePluginConfig:test__updatePluginConfig_InitToRunning_Success() (gas: 1057393)
-CCIPConfig__updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 27539)
-CCIPConfig__updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 23105)
-CCIPConfig__updatePluginConfig:test__updatePluginConfig_RunningToStaging_Success() (gas: 2009309)
-CCIPConfig__updatePluginConfig:test__updatePluginConfig_StagingToRunning_Success() (gas: 2616177)
-CCIPConfig__updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9583)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1851188)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1068362)
-CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1068393)
+CCIPConfig_ConfigStateMachine:test__stateFromConfigLength_Success() (gas: 11635)
+CCIPConfig_ConfigStateMachine:test__validateConfigStateTransition_Success() (gas: 8831)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_Success() (gas: 312055)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_InitToRunning_WrongConfigCount_Reverts() (gas: 49727)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_NonExistentConfigTransition_Reverts() (gas: 32320)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_Success() (gas: 376678)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigCount_Reverts() (gas: 121045)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_RunningToStaging_WrongConfigDigestBlueGreen_Reverts() (gas: 157245)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_Success() (gas: 376454)
+CCIPConfig_ConfigStateMachine:test__validateConfigTransition_StagingToRunning_WrongConfigDigest_Reverts() (gas: 157312)
+CCIPConfig_ConfigStateMachine:test_getCapabilityConfiguration_Success() (gas: 9605)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitAndExecConfig_Success() (gas: 1851094)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_CommitConfigOnly_Success() (gas: 1068315)
+CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ExecConfigOnly_Success() (gas: 1068346)
CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_OnlyCapabilitiesRegistryCanCall_Reverts() (gas: 9599)
CCIPConfig_beforeCapabilityConfigSet:test_beforeCapabilityConfigSet_ZeroLengthConfig_Success() (gas: 16070)
-CCIPConfig_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9583)
+CCIPConfig_beforeCapabilityConfigSet:test_getCapabilityConfiguration_Success() (gas: 9605)
CCIPConfig_chainConfig:test__applyChainConfigUpdates_FChainNotPositive_Reverts() (gas: 184703)
CCIPConfig_chainConfig:test_applyChainConfigUpdates_addChainConfigs_Success() (gas: 344332)
CCIPConfig_chainConfig:test_applyChainConfigUpdates_nodeNotInRegistry_Reverts() (gas: 20258)
CCIPConfig_chainConfig:test_applyChainConfigUpdates_removeChainConfigs_Success() (gas: 267558)
CCIPConfig_chainConfig:test_applyChainConfigUpdates_selectorNotFound_Reverts() (gas: 14829)
-CCIPConfig_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9626)
+CCIPConfig_chainConfig:test_getCapabilityConfiguration_Success() (gas: 9648)
+CCIPConfig_constructor:test_constructor_Success() (gas: 3567986)
+CCIPConfig_constructor:test_constructor_ZeroAddressNotAllowed_Revert() (gas: 61720)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_InitToRunning_Success() (gas: 1057346)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigLength_Reverts() (gas: 27539)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_InvalidConfigStateTransition_Reverts() (gas: 23105)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_RunningToStaging_Success() (gas: 2009267)
+CCIPConfig_updatePluginConfig:test__updatePluginConfig_StagingToRunning_Success() (gas: 2616097)
+CCIPConfig_updatePluginConfig:test_getCapabilityConfiguration_Success() (gas: 9605)
CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsHasDuplicates_Reverts() (gas: 294893)
CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsNotASubsetOfP2PIds_Reverts() (gas: 298325)
CCIPConfig_validateConfig:test__validateConfig_BootstrapP2PIdsNotSorted_Reverts() (gas: 295038)
@@ -89,7 +91,7 @@ CCIPConfig_validateConfig:test__validateConfig_Success() (gas: 302186)
CCIPConfig_validateConfig:test__validateConfig_TooManyBootstrapP2PIds_Reverts() (gas: 294539)
CCIPConfig_validateConfig:test__validateConfig_TooManySigners_Reverts() (gas: 1215861)
CCIPConfig_validateConfig:test__validateConfig_TooManyTransmitters_Reverts() (gas: 1214264)
-CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9562)
+CCIPConfig_validateConfig:test_getCapabilityConfiguration_Success() (gas: 9584)
CommitStore_constructor:test_Constructor_Success() (gas: 3091326)
CommitStore_isUnpausedAndRMNHealthy:test_RMN_Success() (gas: 73420)
CommitStore_report:test_InvalidIntervalMinLargerThanMax_Revert() (gas: 28670)
@@ -250,11 +252,11 @@ EVM2EVMMultiOffRamp_verify:test_Blessed_Success() (gas: 176604)
EVM2EVMMultiOffRamp_verify:test_NotBlessedWrongChainSelector_Success() (gas: 178672)
EVM2EVMMultiOffRamp_verify:test_NotBlessed_Success() (gas: 141533)
EVM2EVMMultiOffRamp_verify:test_TooManyLeaves_Revert() (gas: 51508)
-EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94528)
-EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92480)
-EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97483)
-EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92538)
-EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 2260144)
+EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigChainSelectorEqZero_Revert() (gas: 94508)
+EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigNonceManagerEqAddressZero_Revert() (gas: 92460)
+EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigRMNProxyEqAddressZero_Revert() (gas: 97463)
+EVM2EVMMultiOnRamp_constructor:test_Constructor_InvalidConfigTokenAdminRegistryEqAddressZero_Revert() (gas: 92518)
+EVM2EVMMultiOnRamp_constructor:test_Constructor_Success() (gas: 2256117)
EVM2EVMMultiOnRamp_forwardFromRouter:test_CannotSendZeroTokens_Revert() (gas: 90987)
EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2AllowOutOfOrderTrue_Success() (gas: 130983)
EVM2EVMMultiOnRamp_forwardFromRouter:test_ForwardFromRouterExtraArgsV2_Success() (gas: 161753)
diff --git a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
index 4252d0defd..f86bbed2c0 100644
--- a/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
+++ b/contracts/src/v0.8/ccip/MultiAggregateRateLimiter.sol
@@ -11,8 +11,6 @@ import {Client} from "./libraries/Client.sol";
import {RateLimiter} from "./libraries/RateLimiter.sol";
import {USDPriceWith18Decimals} from "./libraries/USDPriceWith18Decimals.sol";
-import {EnumerableSet} from "./../vendor/openzeppelin-solidity/v4.7.3/contracts/utils/structs/EnumerableSet.sol";
-
/// @notice The aggregate rate limiter is a wrapper of the token bucket rate limiter
/// which permits rate limiting based on the aggregate value of a group of
/// token transfers, using a price registry to convert to a numeraire asset (e.g. USD).
@@ -22,7 +20,6 @@ contract MultiAggregateRateLimiter is IMessageInterceptor, AuthorizedCallers, IT
using RateLimiter for RateLimiter.TokenBucket;
using USDPriceWith18Decimals for uint224;
using EnumerableMapAddresses for EnumerableMapAddresses.AddressToBytes32Map;
- using EnumerableSet for EnumerableSet.AddressSet;
error PriceNotFoundForToken(address token);
error ZeroChainSelectorNotAllowed();
diff --git a/contracts/src/v0.8/ccip/PriceRegistry.sol b/contracts/src/v0.8/ccip/PriceRegistry.sol
index f15232271e..c6250d7bc9 100644
--- a/contracts/src/v0.8/ccip/PriceRegistry.sol
+++ b/contracts/src/v0.8/ccip/PriceRegistry.sol
@@ -51,14 +51,11 @@ contract PriceRegistry is AuthorizedCallers, IPriceRegistry, ITypeAndVersion {
error MessageTooLarge(uint256 maxSize, uint256 actualSize);
error UnsupportedNumberOfTokens();
- event PriceUpdaterSet(address indexed priceUpdater);
- event PriceUpdaterRemoved(address indexed priceUpdater);
event FeeTokenAdded(address indexed feeToken);
event FeeTokenRemoved(address indexed feeToken);
event UsdPerUnitGasUpdated(uint64 indexed destChain, uint256 value, uint256 timestamp);
event UsdPerTokenUpdated(address indexed token, uint256 value, uint256 timestamp);
event PriceFeedPerTokenUpdated(address indexed token, IPriceRegistry.TokenPriceFeedConfig priceFeedConfig);
-
event TokenTransferFeeConfigUpdated(
uint64 indexed destChainSelector, address indexed token, TokenTransferFeeConfig tokenTransferFeeConfig
);
@@ -178,8 +175,6 @@ contract PriceRegistry is AuthorizedCallers, IPriceRegistry, ITypeAndVersion {
/// @dev The link token address
address internal immutable i_linkToken;
- // Price updaters are allowed to update the prices.
- EnumerableSet.AddressSet private s_priceUpdaters;
// Subset of tokens which prices tracked by this registry which are fee tokens.
EnumerableSet.AddressSet private s_feeTokens;
// The amount of time a gas price can be stale before it is considered invalid.
diff --git a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol b/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
index 40b7a4a2f9..9a88c4bccd 100644
--- a/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
+++ b/contracts/src/v0.8/ccip/capability/CCIPConfig.sol
@@ -31,7 +31,6 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
/// @param chainSelector The chain selector.
event ChainConfigRemoved(uint64 chainSelector);
- error ChainConfigNotSetForChain(uint64 chainSelector);
error NodeNotInRegistry(bytes32 p2pId);
error OnlyCapabilitiesRegistryCanCall();
error ChainSelectorNotFound(uint64 chainSelector);
@@ -55,6 +54,7 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
error WrongConfigCount(uint64 got, uint64 expected);
error WrongConfigDigest(bytes32 got, bytes32 expected);
error WrongConfigDigestBlueGreen(bytes32 got, bytes32 expected);
+ error ZeroAddressNotAllowed();
/// @notice Type and version override.
string public constant override typeAndVersion = "CCIPConfig 1.6.0-dev";
@@ -75,15 +75,18 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
uint32 donId => mapping(Internal.OCRPluginType pluginType => CCIPConfigTypes.OCR3ConfigWithMeta[] ocr3Configs)
) internal s_ocr3Configs;
- /// @notice The DONs that have been configured.
- EnumerableSet.UintSet internal s_donIds;
-
uint8 internal constant MAX_OCR3_CONFIGS_PER_PLUGIN = 2;
uint8 internal constant MAX_OCR3_CONFIGS_PER_DON = 4;
uint8 internal constant MAX_NUM_ORACLES = 31;
+ uint256 internal constant CONFIG_DIGEST_PREFIX_MASK = type(uint256).max << (256 - 16); // 0xFFFF00..0
+ /// @dev must be equal to libocr multi role: https://github.com/smartcontractkit/libocr/blob/ae747ca5b81236ffdbf1714318c652e923a5ff4d/offchainreporting2plus/types/config_digest.go#L28
+ uint256 internal constant CONFIG_DIGEST_PREFIX = 0x000a << (256 - 16); // 0x000a00..00
/// @param capabilitiesRegistry the canonical capabilities registry address.
constructor(address capabilitiesRegistry) {
+ if (capabilitiesRegistry == address(0)) {
+ revert ZeroAddressNotAllowed();
+ }
i_capabilitiesRegistry = capabilitiesRegistry;
}
@@ -95,6 +98,11 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
// ================================================================
// │ Config Getters │
// ================================================================
+ /// @notice Returns the capabilities registry address.
+ /// @return The capabilities registry address.
+ function getCapabilityRegistry() external view returns (address) {
+ return i_capabilitiesRegistry;
+ }
/// @notice Returns all the chain configurations.
/// @return The chain configurations.
@@ -413,9 +421,8 @@ contract CCIPConfig is ITypeAndVersion, ICapabilityConfiguration, OwnerIsCreator
)
)
);
- uint256 prefixMask = type(uint256).max << (256 - 16); // 0xFFFF00..00
- uint256 prefix = 0x000a << (256 - 16); // 0x000a00..00
- return bytes32((prefix & prefixMask) | (h & ~prefixMask));
+
+ return bytes32((CONFIG_DIGEST_PREFIX & CONFIG_DIGEST_PREFIX_MASK) | (h & ~CONFIG_DIGEST_PREFIX_MASK));
}
// ================================================================
diff --git a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol
index 89c066dd11..34e4793d22 100644
--- a/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol
+++ b/contracts/src/v0.8/ccip/offRamp/EVM2EVMMultiOffRamp.sol
@@ -618,7 +618,7 @@ contract EVM2EVMMultiOffRamp is ITypeAndVersion, MultiOCR3Base {
/// @notice Returns the sequence number of the last price update.
/// @return the latest price update sequence number.
- function getLatestPriceSequenceNumber() public view returns (uint64) {
+ function getLatestPriceSequenceNumber() external view returns (uint64) {
return s_latestPriceSequenceNumber;
}
diff --git a/contracts/src/v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol b/contracts/src/v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol
index fc455cc869..10d2a11079 100644
--- a/contracts/src/v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol
+++ b/contracts/src/v0.8/ccip/onRamp/EVM2EVMMultiOnRamp.sol
@@ -27,10 +27,6 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCre
using USDPriceWith18Decimals for uint224;
error CannotSendZeroTokens();
- error InvalidExtraArgsTag();
- error ExtraArgOutOfOrderExecutionMustBeTrue();
- error OnlyCallableByOwnerOrAdmin();
- error MessageGasLimitTooHigh();
error UnsupportedToken(address token);
error MustBeCalledByRouter();
error RouterMustSetOriginalSender();
@@ -38,7 +34,6 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCre
error CursedByRMN(uint64 sourceChainSelector);
error GetSupportedTokensFunctionalityRemovedCheckAdminRegistry();
- event AdminSet(address newAdmin);
event ConfigSet(StaticConfig staticConfig, DynamicConfig dynamicConfig);
event FeePaid(address indexed feeToken, uint256 feeValueJuels);
event FeeTokenWithdrawn(address indexed feeAggregator, address indexed feeToken, uint256 amount);
@@ -75,8 +70,6 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCre
/// @dev The address of the token admin registry
address internal immutable i_tokenAdminRegistry;
/// @dev the maximum number of nops that can be configured at the same time.
- /// Used to bound gas for loops over nops.
- uint256 private constant MAX_NUMBER_OF_NOPS = 64;
// DYNAMIC CONFIG
/// @dev The config for the onRamp
@@ -87,12 +80,6 @@ contract EVM2EVMMultiOnRamp is IEVM2AnyOnRampClient, ITypeAndVersion, OwnerIsCre
/// 0 is not a valid sequence number for any real transaction.
mapping(uint64 destChainSelector => uint64 sequenceNumber) internal s_destChainSequenceNumbers;
- // STATE
- /// @dev The amount of LINK available to pay NOPS
- uint96 internal s_nopFeesJuels;
- /// @dev The combined weight of all NOPs weights
- uint32 internal s_nopWeightsTotal;
-
constructor(StaticConfig memory staticConfig, DynamicConfig memory dynamicConfig) {
if (
staticConfig.chainSelector == 0 || staticConfig.rmnProxy == address(0) || staticConfig.nonceManager == address(0)
diff --git a/contracts/src/v0.8/ccip/test/NonceManager.t.sol b/contracts/src/v0.8/ccip/test/NonceManager.t.sol
index 6ba08597ca..48d00fbaee 100644
--- a/contracts/src/v0.8/ccip/test/NonceManager.t.sol
+++ b/contracts/src/v0.8/ccip/test/NonceManager.t.sol
@@ -27,7 +27,7 @@ contract NonceManager_typeAndVersion is Test {
s_nonceManager = new NonceManager(new address[](0));
}
- function test_typeAndVersion() public {
+ function test_typeAndVersion() public view {
assertEq(s_nonceManager.typeAndVersion(), "NonceManager 1.6.0-dev");
}
}
diff --git a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol b/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
index 0c3108d279..2bb29cd38d 100644
--- a/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
+++ b/contracts/src/v0.8/ccip/test/capability/CCIPConfig.t.sol
@@ -1,14 +1,13 @@
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.24;
-import {Test} from "forge-std/Test.sol";
-
import {SortedSetValidationUtil} from "../../../shared/util/SortedSetValidationUtil.sol";
import {CCIPConfig} from "../../capability/CCIPConfig.sol";
import {ICapabilitiesRegistry} from "../../capability/interfaces/ICapabilitiesRegistry.sol";
import {CCIPConfigTypes} from "../../capability/libraries/CCIPConfigTypes.sol";
import {Internal} from "../../libraries/Internal.sol";
import {CCIPConfigHelper} from "../helpers/CCIPConfigHelper.sol";
+import {Test} from "forge-std/Test.sol";
contract CCIPConfigSetup is Test {
address public constant OWNER = 0x82ae2B4F57CA5C1CBF8f744ADbD3697aD1a35AFe;
@@ -109,6 +108,24 @@ contract CCIPConfigSetup is Test {
}
}
+contract CCIPConfig_constructor is Test {
+ // Successes.
+
+ function test_constructor_Success() public {
+ address capabilitiesRegistry = makeAddr("capabilitiesRegistry");
+ CCIPConfigHelper ccipCC = new CCIPConfigHelper(capabilitiesRegistry);
+ assertEq(address(ccipCC.getCapabilityRegistry()), capabilitiesRegistry);
+ assertEq(ccipCC.typeAndVersion(), "CCIPConfig 1.6.0-dev");
+ }
+
+ // Reverts.
+
+ function test_constructor_ZeroAddressNotAllowed_Revert() public {
+ vm.expectRevert(CCIPConfig.ZeroAddressNotAllowed.selector);
+ new CCIPConfigHelper(address(0));
+ }
+}
+
contract CCIPConfig_chainConfig is CCIPConfigSetup {
// Successes.
@@ -1360,7 +1377,7 @@ contract CCIPConfig_ConfigStateMachine is CCIPConfigSetup {
}
}
-contract CCIPConfig__updatePluginConfig is CCIPConfigSetup {
+contract CCIPConfig_updatePluginConfig is CCIPConfigSetup {
// Successes.
function test__updatePluginConfig_InitToRunning_Success() public {
diff --git a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol
index bc7fac95be..08e468e622 100644
--- a/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol
+++ b/contracts/src/v0.8/ccip/test/onRamp/EVM2EVMMultiOnRamp.t.sol
@@ -337,7 +337,7 @@ contract EVM2EVMMultiOnRamp_forwardFromRouter is EVM2EVMMultiOnRampSetup {
Client.EVM2AnyMessage memory message = _generateEmptyMessage();
message.extraArgs = bytes("bad args");
- vm.expectRevert(EVM2EVMMultiOnRamp.InvalidExtraArgsTag.selector);
+ vm.expectRevert(PriceRegistry.InvalidExtraArgsTag.selector);
s_onRamp.forwardFromRouter(DEST_CHAIN_SELECTOR, message, 0, OWNER);
}
diff --git a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go b/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
index e35a8726de..d367872b05 100644
--- a/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
+++ b/core/gethwrappers/ccip/generated/ccip_config/ccip_config.go
@@ -61,8 +61,8 @@ type CCIPConfigTypesOCR3ConfigWithMeta struct {
}
var CCIPConfigMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigNotSetForChain\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FChainMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidConfigLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"currentState\",\"type\":\"uint8\"},{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"proposedState\",\"type\":\"uint8\"}],\"name\":\"InvalidConfigStateTransition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentConfigTransition\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"set\",\"type\":\"bytes32[]\"}],\"name\":\"NotASortedSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"subset\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"superset\",\"type\":\"bytes32[]\"}],\"name\":\"NotASubset\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"p2pIdsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signersLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transmittersLength\",\"type\":\"uint256\"}],\"name\":\"P2PIdsLengthNotMatching\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyBootstrapP2PIds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOCR3Configs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyTransmitters\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"}],\"name\":\"WrongConfigCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigestBlueGreen\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getOCRConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"bootstrapP2PIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"p2pIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes[]\",\"name\":\"signers\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"transmitters\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60a06040523480156200001157600080fd5b50604051620043cc380380620043cc83398101604081905262000034916200017e565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000d3565b5050506001600160a01b0316608052620001b0565b336001600160a01b038216036200012d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000602082840312156200019157600080fd5b81516001600160a01b0381168114620001a957600080fd5b9392505050565b6080516141f9620001d360003960008181610e4e01526110e301526141f96000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80638da5cb5b11610076578063f2fde38b1161005b578063f2fde38b146101bc578063f442c89a146101cf578063fba64a7c146101e257600080fd5b80638da5cb5b1461017f578063ddc042a8146101a757600080fd5b80634bd0473f116100a75780634bd0473f1461013457806379ba5097146101545780638318ed5d1461015e57600080fd5b806301ffc9a7146100c3578063181f5a77146100eb575b600080fd5b6100d66100d1366004612f77565b6101f5565b60405190151581526020015b60405180910390f35b6101276040518060400160405280601481526020017f43434950436f6e66696720312e362e302d64657600000000000000000000000081525081565b6040516100e2919061301d565b610147610142366004613061565b61028e565b6040516100e2919061318d565b61015c61075e565b005b61012761016c36600461336a565b5060408051602081019091526000815290565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100e2565b6101af610860565b6040516100e291906133cb565b61015c6101ca36600461345b565b610a52565b61015c6101dd3660046134dd565b610a66565b61015c6101f0366004613561565b610e36565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea72100000000000000000000000000000000000000000000000000000000148061028857507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b63ffffffff821660009081526005602052604081206060918360018111156102b8576102b8613096565b60018111156102c9576102c9613096565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561075257600084815260209020604080516101a08101909152600984029091018054829060608201908390829060ff16600181111561033c5761033c613096565b600181111561034d5761034d613096565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916103a59061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546103d19061361e565b801561041e5780601f106103f35761010080835404028352916020019161041e565b820191906000526020600020905b81548152906001019060200180831161040157829003601f168201915b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561047657602002820191906000526020600020905b815481526020019060010190808311610462575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156104ce57602002820191906000526020600020905b8154815260200190600101908083116104ba575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156105a857838290600052602060002001805461051b9061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546105479061361e565b80156105945780601f1061056957610100808354040283529160200191610594565b820191906000526020600020905b81548152906001019060200180831161057757829003601f168201915b5050505050815260200190600101906104fc565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156106815783829060005260206000200180546105f49061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546106209061361e565b801561066d5780601f106106425761010080835404028352916020019161066d565b820191906000526020600020905b81548152906001019060200180831161065057829003601f168201915b5050505050815260200190600101906105d5565b5050505081526020016006820180546106999061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546106c59061361e565b80156107125780601f106106e757610100808354040283529160200191610712565b820191906000526020600020905b8154815290600101906020018083116106f557829003601f168201915b505050919092525050508152600782015467ffffffffffffffff1660208083019190915260089092015460409091015290825260019290920191016102f7565b50505050905092915050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b6060600061086e6003610ef7565b9050600061087c6003610f0b565b67ffffffffffffffff81111561089457610894613671565b6040519080825280602002602001820160405280156108cd57816020015b6108ba612d08565b8152602001906001900390816108b25790505b50905060005b8251811015610a4b5760008382815181106108f0576108f06136a0565b60209081029190910181015160408051808201825267ffffffffffffffff83168082526000908152600285528290208251815460808188028301810190955260608201818152959750929586019490939192849284919084018282801561097657602002820191906000526020600020905b815481526020019060010190808311610962575b5050509183525050600182015460ff1660208201526002820180546040909201916109a09061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546109cc9061361e565b8015610a195780601f106109ee57610100808354040283529160200191610a19565b820191906000526020600020905b8154815290600101906020018083116109fc57829003601f168201915b505050505081525050815250838381518110610a3757610a376136a0565b6020908102919091010152506001016108d3565b5092915050565b610a5a610f15565b610a6381610f98565b50565b610a6e610f15565b60005b83811015610c5457610ab5858583818110610a8e57610a8e6136a0565b9050602002016020810190610aa391906136cf565b60039067ffffffffffffffff1661108d565b610b1f57848482818110610acb57610acb6136a0565b9050602002016020810190610ae091906136cf565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107db565b60026000868684818110610b3557610b356136a0565b9050602002016020810190610b4a91906136cf565b67ffffffffffffffff1681526020810191909152604001600090812090610b718282612d50565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610ba9600283016000612d6e565b5050610be7858583818110610bc057610bc06136a0565b9050602002016020810190610bd591906136cf565b60039067ffffffffffffffff166110a5565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110610c1b57610c1b6136a0565b9050602002016020810190610c3091906136cf565b60405167ffffffffffffffff909116815260200160405180910390a1600101610a71565b5060005b81811015610e2f576000838383818110610c7457610c746136a0565b9050602002810190610c8691906136ea565b610c94906020810190613728565b610c9d9061392a565b80519091506000858585818110610cb657610cb66136a0565b9050602002810190610cc891906136ea565b610cd69060208101906136cf565b905060005b8251811015610d0e57610d06838281518110610cf957610cf96136a0565b60200260200101516110b1565b600101610cdb565b50826020015160ff16600003610d50576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600260209081526040909120845180518693610d80928492910190612da8565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560408201516002820190610dcd9082613a11565b50610de791506003905067ffffffffffffffff83166111ca565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08184604051610e19929190613b2b565b60405180910390a1505050806001019050610c58565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610ea5576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610eb384860186613bd6565b9050600080610ec1836111d6565b8151919350915015610ed957610ed98460008461142f565b805115610eec57610eec8460018361142f565b505050505050505050565b60606000610f0483611c10565b9392505050565b6000610288825490565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016107db565b565b3373ffffffffffffffffffffffffffffffffffffffff821603611017576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016107db565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515610f04565b6000610f048383611c6c565b6040517f50c946fe000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906350c946fe90602401600060405180830381865afa15801561113f573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526111859190810190613e47565b60808101519091506111c6576040517f8907a4fa000000000000000000000000000000000000000000000000000000008152600481018390526024016107db565b5050565b6000610f048383611d5f565b606080600460ff1683511115611218576040517f8854586400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028082526060820190925290816020015b61129c6040805161014081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161122e57505060408051600280825260608201909252919350602082015b6113346040805161014081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b8152602001906001900390816112c657905050905060008060005b855181101561142257600086828151811061136c5761136c6136a0565b602002602001015160000151600181111561138957611389613096565b036113d6578581815181106113a0576113a06136a0565b60200260200101518584815181106113ba576113ba6136a0565b6020026020010181905250826113cf90613f4e565b925061141a565b8581815181106113e8576113e86136a0565b6020026020010151848381518110611402576114026136a0565b60200260200101819052508161141790613f4e565b91505b60010161134f565b5090835281529092909150565b63ffffffff831660009081526005602052604081208184600181111561145757611457613096565b600181111561146857611468613096565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b828210156118f157600084815260209020604080516101a08101909152600984029091018054829060608201908390829060ff1660018111156114db576114db613096565b60018111156114ec576114ec613096565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916115449061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546115709061361e565b80156115bd5780601f10611592576101008083540402835291602001916115bd565b820191906000526020600020905b8154815290600101906020018083116115a057829003601f168201915b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561161557602002820191906000526020600020905b815481526020019060010190808311611601575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561166d57602002820191906000526020600020905b815481526020019060010190808311611659575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156117475783829060005260206000200180546116ba9061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546116e69061361e565b80156117335780601f1061170857610100808354040283529160200191611733565b820191906000526020600020905b81548152906001019060200180831161171657829003601f168201915b50505050508152602001906001019061169b565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156118205783829060005260206000200180546117939061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546117bf9061361e565b801561180c5780601f106117e15761010080835404028352916020019161180c565b820191906000526020600020905b8154815290600101906020018083116117ef57829003601f168201915b505050505081526020019060010190611774565b5050505081526020016006820180546118389061361e565b80601f01602080910402602001604051908101604052809291908181526020018280546118649061361e565b80156118b15780601f10611886576101008083540402835291602001916118b1565b820191906000526020600020905b81548152906001019060200180831161189457829003601f168201915b505050919092525050508152600782015467ffffffffffffffff166020808301919091526008909201546040909101529082526001929092019101611496565b50505050905060006119038251611dae565b905060006119118451611dae565b905061191d8282611e00565b600061192c8785878686611ebc565b905061193884826122a8565b63ffffffff871660009081526005602052604081209087600181111561196057611960613096565b600181111561197157611971613096565b8152602001908152602001600020600061198b9190612df3565b60005b8151811015611c065763ffffffff88166000908152600560205260408120908860018111156119bf576119bf613096565b60018111156119d0576119d0613096565b81526020019081526020016000208282815181106119f0576119f06136a0565b6020908102919091018101518254600181810185556000948552929093208151805160099095029091018054929490939192849283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016908381811115611a5a57611a5a613096565b021790555060208201518154604084015160608501517fffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff90921661010067ffffffffffffffff948516027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000060ff90921691909102177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a0100000000000000000000929091169190910217815560808201516001820190611b299082613a11565b5060a08201518051611b45916002840191602090910190612da8565b5060c08201518051611b61916003840191602090910190612da8565b5060e08201518051611b7d916004840191602090910190612e14565b506101008201518051611b9a916005840191602090910190612e14565b506101208201516006820190611bb09082613a11565b50505060208201516007820180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff90921691909117905560409091015160089091015560010161198e565b5050505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611c6057602002820191906000526020600020905b815481526020019060010190808311611c4c575b50505050509050919050565b60008181526001830160205260408120548015611d55576000611c90600183613f86565b8554909150600090611ca490600190613f86565b9050818114611d09576000866000018281548110611cc457611cc46136a0565b9060005260206000200154905080876000018481548110611ce757611ce76136a0565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611d1a57611d1a613f99565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610288565b6000915050610288565b6000818152600183016020526040812054611da657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610288565b506000610288565b60006002821115611dee576040517f3e478526000000000000000000000000000000000000000000000000000000008152600481018390526024016107db565b81600281111561028857610288613096565b6000826002811115611e1457611e14613096565b826002811115611e2657611e26613096565b611e309190613fc8565b90508060011480611e7c5750807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff148015611e7c57506002836002811115611e7a57611e7a613096565b145b15611e8657505050565b82826040517f0a6b675b0000000000000000000000000000000000000000000000000000000081526004016107db929190613ff8565b60606000845167ffffffffffffffff811115611eda57611eda613671565b604051908082528060200260200182016040528015611f03578160200160208202803683370190505b5090506000846002811115611f1a57611f1a613096565b148015611f3857506001836002811115611f3657611f36613096565b145b15611f7957600181600081518110611f5257611f526136a0565b602002602001019067ffffffffffffffff16908167ffffffffffffffff16815250506120e1565b6001846002811115611f8d57611f8d613096565b148015611fab57506002836002811115611fa957611fa9613096565b145b156120425785600081518110611fc357611fc36136a0565b60200260200101516020015181600081518110611fe257611fe26136a0565b602002602001019067ffffffffffffffff16908167ffffffffffffffff168152505085600081518110612017576120176136a0565b602002602001015160200151600161202f9190614013565b81600181518110611f5257611f526136a0565b600284600281111561205657612056613096565b1480156120745750600183600281111561207257612072613096565b145b156120ab578560018151811061208c5761208c6136a0565b60200260200101516020015181600081518110611f5257611f526136a0565b83836040517f0a6b675b0000000000000000000000000000000000000000000000000000000081526004016107db929190613ff8565b6000855167ffffffffffffffff8111156120fd576120fd613671565b6040519080825280602002602001820160405280156121b357816020015b604080516101a081018252600060608083018281526080840183905260a0840183905260c0840183905260e084018290526101008401829052610120840182905261014084018290526101608401829052610180840191909152825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90920191018161211b5790505b50905060005b825181101561229c576121e48782815181106121d7576121d76136a0565b6020026020010151612627565b6040518060600160405280888381518110612201576122016136a0565b60200260200101518152602001848381518110612220576122206136a0565b602002602001015167ffffffffffffffff1681526020016122748b86858151811061224d5761224d6136a0565b60200260200101518b8681518110612267576122676136a0565b6020026020010151612a2d565b815250828281518110612289576122896136a0565b60209081029190910101526001016121b9565b50979650505050505050565b81518151811580156122ba5750806001145b1561235c57826000815181106122d2576122d26136a0565b60200260200101516020015167ffffffffffffffff166001146123565782600081518110612302576123026136a0565b60209081029190910181015101516040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152600160248201526044016107db565b50505050565b81600114801561236c5750806002145b156125225783600081518110612384576123846136a0565b602002602001015160400151836000815181106123a3576123a36136a0565b6020026020010151604001511461242f57826000815181106123c7576123c76136a0565b602002602001015160400151846000815181106123e6576123e66136a0565b6020026020010151604001516040517fc7ccdd7f0000000000000000000000000000000000000000000000000000000081526004016107db929190918252602082015260400190565b83600081518110612442576124426136a0565b602002602001015160200151600161245a9190614013565b67ffffffffffffffff1683600181518110612477576124776136a0565b60200260200101516020015167ffffffffffffffff161461235657826001815181106124a5576124a56136a0565b602002602001015160200151846000815181106124c4576124c46136a0565b60200260200101516020015160016124dc9190614013565b6040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9283166004820152911660248201526044016107db565b8160021480156125325750806001145b156125f5578360018151811061254a5761254a6136a0565b60200260200101516040015183600081518110612569576125696136a0565b60200260200101516040015114612356578260008151811061258d5761258d6136a0565b602002602001015160400151846001815181106125ac576125ac6136a0565b6020026020010151604001516040517f9e9756700000000000000000000000000000000000000000000000000000000081526004016107db929190918252602082015260400190565b6040517f1f1b2bb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff1660000361266f576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008151600181111561268457612684613096565b141580156126a557506001815160018111156126a2576126a2613096565b14155b156126dc576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80608001515160000361271b576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208101516127369060039067ffffffffffffffff1661108d565b61277e5760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff90911660048201526024016107db565b60e081015151601f10156127be576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61010081015151601f10156127ff576040517f645960ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208082015167ffffffffffffffff1660009081526002909152604081206001015461282f9060ff166003614034565b61283a906001614050565b60ff1690508082610100015151101561289157610100820151516040517f548dd21f0000000000000000000000000000000000000000000000000000000081526004810191909152602481018290526044016107db565b816040015160ff166000036128d2576040517f39d1a4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408201516128e2906003614034565b60ff168260e001515111612922576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160e00151518260c00151511415806129465750816101000151518260c001515114155b156129a15760c08201515160e083015151610100840151516040517fba900f6d0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915260448201526064016107db565b8160c00151518260a001515111156129e5576040517f8473d80700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6129f78260a001518360c00151612b02565b60005b8260e0015151811015612a2857612a208360c001518281518110610cf957610cf96136a0565b6001016129fa565b505050565b60008082602001518584600001518560800151878760a001518860c001518960e001518a61010001518b604001518c606001518d6101200151604051602001612a819c9b9a999897969594939291906140d4565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0a000000000000000000000000000000000000000000000000000000000000179150509392505050565b81511580612b0f57508051155b15612b46576040517fe249684100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b4f82612c7d565b612b5881612c7d565b6000805b835182108015612b6c5750825181105b15612c3e57828181518110612b8357612b836136a0565b6020026020010151848381518110612b9d57612b9d6136a0565b60200260200101511115612bbb57612bb481613f4e565b9050612b5c565b828181518110612bcd57612bcd6136a0565b6020026020010151848381518110612be757612be76136a0565b602002602001015103612c0857612bfd82613f4e565b9150612bb481613f4e565b83836040517fd671700c0000000000000000000000000000000000000000000000000000000081526004016107db9291906141b4565b83518210156123565783836040517fd671700c0000000000000000000000000000000000000000000000000000000081526004016107db9291906141b4565b60015b81518110156111c65781612c95600183613f86565b81518110612ca557612ca56136a0565b6020026020010151828281518110612cbf57612cbf6136a0565b602002602001015111612d0057816040517f1bc41b420000000000000000000000000000000000000000000000000000000081526004016107db91906141d9565b600101612c80565b6040518060400160405280600067ffffffffffffffff168152602001612d4b604051806060016040528060608152602001600060ff168152602001606081525090565b905290565b5080546000825590600052602060002090810190610a639190612e66565b508054612d7a9061361e565b6000825580601f10612d8a575050565b601f016020900490600052602060002090810190610a639190612e66565b828054828255906000526020600020908101928215612de3579160200282015b82811115612de3578251825591602001919060010190612dc8565b50612def929150612e66565b5090565b5080546000825560090290600052602060002090810190610a639190612e7b565b828054828255906000526020600020908101928215612e5a579160200282015b82811115612e5a5782518290612e4a9082613a11565b5091602001919060010190612e34565b50612def929150612f3c565b5b80821115612def5760008155600101612e67565b80821115612def5780547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560008181612eba6001830182612d6e565b612ec8600283016000612d50565b612ed6600383016000612d50565b612ee4600483016000612f59565b612ef2600583016000612f59565b612f00600683016000612d6e565b5050506007810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905560006008820155600901612e7b565b80821115612def576000612f508282612d6e565b50600101612f3c565b5080546000825590600052602060002090810190610a639190612f3c565b600060208284031215612f8957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f0457600080fd5b6000815180845260005b81811015612fdf57602081850181015186830182015201612fc3565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610f046020830184612fb9565b63ffffffff81168114610a6357600080fd5b803561304d81613030565b919050565b80356002811061304d57600080fd5b6000806040838503121561307457600080fd5b823561307f81613030565b915061308d60208401613052565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600281106130d5576130d5613096565b9052565b60008151808452602080850194506020840160005b8381101561310a578151875295820195908201906001016130ee565b509495945050505050565b60008282518085526020808601955060208260051b8401016020860160005b84811015613180577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe086840301895261316e838351612fb9565b98840198925090830190600101613134565b5090979650505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101561335c577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08984030185528151606081518186526131fb82870182516130c5565b8981015160806132168189018367ffffffffffffffff169052565b8a830151915060a061322c818a018460ff169052565b938301519360c0925061324a8984018667ffffffffffffffff169052565b818401519450610140915060e082818b015261326a6101a08b0187612fb9565b95508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0610100818c890301818d01526132a988856130d9565b97508587015195506101209350818c890301848d01526132c988876130d9565b9750828701519550818c890301858d01526132e48887613115565b975080870151955050808b8803016101608c01526133028786613115565b9650828601519550808b8803016101808c015250505050506133248282612fb9565b915050888201516133408a87018267ffffffffffffffff169052565b50908701519387019390935293860193908601906001016131b6565b509098975050505050505050565b60006020828403121561337c57600080fd5b8135610f0481613030565b600081516060845261339c60608501826130d9565b905060ff6020840151166020850152604083015184820360408601526133c28282612fb9565b95945050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b8381101561335c578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff16845287015187840187905261344887850182613387565b95880195935050908601906001016133f4565b60006020828403121561346d57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610f0457600080fd5b60008083601f8401126134a357600080fd5b50813567ffffffffffffffff8111156134bb57600080fd5b6020830191508360208260051b85010111156134d657600080fd5b9250929050565b600080600080604085870312156134f357600080fd5b843567ffffffffffffffff8082111561350b57600080fd5b61351788838901613491565b9096509450602087013591508082111561353057600080fd5b5061353d87828801613491565b95989497509550505050565b803567ffffffffffffffff8116811461304d57600080fd5b6000806000806000806080878903121561357a57600080fd5b863567ffffffffffffffff8082111561359257600080fd5b61359e8a838b01613491565b909850965060208901359150808211156135b757600080fd5b818901915089601f8301126135cb57600080fd5b8135818111156135da57600080fd5b8a60208285010111156135ec57600080fd5b60208301965080955050505061360460408801613549565b915061361260608801613042565b90509295509295509295565b600181811c9082168061363257607f821691505b60208210810361366b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156136e157600080fd5b610f0482613549565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261371e57600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261371e57600080fd5b604051610140810167ffffffffffffffff8111828210171561378057613780613671565b60405290565b60405160e0810167ffffffffffffffff8111828210171561378057613780613671565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156137f0576137f0613671565b604052919050565b600067ffffffffffffffff82111561381257613812613671565b5060051b60200190565b600082601f83011261382d57600080fd5b8135602061384261383d836137f8565b6137a9565b8083825260208201915060208460051b87010193508684111561386457600080fd5b602086015b848110156138805780358352918301918301613869565b509695505050505050565b803560ff8116811461304d57600080fd5b600082601f8301126138ad57600080fd5b813567ffffffffffffffff8111156138c7576138c7613671565b6138f860207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016137a9565b81815284602083860101111561390d57600080fd5b816020850160208301376000918101602001919091529392505050565b60006060823603121561393c57600080fd5b6040516060810167ffffffffffffffff828210818311171561396057613960613671565b81604052843591508082111561397557600080fd5b6139813683870161381c565b835261398f6020860161388b565b602084015260408501359150808211156139a857600080fd5b506139b53682860161389c565b60408301525092915050565b601f821115612a28576000816000526020600020601f850160051c810160208610156139ea5750805b601f850160051c820191505b81811015613a09578281556001016139f6565b505050505050565b815167ffffffffffffffff811115613a2b57613a2b613671565b613a3f81613a39845461361e565b846139c1565b602080601f831160018114613a925760008415613a5c5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a09565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613adf57888601518255948401946001909101908401613ac0565b5085821015613b1b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83168152604060208201526000613b4e6040830184613387565b949350505050565b600082601f830112613b6757600080fd5b81356020613b7761383d836137f8565b82815260059290921b84018101918181019086841115613b9657600080fd5b8286015b8481101561388057803567ffffffffffffffff811115613bba5760008081fd5b613bc88986838b010161389c565b845250918301918301613b9a565b60006020808385031215613be957600080fd5b823567ffffffffffffffff80821115613c0157600080fd5b818501915085601f830112613c1557600080fd5b8135613c2361383d826137f8565b81815260059190911b83018401908481019088831115613c4257600080fd5b8585015b83811015613dd057803585811115613c5d57600080fd5b8601610140818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215613c9257600080fd5b613c9a61375c565b613ca5898301613052565b8152613cb360408301613549565b89820152613cc36060830161388b565b6040820152613cd460808301613549565b606082015260a082013587811115613ceb57600080fd5b613cf98d8b8386010161389c565b60808301525060c082013587811115613d1157600080fd5b613d1f8d8b8386010161381c565b60a08301525060e082013587811115613d3757600080fd5b613d458d8b8386010161381c565b60c0830152506101008083013588811115613d5f57600080fd5b613d6d8e8c83870101613b56565b60e0840152506101208084013589811115613d8757600080fd5b613d958f8d83880101613b56565b8385015250610140840135915088821115613daf57600080fd5b613dbd8e8c8487010161389c565b9083015250845250918601918601613c46565b5098975050505050505050565b805161304d81613030565b600082601f830112613df957600080fd5b81516020613e0961383d836137f8565b8083825260208201915060208460051b870101935086841115613e2b57600080fd5b602086015b848110156138805780518352918301918301613e30565b600060208284031215613e5957600080fd5b815167ffffffffffffffff80821115613e7157600080fd5b9083019060e08286031215613e8557600080fd5b613e8d613786565b613e9683613ddd565b8152613ea460208401613ddd565b6020820152613eb560408401613ddd565b6040820152606083015160608201526080830151608082015260a083015182811115613ee057600080fd5b613eec87828601613de8565b60a08301525060c083015182811115613f0457600080fd5b613f1087828601613de8565b60c08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f7f57613f7f613f1f565b5060010190565b8181038181111561028857610288613f1f565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8181036000831280158383131683831282161715610a4b57610a4b613f1f565b600381106130d5576130d5613096565b604081016140068285613fe8565b610f046020830184613fe8565b67ffffffffffffffff818116838216019080821115610a4b57610a4b613f1f565b60ff8181168382160290811690818114610a4b57610a4b613f1f565b60ff818116838216019081111561028857610288613f1f565b60008282518085526020808601955060208260051b8401016020860160005b84811015613180577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030189526140c2838351612fb9565b98840198925090830190600101614088565b67ffffffffffffffff8d16815263ffffffff8c1660208201526140fa604082018c6130c5565b6101806060820152600061411261018083018c612fb9565b67ffffffffffffffff8b16608084015282810360a0840152614134818b6130d9565b905082810360c0840152614148818a6130d9565b905082810360e084015261415c8189614069565b90508281036101008401526141718188614069565b60ff8716610120850152905067ffffffffffffffff85166101408401528281036101608401526141a18185612fb9565b9f9e505050505050505050505050505050565b6040815260006141c760408301856130d9565b82810360208401526133c281856130d9565b602081526000610f0460208301846130d956fea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"capabilitiesRegistry\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainSelectorNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ChainSelectorNotSet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"EmptySet\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FChainMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FMustBePositive\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"length\",\"type\":\"uint256\"}],\"name\":\"InvalidConfigLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"currentState\",\"type\":\"uint8\"},{\"internalType\":\"enumCCIPConfigTypes.ConfigState\",\"name\":\"proposedState\",\"type\":\"uint8\"}],\"name\":\"InvalidConfigStateTransition\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPluginType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"p2pId\",\"type\":\"bytes32\"}],\"name\":\"NodeNotInRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonExistentConfigTransition\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"set\",\"type\":\"bytes32[]\"}],\"name\":\"NotASortedSet\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"subset\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"superset\",\"type\":\"bytes32[]\"}],\"name\":\"NotASubset\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"got\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"NotEnoughTransmitters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OfframpAddressCannotBeZero\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCapabilitiesRegistryCanCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"p2pIdsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signersLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"transmittersLength\",\"type\":\"uint256\"}],\"name\":\"P2PIdsLengthNotMatching\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyBootstrapP2PIds\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyOCR3Configs\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManySigners\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TooManyTransmitters\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"got\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"expected\",\"type\":\"uint64\"}],\"name\":\"WrongConfigCount\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigest\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"got\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"expected\",\"type\":\"bytes32\"}],\"name\":\"WrongConfigDigestBlueGreen\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"CapabilityConfigurationSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"}],\"name\":\"ChainConfigRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"indexed\":false,\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"name\":\"ChainConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64[]\",\"name\":\"chainSelectorRemoves\",\"type\":\"uint64[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"chainConfigAdds\",\"type\":\"tuple[]\"}],\"name\":\"applyChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"}],\"name\":\"beforeCapabilityConfigSet\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllChainConfigs\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes32[]\",\"name\":\"readers\",\"type\":\"bytes32[]\"},{\"internalType\":\"uint8\",\"name\":\"fChain\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"config\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfig\",\"name\":\"chainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structCCIPConfigTypes.ChainConfigInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"name\":\"getCapabilityConfiguration\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"configuration\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCapabilityRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint32\",\"name\":\"donId\",\"type\":\"uint32\"},{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"}],\"name\":\"getOCRConfig\",\"outputs\":[{\"components\":[{\"components\":[{\"internalType\":\"enumInternal.OCRPluginType\",\"name\":\"pluginType\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint8\",\"name\":\"F\",\"type\":\"uint8\"},{\"internalType\":\"uint64\",\"name\":\"offchainConfigVersion\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"offrampAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[]\",\"name\":\"bootstrapP2PIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"p2pIds\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes[]\",\"name\":\"signers\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes[]\",\"name\":\"transmitters\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"offchainConfig\",\"type\":\"bytes\"}],\"internalType\":\"structCCIPConfigTypes.OCR3Config\",\"name\":\"config\",\"type\":\"tuple\"},{\"internalType\":\"uint64\",\"name\":\"configCount\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"internalType\":\"structCCIPConfigTypes.OCR3ConfigWithMeta[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60a06040523480156200001157600080fd5b50604051620043d7380380620043d78339810160408190526200003491620001a6565b33806000816200008b5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000be57620000be81620000fb565b5050506001600160a01b038116620000e9576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b0316608052620001d8565b336001600160a01b03821603620001555760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000082565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b600060208284031215620001b957600080fd5b81516001600160a01b0381168114620001d157600080fd5b9392505050565b6080516141d6620002016000396000818160f801528181610e96015261112b01526141d66000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c80638318ed5d11610081578063f2fde38b1161005b578063f2fde38b14610204578063f442c89a14610217578063fba64a7c1461022a57600080fd5b80638318ed5d146101b05780638da5cb5b146101d1578063ddc042a8146101ef57600080fd5b8063181f5a77116100b2578063181f5a771461013d5780634bd0473f1461018657806379ba5097146101a657600080fd5b806301ffc9a7146100ce578063020330e6146100f6575b600080fd5b6100e16100dc366004612fbf565b61023d565b60405190151581526020015b60405180910390f35b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100ed565b6101796040518060400160405280601481526020017f43434950436f6e66696720312e362e302d64657600000000000000000000000081525081565b6040516100ed9190613065565b6101996101943660046130a9565b6102d6565b6040516100ed91906131d5565b6101ae6107a6565b005b6101796101be3660046133b2565b5060408051602081019091526000815290565b60005473ffffffffffffffffffffffffffffffffffffffff16610118565b6101f76108a8565b6040516100ed9190613413565b6101ae6102123660046134a3565b610a9a565b6101ae610225366004613525565b610aae565b6101ae6102383660046135a9565b610e7e565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f78bea7210000000000000000000000000000000000000000000000000000000014806102d057507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b63ffffffff82166000908152600560205260408120606091836001811115610300576103006130de565b6001811115610311576103116130de565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561079a57600084815260209020604080516101a08101909152600984029091018054829060608201908390829060ff166001811115610384576103846130de565b6001811115610395576103956130de565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a01000000000000000000009091041660608201526001820180546080909201916103ed90613666565b80601f016020809104026020016040519081016040528092919081815260200182805461041990613666565b80156104665780601f1061043b57610100808354040283529160200191610466565b820191906000526020600020905b81548152906001019060200180831161044957829003601f168201915b50505050508152602001600282018054806020026020016040519081016040528092919081815260200182805480156104be57602002820191906000526020600020905b8154815260200190600101908083116104aa575b505050505081526020016003820180548060200260200160405190810160405280929190818152602001828054801561051657602002820191906000526020600020905b815481526020019060010190808311610502575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156105f057838290600052602060002001805461056390613666565b80601f016020809104026020016040519081016040528092919081815260200182805461058f90613666565b80156105dc5780601f106105b1576101008083540402835291602001916105dc565b820191906000526020600020905b8154815290600101906020018083116105bf57829003601f168201915b505050505081526020019060010190610544565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156106c957838290600052602060002001805461063c90613666565b80601f016020809104026020016040519081016040528092919081815260200182805461066890613666565b80156106b55780601f1061068a576101008083540402835291602001916106b5565b820191906000526020600020905b81548152906001019060200180831161069857829003601f168201915b50505050508152602001906001019061061d565b5050505081526020016006820180546106e190613666565b80601f016020809104026020016040519081016040528092919081815260200182805461070d90613666565b801561075a5780601f1061072f5761010080835404028352916020019161075a565b820191906000526020600020905b81548152906001019060200180831161073d57829003601f168201915b505050919092525050508152600782015467ffffffffffffffff16602080830191909152600890920154604090910152908252600192909201910161033f565b50505050905092915050565b60015473ffffffffffffffffffffffffffffffffffffffff16331461082c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b606060006108b66003610f3f565b905060006108c46003610f53565b67ffffffffffffffff8111156108dc576108dc6136b9565b60405190808252806020026020018201604052801561091557816020015b610902612d50565b8152602001906001900390816108fa5790505b50905060005b8251811015610a93576000838281518110610938576109386136e8565b60209081029190910181015160408051808201825267ffffffffffffffff8316808252600090815260028552829020825181546080818802830181019095526060820181815295975092958601949093919284928491908401828280156109be57602002820191906000526020600020905b8154815260200190600101908083116109aa575b5050509183525050600182015460ff1660208201526002820180546040909201916109e890613666565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1490613666565b8015610a615780601f10610a3657610100808354040283529160200191610a61565b820191906000526020600020905b815481529060010190602001808311610a4457829003601f168201915b505050505081525050815250838381518110610a7f57610a7f6136e8565b60209081029190910101525060010161091b565b5092915050565b610aa2610f5d565b610aab81610fe0565b50565b610ab6610f5d565b60005b83811015610c9c57610afd858583818110610ad657610ad66136e8565b9050602002016020810190610aeb9190613717565b60039067ffffffffffffffff166110d5565b610b6757848482818110610b1357610b136136e8565b9050602002016020810190610b289190613717565b6040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610823565b60026000868684818110610b7d57610b7d6136e8565b9050602002016020810190610b929190613717565b67ffffffffffffffff1681526020810191909152604001600090812090610bb98282612d98565b6001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055610bf1600283016000612db6565b5050610c2f858583818110610c0857610c086136e8565b9050602002016020810190610c1d9190613717565b60039067ffffffffffffffff166110ed565b507f2a680691fef3b2d105196805935232c661ce703e92d464ef0b94a7bc62d714f0858583818110610c6357610c636136e8565b9050602002016020810190610c789190613717565b60405167ffffffffffffffff909116815260200160405180910390a1600101610ab9565b5060005b81811015610e77576000838383818110610cbc57610cbc6136e8565b9050602002810190610cce9190613732565b610cdc906020810190613770565b610ce590613972565b80519091506000858585818110610cfe57610cfe6136e8565b9050602002810190610d109190613732565b610d1e906020810190613717565b905060005b8251811015610d5657610d4e838281518110610d4157610d416136e8565b60200260200101516110f9565b600101610d23565b50826020015160ff16600003610d98576040517fa9b3766e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff81166000908152600260209081526040909120845180518693610dc8928492910190612df0565b5060208201516001820180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff90921691909117905560408201516002820190610e159082613a59565b50610e2f91506003905067ffffffffffffffff8316611212565b507f05dd57854af2c291a94ea52e7c43d80bc3be7fa73022f98b735dea86642fa5e08184604051610e61929190613b73565b60405180910390a1505050806001019050610ca0565b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610eed576040517fac7a7efd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610efb84860186613c1e565b9050600080610f098361121e565b8151919350915015610f2157610f2184600084611477565b805115610f3457610f3484600183611477565b505050505050505050565b60606000610f4c83611c58565b9392505050565b60006102d0825490565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610823565b565b3373ffffffffffffffffffffffffffffffffffffffff82160361105f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610823565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60008181526001830160205260408120541515610f4c565b6000610f4c8383611cb4565b6040517f50c946fe000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906350c946fe90602401600060405180830381865afa158015611187573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526111cd9190810190613e8f565b608081015190915061120e576040517f8907a4fa00000000000000000000000000000000000000000000000000000000815260048101839052602401610823565b5050565b6000610f4c8383611da7565b606080600460ff1683511115611260576040517f8854586400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160028082526060820190925290816020015b6112e46040805161014081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161127657505060408051600280825260608201909252919350602082015b61137c6040805161014081019091528060008152602001600067ffffffffffffffff168152602001600060ff168152602001600067ffffffffffffffff1681526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b81526020019060019003908161130e57905050905060008060005b855181101561146a5760008682815181106113b4576113b46136e8565b60200260200101516000015160018111156113d1576113d16130de565b0361141e578581815181106113e8576113e86136e8565b6020026020010151858481518110611402576114026136e8565b60200260200101819052508261141790613f96565b9250611462565b858181518110611430576114306136e8565b602002602001015184838151811061144a5761144a6136e8565b60200260200101819052508161145f90613f96565b91505b600101611397565b5090835281529092909150565b63ffffffff831660009081526005602052604081208184600181111561149f5761149f6130de565b60018111156114b0576114b06130de565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561193957600084815260209020604080516101a08101909152600984029091018054829060608201908390829060ff166001811115611523576115236130de565b6001811115611534576115346130de565b8152815467ffffffffffffffff61010082048116602084015260ff690100000000000000000083041660408401526a010000000000000000000090910416606082015260018201805460809092019161158c90613666565b80601f01602080910402602001604051908101604052809291908181526020018280546115b890613666565b80156116055780601f106115da57610100808354040283529160200191611605565b820191906000526020600020905b8154815290600101906020018083116115e857829003601f168201915b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561165d57602002820191906000526020600020905b815481526020019060010190808311611649575b50505050508152602001600382018054806020026020016040519081016040528092919081815260200182805480156116b557602002820191906000526020600020905b8154815260200190600101908083116116a1575b5050505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b8282101561178f57838290600052602060002001805461170290613666565b80601f016020809104026020016040519081016040528092919081815260200182805461172e90613666565b801561177b5780601f106117505761010080835404028352916020019161177b565b820191906000526020600020905b81548152906001019060200180831161175e57829003601f168201915b5050505050815260200190600101906116e3565b50505050815260200160058201805480602002602001604051908101604052809291908181526020016000905b828210156118685783829060005260206000200180546117db90613666565b80601f016020809104026020016040519081016040528092919081815260200182805461180790613666565b80156118545780601f1061182957610100808354040283529160200191611854565b820191906000526020600020905b81548152906001019060200180831161183757829003601f168201915b5050505050815260200190600101906117bc565b50505050815260200160068201805461188090613666565b80601f01602080910402602001604051908101604052809291908181526020018280546118ac90613666565b80156118f95780601f106118ce576101008083540402835291602001916118f9565b820191906000526020600020905b8154815290600101906020018083116118dc57829003601f168201915b505050919092525050508152600782015467ffffffffffffffff1660208083019190915260089092015460409091015290825260019290920191016114de565b505050509050600061194b8251611df6565b905060006119598451611df6565b90506119658282611e48565b60006119748785878686611f04565b905061198084826122f0565b63ffffffff87166000908152600560205260408120908760018111156119a8576119a86130de565b60018111156119b9576119b96130de565b815260200190815260200160002060006119d39190612e3b565b60005b8151811015611c4e5763ffffffff8816600090815260056020526040812090886001811115611a0757611a076130de565b6001811115611a1857611a186130de565b8152602001908152602001600020828281518110611a3857611a386136e8565b6020908102919091018101518254600181810185556000948552929093208151805160099095029091018054929490939192849283917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016908381811115611aa257611aa26130de565b021790555060208201518154604084015160608501517fffffffffffffffffffffffffffffffffffffffffffff000000000000000000ff90921661010067ffffffffffffffff948516027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000060ff90921691909102177fffffffffffffffffffffffffffff0000000000000000ffffffffffffffffffff166a0100000000000000000000929091169190910217815560808201516001820190611b719082613a59565b5060a08201518051611b8d916002840191602090910190612df0565b5060c08201518051611ba9916003840191602090910190612df0565b5060e08201518051611bc5916004840191602090910190612e5c565b506101008201518051611be2916005840191602090910190612e5c565b506101208201516006820190611bf89082613a59565b50505060208201516007820180547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff9092169190911790556040909101516008909101556001016119d6565b5050505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611ca857602002820191906000526020600020905b815481526020019060010190808311611c94575b50505050509050919050565b60008181526001830160205260408120548015611d9d576000611cd8600183613fce565b8554909150600090611cec90600190613fce565b9050818114611d51576000866000018281548110611d0c57611d0c6136e8565b9060005260206000200154905080876000018481548110611d2f57611d2f6136e8565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611d6257611d62613fe1565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506102d0565b60009150506102d0565b6000818152600183016020526040812054611dee575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556102d0565b5060006102d0565b60006002821115611e36576040517f3e47852600000000000000000000000000000000000000000000000000000000815260048101839052602401610823565b8160028111156102d0576102d06130de565b6000826002811115611e5c57611e5c6130de565b826002811115611e6e57611e6e6130de565b611e789190614010565b90508060011480611ec45750807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff148015611ec457506002836002811115611ec257611ec26130de565b145b15611ece57505050565b82826040517f0a6b675b000000000000000000000000000000000000000000000000000000008152600401610823929190614040565b60606000845167ffffffffffffffff811115611f2257611f226136b9565b604051908082528060200260200182016040528015611f4b578160200160208202803683370190505b5090506000846002811115611f6257611f626130de565b148015611f8057506001836002811115611f7e57611f7e6130de565b145b15611fc157600181600081518110611f9a57611f9a6136e8565b602002602001019067ffffffffffffffff16908167ffffffffffffffff1681525050612129565b6001846002811115611fd557611fd56130de565b148015611ff357506002836002811115611ff157611ff16130de565b145b1561208a578560008151811061200b5761200b6136e8565b6020026020010151602001518160008151811061202a5761202a6136e8565b602002602001019067ffffffffffffffff16908167ffffffffffffffff16815250508560008151811061205f5761205f6136e8565b6020026020010151602001516001612077919061405b565b81600181518110611f9a57611f9a6136e8565b600284600281111561209e5761209e6130de565b1480156120bc575060018360028111156120ba576120ba6130de565b145b156120f357856001815181106120d4576120d46136e8565b60200260200101516020015181600081518110611f9a57611f9a6136e8565b83836040517f0a6b675b000000000000000000000000000000000000000000000000000000008152600401610823929190614040565b6000855167ffffffffffffffff811115612145576121456136b9565b6040519080825280602002602001820160405280156121fb57816020015b604080516101a081018252600060608083018281526080840183905260a0840183905260c0840183905260e084018290526101008401829052610120840182905261014084018290526101608401829052610180840191909152825260208083018290529282015282527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9092019101816121635790505b50905060005b82518110156122e45761222c87828151811061221f5761221f6136e8565b602002602001015161266f565b6040518060600160405280888381518110612249576122496136e8565b60200260200101518152602001848381518110612268576122686136e8565b602002602001015167ffffffffffffffff1681526020016122bc8b868581518110612295576122956136e8565b60200260200101518b86815181106122af576122af6136e8565b6020026020010151612a75565b8152508282815181106122d1576122d16136e8565b6020908102919091010152600101612201565b50979650505050505050565b81518151811580156123025750806001145b156123a4578260008151811061231a5761231a6136e8565b60200260200101516020015167ffffffffffffffff1660011461239e578260008151811061234a5761234a6136e8565b60209081029190910181015101516040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff909116600482015260016024820152604401610823565b50505050565b8160011480156123b45750806002145b1561256a57836000815181106123cc576123cc6136e8565b602002602001015160400151836000815181106123eb576123eb6136e8565b60200260200101516040015114612477578260008151811061240f5761240f6136e8565b6020026020010151604001518460008151811061242e5761242e6136e8565b6020026020010151604001516040517fc7ccdd7f000000000000000000000000000000000000000000000000000000008152600401610823929190918252602082015260400190565b8360008151811061248a5761248a6136e8565b60200260200101516020015160016124a2919061405b565b67ffffffffffffffff16836001815181106124bf576124bf6136e8565b60200260200101516020015167ffffffffffffffff161461239e57826001815181106124ed576124ed6136e8565b6020026020010151602001518460008151811061250c5761250c6136e8565b6020026020010151602001516001612524919061405b565b6040517fc1658eb800000000000000000000000000000000000000000000000000000000815267ffffffffffffffff928316600482015291166024820152604401610823565b81600214801561257a5750806001145b1561263d5783600181518110612592576125926136e8565b602002602001015160400151836000815181106125b1576125b16136e8565b6020026020010151604001511461239e57826000815181106125d5576125d56136e8565b602002602001015160400151846001815181106125f4576125f46136e8565b6020026020010151604001516040517f9e975670000000000000000000000000000000000000000000000000000000008152600401610823929190918252602082015260400190565b6040517f1f1b2bb600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806020015167ffffffffffffffff166000036126b7576040517f698cf8e000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815160018111156126cc576126cc6130de565b141580156126ed57506001815160018111156126ea576126ea6130de565b14155b15612724576040517f3302dbd700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806080015151600003612763576040517f358c192700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b602081015161277e9060039067ffffffffffffffff166110d5565b6127c65760208101516040517f1bd4d2d200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff9091166004820152602401610823565b60e081015151601f1015612806576040517f1b925da600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61010081015151601f1015612847576040517f645960ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60208082015167ffffffffffffffff166000908152600290915260408120600101546128779060ff16600361407c565b612882906001614098565b60ff169050808261010001515110156128d957610100820151516040517f548dd21f000000000000000000000000000000000000000000000000000000008152600481019190915260248101829052604401610823565b816040015160ff1660000361291a576040517f39d1a4d000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604082015161292a90600361407c565b60ff168260e00151511161296a576040517f4856694e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160e00151518260c001515114158061298e5750816101000151518260c001515114155b156129e95760c08201515160e083015151610100840151516040517fba900f6d000000000000000000000000000000000000000000000000000000008152600481019390935260248301919091526044820152606401610823565b8160c00151518260a00151511115612a2d576040517f8473d80700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612a3f8260a001518360c00151612b4a565b60005b8260e0015151811015612a7057612a688360c001518281518110610d4157610d416136e8565b600101612a42565b505050565b60008082602001518584600001518560800151878760a001518860c001518960e001518a61010001518b604001518c606001518d6101200151604051602001612ac99c9b9a999897969594939291906140b1565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905280516020909101207dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff167e0a000000000000000000000000000000000000000000000000000000000000179150509392505050565b81511580612b5757508051155b15612b8e576040517fe249684100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612b9782612cc5565b612ba081612cc5565b6000805b835182108015612bb45750825181105b15612c8657828181518110612bcb57612bcb6136e8565b6020026020010151848381518110612be557612be56136e8565b60200260200101511115612c0357612bfc81613f96565b9050612ba4565b828181518110612c1557612c156136e8565b6020026020010151848381518110612c2f57612c2f6136e8565b602002602001015103612c5057612c4582613f96565b9150612bfc81613f96565b83836040517fd671700c000000000000000000000000000000000000000000000000000000008152600401610823929190614191565b835182101561239e5783836040517fd671700c000000000000000000000000000000000000000000000000000000008152600401610823929190614191565b60015b815181101561120e5781612cdd600183613fce565b81518110612ced57612ced6136e8565b6020026020010151828281518110612d0757612d076136e8565b602002602001015111612d4857816040517f1bc41b4200000000000000000000000000000000000000000000000000000000815260040161082391906141b6565b600101612cc8565b6040518060400160405280600067ffffffffffffffff168152602001612d93604051806060016040528060608152602001600060ff168152602001606081525090565b905290565b5080546000825590600052602060002090810190610aab9190612eae565b508054612dc290613666565b6000825580601f10612dd2575050565b601f016020900490600052602060002090810190610aab9190612eae565b828054828255906000526020600020908101928215612e2b579160200282015b82811115612e2b578251825591602001919060010190612e10565b50612e37929150612eae565b5090565b5080546000825560090290600052602060002090810190610aab9190612ec3565b828054828255906000526020600020908101928215612ea2579160200282015b82811115612ea25782518290612e929082613a59565b5091602001919060010190612e7c565b50612e37929150612f84565b5b80821115612e375760008155600101612eaf565b80821115612e375780547fffffffffffffffffffffffffffff00000000000000000000000000000000000016815560008181612f026001830182612db6565b612f10600283016000612d98565b612f1e600383016000612d98565b612f2c600483016000612fa1565b612f3a600583016000612fa1565b612f48600683016000612db6565b5050506007810180547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016905560006008820155600901612ec3565b80821115612e37576000612f988282612db6565b50600101612f84565b5080546000825590600052602060002090810190610aab9190612f84565b600060208284031215612fd157600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f4c57600080fd5b6000815180845260005b818110156130275760208185018101518683018201520161300b565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610f4c6020830184613001565b63ffffffff81168114610aab57600080fd5b803561309581613078565b919050565b80356002811061309557600080fd5b600080604083850312156130bc57600080fd5b82356130c781613078565b91506130d56020840161309a565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6002811061311d5761311d6130de565b9052565b60008151808452602080850194506020840160005b8381101561315257815187529582019590820190600101613136565b509495945050505050565b60008282518085526020808601955060208260051b8401016020860160005b848110156131c8577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030189526131b6838351613001565b9884019892509083019060010161317c565b5090979650505050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156133a4577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0898403018552815160608151818652613243828701825161310d565b89810151608061325e8189018367ffffffffffffffff169052565b8a830151915060a0613274818a018460ff169052565b938301519360c092506132928984018667ffffffffffffffff169052565b818401519450610140915060e082818b01526132b26101a08b0187613001565b95508185015191507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa0610100818c890301818d01526132f18885613121565b97508587015195506101209350818c890301848d01526133118887613121565b9750828701519550818c890301858d015261332c888761315d565b975080870151955050808b8803016101608c015261334a878661315d565b9650828601519550808b8803016101808c0152505050505061336c8282613001565b915050888201516133888a87018267ffffffffffffffff169052565b50908701519387019390935293860193908601906001016131fe565b509098975050505050505050565b6000602082840312156133c457600080fd5b8135610f4c81613078565b60008151606084526133e46060850182613121565b905060ff60208401511660208501526040830151848203604086015261340a8282613001565b95945050505050565b600060208083018184528085518083526040925060408601915060408160051b87010184880160005b838110156133a4578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805167ffffffffffffffff168452870151878401879052613490878501826133cf565b958801959350509086019060010161343c565b6000602082840312156134b557600080fd5b813573ffffffffffffffffffffffffffffffffffffffff81168114610f4c57600080fd5b60008083601f8401126134eb57600080fd5b50813567ffffffffffffffff81111561350357600080fd5b6020830191508360208260051b850101111561351e57600080fd5b9250929050565b6000806000806040858703121561353b57600080fd5b843567ffffffffffffffff8082111561355357600080fd5b61355f888389016134d9565b9096509450602087013591508082111561357857600080fd5b50613585878288016134d9565b95989497509550505050565b803567ffffffffffffffff8116811461309557600080fd5b600080600080600080608087890312156135c257600080fd5b863567ffffffffffffffff808211156135da57600080fd5b6135e68a838b016134d9565b909850965060208901359150808211156135ff57600080fd5b818901915089601f83011261361357600080fd5b81358181111561362257600080fd5b8a602082850101111561363457600080fd5b60208301965080955050505061364c60408801613591565b915061365a6060880161308a565b90509295509295509295565b600181811c9082168061367a57607f821691505b6020821081036136b3577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006020828403121561372957600080fd5b610f4c82613591565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261376657600080fd5b9190910192915050565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa183360301811261376657600080fd5b604051610140810167ffffffffffffffff811182821017156137c8576137c86136b9565b60405290565b60405160e0810167ffffffffffffffff811182821017156137c8576137c86136b9565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613838576138386136b9565b604052919050565b600067ffffffffffffffff82111561385a5761385a6136b9565b5060051b60200190565b600082601f83011261387557600080fd5b8135602061388a61388583613840565b6137f1565b8083825260208201915060208460051b8701019350868411156138ac57600080fd5b602086015b848110156138c857803583529183019183016138b1565b509695505050505050565b803560ff8116811461309557600080fd5b600082601f8301126138f557600080fd5b813567ffffffffffffffff81111561390f5761390f6136b9565b61394060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016137f1565b81815284602083860101111561395557600080fd5b816020850160208301376000918101602001919091529392505050565b60006060823603121561398457600080fd5b6040516060810167ffffffffffffffff82821081831117156139a8576139a86136b9565b8160405284359150808211156139bd57600080fd5b6139c936838701613864565b83526139d7602086016138d3565b602084015260408501359150808211156139f057600080fd5b506139fd368286016138e4565b60408301525092915050565b601f821115612a70576000816000526020600020601f850160051c81016020861015613a325750805b601f850160051c820191505b81811015613a5157828155600101613a3e565b505050505050565b815167ffffffffffffffff811115613a7357613a736136b9565b613a8781613a818454613666565b84613a09565b602080601f831160018114613ada5760008415613aa45750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a51565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b82811015613b2757888601518255948401946001909101908401613b08565b5085821015613b6357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b67ffffffffffffffff83168152604060208201526000613b9660408301846133cf565b949350505050565b600082601f830112613baf57600080fd5b81356020613bbf61388583613840565b82815260059290921b84018101918181019086841115613bde57600080fd5b8286015b848110156138c857803567ffffffffffffffff811115613c025760008081fd5b613c108986838b01016138e4565b845250918301918301613be2565b60006020808385031215613c3157600080fd5b823567ffffffffffffffff80821115613c4957600080fd5b818501915085601f830112613c5d57600080fd5b8135613c6b61388582613840565b81815260059190911b83018401908481019088831115613c8a57600080fd5b8585015b83811015613e1857803585811115613ca557600080fd5b8601610140818c037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0011215613cda57600080fd5b613ce26137a4565b613ced89830161309a565b8152613cfb60408301613591565b89820152613d0b606083016138d3565b6040820152613d1c60808301613591565b606082015260a082013587811115613d3357600080fd5b613d418d8b838601016138e4565b60808301525060c082013587811115613d5957600080fd5b613d678d8b83860101613864565b60a08301525060e082013587811115613d7f57600080fd5b613d8d8d8b83860101613864565b60c0830152506101008083013588811115613da757600080fd5b613db58e8c83870101613b9e565b60e0840152506101208084013589811115613dcf57600080fd5b613ddd8f8d83880101613b9e565b8385015250610140840135915088821115613df757600080fd5b613e058e8c848701016138e4565b9083015250845250918601918601613c8e565b5098975050505050505050565b805161309581613078565b600082601f830112613e4157600080fd5b81516020613e5161388583613840565b8083825260208201915060208460051b870101935086841115613e7357600080fd5b602086015b848110156138c85780518352918301918301613e78565b600060208284031215613ea157600080fd5b815167ffffffffffffffff80821115613eb957600080fd5b9083019060e08286031215613ecd57600080fd5b613ed56137ce565b613ede83613e25565b8152613eec60208401613e25565b6020820152613efd60408401613e25565b6040820152606083015160608201526080830151608082015260a083015182811115613f2857600080fd5b613f3487828601613e30565b60a08301525060c083015182811115613f4c57600080fd5b613f5887828601613e30565b60c08301525095945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613fc757613fc7613f67565b5060010190565b818103818111156102d0576102d0613f67565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b8181036000831280158383131683831282161715610a9357610a93613f67565b6003811061311d5761311d6130de565b6040810161404e8285614030565b610f4c6020830184614030565b67ffffffffffffffff818116838216019080821115610a9357610a93613f67565b60ff8181168382160290811690818114610a9357610a93613f67565b60ff81811683821601908111156102d0576102d0613f67565b67ffffffffffffffff8d16815263ffffffff8c1660208201526140d7604082018c61310d565b610180606082015260006140ef61018083018c613001565b67ffffffffffffffff8b16608084015282810360a0840152614111818b613121565b905082810360c0840152614125818a613121565b905082810360e0840152614139818961315d565b905082810361010084015261414e818861315d565b60ff8716610120850152905067ffffffffffffffff851661014084015282810361016084015261417e8185613001565b9f9e505050505050505050505050505050565b6040815260006141a46040830185613121565b828103602084015261340a8185613121565b602081526000610f4c602083018461312156fea164736f6c6343000818000a",
}
var CCIPConfigABI = CCIPConfigMetaData.ABI
@@ -245,6 +245,28 @@ func (_CCIPConfig *CCIPConfigCallerSession) GetCapabilityConfiguration(arg0 uint
return _CCIPConfig.Contract.GetCapabilityConfiguration(&_CCIPConfig.CallOpts, arg0)
}
+func (_CCIPConfig *CCIPConfigCaller) GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error) {
+ var out []interface{}
+ err := _CCIPConfig.contract.Call(opts, &out, "getCapabilityRegistry")
+
+ if err != nil {
+ return *new(common.Address), err
+ }
+
+ out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
+
+ return out0, err
+
+}
+
+func (_CCIPConfig *CCIPConfigSession) GetCapabilityRegistry() (common.Address, error) {
+ return _CCIPConfig.Contract.GetCapabilityRegistry(&_CCIPConfig.CallOpts)
+}
+
+func (_CCIPConfig *CCIPConfigCallerSession) GetCapabilityRegistry() (common.Address, error) {
+ return _CCIPConfig.Contract.GetCapabilityRegistry(&_CCIPConfig.CallOpts)
+}
+
func (_CCIPConfig *CCIPConfigCaller) GetOCRConfig(opts *bind.CallOpts, donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error) {
var out []interface{}
err := _CCIPConfig.contract.Call(opts, &out, "getOCRConfig", donId, pluginType)
@@ -1051,6 +1073,8 @@ type CCIPConfigInterface interface {
GetCapabilityConfiguration(opts *bind.CallOpts, arg0 uint32) ([]byte, error)
+ GetCapabilityRegistry(opts *bind.CallOpts) (common.Address, error)
+
GetOCRConfig(opts *bind.CallOpts, donId uint32, pluginType uint8) ([]CCIPConfigTypesOCR3ConfigWithMeta, error)
Owner(opts *bind.CallOpts) (common.Address, error)
diff --git a/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp/evm_2_evm_multi_onramp.go b/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp/evm_2_evm_multi_onramp.go
index e8c07cb93d..7b6971d5ec 100644
--- a/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp/evm_2_evm_multi_onramp.go
+++ b/core/gethwrappers/ccip/generated/evm_2_evm_multi_onramp/evm_2_evm_multi_onramp.go
@@ -84,7 +84,7 @@ type InternalRampTokenAmount struct {
}
var EVM2EVMMultiOnRampMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OnlyCallableByOwnerOrAdmin\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"}],\"name\":\"FeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeTokenWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPoolV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CannotSendZeroTokens\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"}],\"name\":\"CursedByRMN\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"GetSupportedTokensFunctionalityRemovedCheckAdminRegistry\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfig\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MustBeCalledByRouter\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RouterMustSetOriginalSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"UnsupportedToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"messageId\",\"type\":\"bytes32\"},{\"internalType\":\"uint64\",\"name\":\"sourceChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"sequenceNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"nonce\",\"type\":\"uint64\"}],\"internalType\":\"structInternal.RampMessageHeader\",\"name\":\"header\",\"type\":\"tuple\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"}],\"indexed\":false,\"internalType\":\"structInternal.EVM2AnyRampMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"CCIPSendRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"indexed\":false,\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"ConfigSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"feeValueJuels\",\"type\":\"uint256\"}],\"name\":\"FeePaid\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"FeeTokenWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"originalSender\",\"type\":\"address\"}],\"name\":\"forwardFromRouter\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getDynamicConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getExpectedNextSequenceNumber\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"},{\"internalType\":\"contractIERC20\",\"name\":\"sourceToken\",\"type\":\"address\"}],\"name\":\"getPoolBySourceToken\",\"outputs\":[{\"internalType\":\"contractIPoolV1\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"chainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"rmnProxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nonceManager\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"tokenAdminRegistry\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"getSupportedTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"priceRegistry\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"messageValidator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"feeAggregator\",\"type\":\"address\"}],\"internalType\":\"structEVM2EVMMultiOnRamp.DynamicConfig\",\"name\":\"dynamicConfig\",\"type\":\"tuple\"}],\"name\":\"setDynamicConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFeeTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
Bin: "0x6101006040523480156200001257600080fd5b5060405162003161380380620031618339810160408190526200003591620003db565b33806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf816200017a565b505082516001600160401b031615905080620000e6575060208201516001600160a01b0316155b80620000fd575060408201516001600160a01b0316155b8062000114575060608201516001600160a01b0316155b1562000133576040516306b7c75960e31b815260040160405180910390fd5b81516001600160401b031660805260208201516001600160a01b0390811660a0526040830151811660c05260608301511660e052620001728162000225565b5050620004d1565b336001600160a01b03821603620001d45760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60208101516001600160a01b031615806200024b575060608101516001600160a01b0316155b156200026a576040516306b7c75960e31b815260040160405180910390fd5b8051600280546001600160a01b03199081166001600160a01b0393841617909155602080840180516003805485169186169190911790556040808601805160048054871691881691909117905560608088018051600580549098169089161790965582516080808201855280516001600160401b031680835260a080518b16848a0190815260c080518d16868a0190815260e080518f169789019788528a5195865292518e169b85019b909b5299518c169783019790975292518a169381019390935289518916908301529351871693810193909352518516928201929092529151909216918101919091527f23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e32906101000160405180910390a150565b604051608081016001600160401b0381118282101715620003b857634e487b7160e01b600052604160045260246000fd5b60405290565b80516001600160a01b0381168114620003d657600080fd5b919050565b600080828403610100811215620003f157600080fd5b60808112156200040057600080fd5b6200040a62000387565b84516001600160401b03811681146200042257600080fd5b81526200043260208601620003be565b60208201526200044560408601620003be565b60408201526200045860608601620003be565b606082015292506080607f19820112156200047257600080fd5b506200047d62000387565b6200048b60808501620003be565b81526200049b60a08501620003be565b6020820152620004ae60c08501620003be565b6040820152620004c160e08501620003be565b6060820152809150509250929050565b60805160a05160c05160e051612c176200054a600039600081816101c00152818161081b015261147901526000818161018401528181610d3801526114520152600081816101480152818161044e015261142801526000818161011801528181610c55015281816110ee01526113fb0152612c176000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c806379ba50971161008c578063a6f3ab6c11610066578063a6f3ab6c14610391578063df0aa9e9146103a4578063f2fde38b146103b7578063fbca3b74146103ca57600080fd5b806379ba50971461033f5780638da5cb5b146103475780639041be3d1461036557600080fd5b80633a019940116100bd5780633a0199401461027d57806348a98aa4146102875780637437ff9f146102bf57600080fd5b806306285c69146100e4578063181f5a771461021357806320487ded1461025c575b600080fd5b6101fd60408051608081018252600080825260208201819052918101829052606081019190915260405180608001604052807f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16815250905090565b60405161020a9190611cf8565b60405180910390f35b61024f6040518060400160405280601c81526020017f45564d3245564d4d756c74694f6e52616d7020312e362e302d6465760000000081525081565b60405161020a9190611dbd565b61026f61026a366004611dfe565b6103ea565b60405190815260200161020a565b6102856105a3565b005b61029a610295366004611e70565b6107d3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020a565b610332604080516080810182526000808252602082018190529181018290526060810191909152506040805160808101825260025473ffffffffffffffffffffffffffffffffffffffff908116825260035481166020830152600454811692820192909252600554909116606082015290565b60405161020a9190611ea9565b610285610888565b60005473ffffffffffffffffffffffffffffffffffffffff1661029a565b610378610373366004611ef2565b610985565b60405167ffffffffffffffff909116815260200161020a565b61028561039f366004611fc6565b6109ae565b61026f6103b236600461204b565b6109c2565b6102856103c53660046120b7565b6111a2565b6103dd6103d8366004611ef2565b6111b3565b60405161020a91906120d4565b6040517f2cbc26bb00000000000000000000000000000000000000000000000000000000815277ffffffffffffffff00000000000000000000000000000000608084901b16600482015260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690632cbc26bb90602401602060405180830381865afa158015610495573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b9919061213e565b15610501576040517ffdbd6a7200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff841660048201526024015b60405180910390fd5b6003546040517fd8694ccd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d8694ccd90610559908690869060040161226d565b602060405180830381865afa158015610576573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906123b6565b90505b92915050565b600354604080517fcdc73d51000000000000000000000000000000000000000000000000000000008152905160009273ffffffffffffffffffffffffffffffffffffffff169163cdc73d5191600480830192869291908290030181865afa158015610612573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261065891908101906123cf565b60055490915073ffffffffffffffffffffffffffffffffffffffff1660005b82518110156107ce57600083828151811061069457610694612481565b60209081029190910101516040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561070f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073391906123b6565b905080156107c45761075c73ffffffffffffffffffffffffffffffffffffffff831685836111e7565b8173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f508d7d183612c18fc339b42618912b9fa3239f631dd7ec0671f950200a0fa66e836040516107bb91815260200190565b60405180910390a35b5050600101610677565b505050565b6040517fbbe4f6db00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063bbe4f6db90602401602060405180830381865afa158015610864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061059a91906124b0565b60015473ffffffffffffffffffffffffffffffffffffffff163314610909576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064016104f8565b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b67ffffffffffffffff808216600090815260066020526040812054909161059d911660016124fc565b6109b6611274565b6109bf816112f7565b50565b600073ffffffffffffffffffffffffffffffffffffffff8216610a11576040517fa4ec747900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025473ffffffffffffffffffffffffffffffffffffffff163314610a62576040517f1c0a352900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60045473ffffffffffffffffffffffffffffffffffffffff168015610b08576040517fe0a0e50600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82169063e0a0e50690610ad5908990899060040161226d565b600060405180830381600087803b158015610aef57600080fd5b505af1158015610b03573d6000803e3d6000fd5b505050505b6003546000908190819073ffffffffffffffffffffffffffffffffffffffff1663c4276bfc8a610b3e60808c0160608d016120b7565b8a610b4c60808e018e612524565b6040518663ffffffff1660e01b8152600401610b6c959493929190612589565b600060405180830381865afa158015610b89573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610bcf9190810190612651565b91945092509050610be66080890160608a016120b7565b73ffffffffffffffffffffffffffffffffffffffff167f075a2720282fdf622141dae0b048ef90a21a7e57c134c76912d19d006b3b3f6f84604051610c2d91815260200190565b60405180910390a2604080516101a0810182526000610100820181815267ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166101208501528d8116610140850181905283526006602052938220805492948493610160850192918791610caa91166126a8565b91906101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905567ffffffffffffffff16815260200186610daa576040517fea458c0c00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8f16600482015273ffffffffffffffffffffffffffffffffffffffff8c811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063ea458c0c906044016020604051808303816000875af1158015610d81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da591906126cf565b610dad565b60005b67ffffffffffffffff1681525081526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018a8060200190610deb9190612524565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001610e2f8b80612524565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001610e7660808c018c612524565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001610ec060808c0160608d016120b7565b73ffffffffffffffffffffffffffffffffffffffff1681526020018981526020018a8060400190610ef191906126ec565b905067ffffffffffffffff811115610f0b57610f0b611f0f565b604051908082528060200260200182016040528015610f6757816020015b610f546040518060800160405280606081526020016060815260200160608152602001600081525090565b815260200190600190039081610f295790505b509052905060005b610f7c60408b018b6126ec565b905081101561102b57611002610f9560408c018c6126ec565b83818110610fa557610fa5612481565b905060400201803603810190610fbb9190612754565b8c610fc68d80612524565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e92506114dc915050565b8260e00151828151811061101857611018612481565b6020908102919091010152600101610f6f565b5060035460e082015173ffffffffffffffffffffffffffffffffffffffff9091169063cc88924c908c9061106260408e018e6126ec565b6040518563ffffffff1660e01b81526004016110819493929190612850565b60006040518083038186803b15801561109957600080fd5b505afa1580156110ad573d6000803e3d6000fd5b505050506080808201839052604080517f130ac867e79e2789f923760a88743d292acdf7002139a588206e2260f73f7321602082015267ffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811692820192909252908c166060820152309181019190915261114a90829060a001604051602081830303815290604052805190602001206117e6565b81515260405167ffffffffffffffff8b16907f0f07cd31e53232da9125e517f09550fdde74bf43d6a0a76ebd41674dafe2ab2990611189908490612886565b60405180910390a251519450505050505b949350505050565b6111aa611274565b6109bf816118e6565b60606040517f9e7177c800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001790526107ce9084906119db565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e65720000000000000000000060448201526064016104f8565b565b602081015173ffffffffffffffffffffffffffffffffffffffff1615806113365750606081015173ffffffffffffffffffffffffffffffffffffffff16155b1561136d576040517f35be3ac800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051600280547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff93841617909155602080840151600380548416918516919091179055604080850151600480548516918616919091179055606080860151600580549095169086161790935580516080810182527f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff1681527f00000000000000000000000000000000000000000000000000000000000000008516928101929092527f00000000000000000000000000000000000000000000000000000000000000008416828201527f00000000000000000000000000000000000000000000000000000000000000009093169181019190915290517f23a1adf8ad7fad6091a4803227af2cee848c01a7c812404cade7c25636925e32916114d19184906129d4565b60405180910390a150565b6115076040518060800160405280606081526020016060815260200160608152602001600081525090565b8460200151600003611545576040517f5cf0444900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115558587600001516107d3565b905073ffffffffffffffffffffffffffffffffffffffff8116158061162557506040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527faff2afbf00000000000000000000000000000000000000000000000000000000600482015273ffffffffffffffffffffffffffffffffffffffff8216906301ffc9a790602401602060405180830381865afa1580156115ff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611623919061213e565b155b156116775785516040517fbf16aab600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024016104f8565b60008173ffffffffffffffffffffffffffffffffffffffff16639a4575b96040518060a001604052808881526020018967ffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018a6020015181526020018a6000015173ffffffffffffffffffffffffffffffffffffffff168152506040518263ffffffff1660e01b81526004016117169190612a73565b6000604051808303816000875af1158015611735573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261177b9190810190612ae9565b604080516080810190915273ffffffffffffffffffffffffffffffffffffffff841660a08201529091508060c0810160405160208183030381529060405281526020018260000151815260200182602001518152602001886020015181525092505050949350505050565b60008060001b82846020015185606001518660000151606001518760000151608001518860a001518960c0015160405160200161182896959493929190612b7a565b604051602081830303815290604052805190602001208560400151805190602001208660e0015160405160200161185f9190612bdb565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206080808c0151805190840120928501989098529183019590955260608201939093529384015260a083015260c082015260e00160405160208183030381529060405280519060200120905092915050565b3373ffffffffffffffffffffffffffffffffffffffff821603611965576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c6600000000000000000060448201526064016104f8565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6000611a3d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611ae79092919063ffffffff16565b8051909150156107ce5780806020019051810190611a5b919061213e565b6107ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016104f8565b6060611af68484600085611b00565b90505b9392505050565b606082471015611b92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016104f8565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611bbb9190612bee565b60006040518083038185875af1925050503d8060008114611bf8576040519150601f19603f3d011682016040523d82523d6000602084013e611bfd565b606091505b5091509150611c0e87838387611c19565b979650505050505050565b60608315611caf578251600003611ca85773ffffffffffffffffffffffffffffffffffffffff85163b611ca8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016104f8565b508161119a565b61119a8383815115611cc45781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f89190611dbd565b6080810161059d828467ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b60005b83811015611d6a578181015183820152602001611d52565b50506000910152565b60008151808452611d8b816020860160208601611d4f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061059a6020830184611d73565b67ffffffffffffffff811681146109bf57600080fd5b600060a08284031215611df857600080fd5b50919050565b60008060408385031215611e1157600080fd5b8235611e1c81611dd0565b9150602083013567ffffffffffffffff811115611e3857600080fd5b611e4485828601611de6565b9150509250929050565b73ffffffffffffffffffffffffffffffffffffffff811681146109bf57600080fd5b60008060408385031215611e8357600080fd5b8235611e8e81611dd0565b91506020830135611e9e81611e4e565b809150509250929050565b6080810161059d8284805173ffffffffffffffffffffffffffffffffffffffff908116835260208083015182169084015260408083015182169084015260609182015116910152565b600060208284031215611f0457600080fd5b8135611af981611dd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715611f6157611f61611f0f565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611fae57611fae611f0f565b604052919050565b8035611fc181611e4e565b919050565b600060808284031215611fd857600080fd5b6040516080810181811067ffffffffffffffff82111715611ffb57611ffb611f0f565b604052823561200981611e4e565b8152602083013561201981611e4e565b6020820152604083013561202c81611e4e565b6040820152606083013561203f81611e4e565b60608201529392505050565b6000806000806080858703121561206157600080fd5b843561206c81611dd0565b9350602085013567ffffffffffffffff81111561208857600080fd5b61209487828801611de6565b9350506040850135915060608501356120ac81611e4e565b939692955090935050565b6000602082840312156120c957600080fd5b8135611af981611e4e565b6020808252825182820181905260009190848201906040850190845b8181101561212257835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016120f0565b50909695505050505050565b80518015158114611fc157600080fd5b60006020828403121561215057600080fd5b61059a8261212e565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261218e57600080fd5b830160208101925035905067ffffffffffffffff8111156121ae57600080fd5b8036038213156121bd57600080fd5b9250929050565b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b8183526000602080850194508260005b8581101561226257813561223081611e4e565b73ffffffffffffffffffffffffffffffffffffffff16875281830135838801526040968701969091019060010161221d565b509495945050505050565b600067ffffffffffffffff80851683526040602084015261228e8485612159565b60a060408601526122a360e0860182846121c4565b9150506122b36020860186612159565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0808785030160608801526122e98483856121c4565b9350604088013592507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe188360301831261232257600080fd5b6020928801928301923591508482111561233b57600080fd5b8160061b360383131561234d57600080fd5b8087850301608088015261236284838561220d565b945061237060608901611fb6565b73ffffffffffffffffffffffffffffffffffffffff811660a0890152935061239b6080890189612159565b94509250808786030160c08801525050611c0e8383836121c4565b6000602082840312156123c857600080fd5b5051919050565b600060208083850312156123e257600080fd5b825167ffffffffffffffff808211156123fa57600080fd5b818501915085601f83011261240e57600080fd5b81518181111561242057612420611f0f565b8060051b9150612431848301611f67565b818152918301840191848101908884111561244b57600080fd5b938501935b83851015612475578451925061246583611e4e565b8282529385019390850190612450565b98975050505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082840312156124c257600080fd5b8151611af981611e4e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b67ffffffffffffffff81811683821601908082111561251d5761251d6124cd565b5092915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261255957600080fd5b83018035915067ffffffffffffffff82111561257457600080fd5b6020019150368190038213156121bd57600080fd5b67ffffffffffffffff8616815273ffffffffffffffffffffffffffffffffffffffff85166020820152836040820152608060608201526000611c0e6080830184866121c4565b600082601f8301126125e057600080fd5b815167ffffffffffffffff8111156125fa576125fa611f0f565b61262b60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601611f67565b81815284602083860101111561264057600080fd5b61119a826020830160208701611d4f565b60008060006060848603121561266657600080fd5b835192506126766020850161212e565b9150604084015167ffffffffffffffff81111561269257600080fd5b61269e868287016125cf565b9150509250925092565b600067ffffffffffffffff8083168181036126c5576126c56124cd565b6001019392505050565b6000602082840312156126e157600080fd5b8151611af981611dd0565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261272157600080fd5b83018035915067ffffffffffffffff82111561273c57600080fd5b6020019150600681901b36038213156121bd57600080fd5b60006040828403121561276657600080fd5b61276e611f3e565b823561277981611e4e565b81526020928301359281019290925250919050565b600082825180855260208086019550808260051b84010181860160005b84811015612843577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030189528151608081518186526127ef82870182611d73565b91505085820151858203878701526128078282611d73565b915050604080830151868303828801526128218382611d73565b60609485015197909401969096525050988401989250908301906001016127ab565b5090979650505050505050565b67ffffffffffffffff85168152606060208201526000612873606083018661278e565b8281036040840152611c0e81858761220d565b602081526128d760208201835180518252602081015167ffffffffffffffff808216602085015280604084015116604085015280606084015116606085015280608084015116608085015250505050565b6000602083015161290060c084018273ffffffffffffffffffffffffffffffffffffffff169052565b5060408301516101808060e085015261291d6101a0850183611d73565b915060608501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0808685030161010087015261295a8483611d73565b93506080870151915080868503016101208701526129788483611d73565b935060a087015191506129a461014087018373ffffffffffffffffffffffffffffffffffffffff169052565b60c087015161016087015260e08701519150808685030183870152506129ca838261278e565b9695505050505050565b6101008101612a2c828567ffffffffffffffff8151168252602081015173ffffffffffffffffffffffffffffffffffffffff808216602085015280604084015116604085015280606084015116606085015250505050565b825173ffffffffffffffffffffffffffffffffffffffff90811660808401526020840151811660a08401526040840151811660c084015260608401511660e0830152611af9565b602081526000825160a06020840152612a8f60c0840182611d73565b905067ffffffffffffffff6020850151166040840152604084015173ffffffffffffffffffffffffffffffffffffffff8082166060860152606086015160808601528060808701511660a086015250508091505092915050565b600060208284031215612afb57600080fd5b815167ffffffffffffffff80821115612b1357600080fd5b9083019060408286031215612b2757600080fd5b612b2f611f3e565b825182811115612b3e57600080fd5b612b4a878286016125cf565b825250602083015182811115612b5f57600080fd5b612b6b878286016125cf565b60208301525095945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808916835260c06020840152612baa60c0840189611d73565b67ffffffffffffffff97881660408501529590961660608301525091909316608082015260a0019190915292915050565b60208152600061059a602083018461278e565b60008251612c00818460208701611d4f565b919091019291505056fea164736f6c6343000818000a",
}
@@ -460,123 +460,6 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampTransactorSession) WithdrawFeeToken
return _EVM2EVMMultiOnRamp.Contract.WithdrawFeeTokens(&_EVM2EVMMultiOnRamp.TransactOpts)
}
-type EVM2EVMMultiOnRampAdminSetIterator struct {
- Event *EVM2EVMMultiOnRampAdminSet
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *EVM2EVMMultiOnRampAdminSetIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(EVM2EVMMultiOnRampAdminSet)
- if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
- it.fail = err
- return false
- }
- it.Event.Raw = log
- return true
-
- default:
- return false
- }
- }
-
- select {
- case log := <-it.logs:
- it.Event = new(EVM2EVMMultiOnRampAdminSet)
- if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
- it.fail = err
- return false
- }
- it.Event.Raw = log
- return true
-
- case err := <-it.sub.Err():
- it.done = true
- it.fail = err
- return it.Next()
- }
-}
-
-func (it *EVM2EVMMultiOnRampAdminSetIterator) Error() error {
- return it.fail
-}
-
-func (it *EVM2EVMMultiOnRampAdminSetIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type EVM2EVMMultiOnRampAdminSet struct {
- NewAdmin common.Address
- Raw types.Log
-}
-
-func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) FilterAdminSet(opts *bind.FilterOpts) (*EVM2EVMMultiOnRampAdminSetIterator, error) {
-
- logs, sub, err := _EVM2EVMMultiOnRamp.contract.FilterLogs(opts, "AdminSet")
- if err != nil {
- return nil, err
- }
- return &EVM2EVMMultiOnRampAdminSetIterator{contract: _EVM2EVMMultiOnRamp.contract, event: "AdminSet", logs: logs, sub: sub}, nil
-}
-
-func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) WatchAdminSet(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampAdminSet) (event.Subscription, error) {
-
- logs, sub, err := _EVM2EVMMultiOnRamp.contract.WatchLogs(opts, "AdminSet")
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(EVM2EVMMultiOnRampAdminSet)
- if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "AdminSet", log); err != nil {
- return err
- }
- event.Raw = log
-
- select {
- case sink <- event:
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- }
- }), nil
-}
-
-func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) ParseAdminSet(log types.Log) (*EVM2EVMMultiOnRampAdminSet, error) {
- event := new(EVM2EVMMultiOnRampAdminSet)
- if err := _EVM2EVMMultiOnRamp.contract.UnpackLog(event, "AdminSet", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
type EVM2EVMMultiOnRampCCIPSendRequestedIterator struct {
Event *EVM2EVMMultiOnRampCCIPSendRequested
@@ -1362,8 +1245,6 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRampFilterer) ParseOwnershipTransferred
func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRamp) ParseLog(log types.Log) (generated.AbigenLog, error) {
switch log.Topics[0] {
- case _EVM2EVMMultiOnRamp.abi.Events["AdminSet"].ID:
- return _EVM2EVMMultiOnRamp.ParseAdminSet(log)
case _EVM2EVMMultiOnRamp.abi.Events["CCIPSendRequested"].ID:
return _EVM2EVMMultiOnRamp.ParseCCIPSendRequested(log)
case _EVM2EVMMultiOnRamp.abi.Events["ConfigSet"].ID:
@@ -1382,10 +1263,6 @@ func (_EVM2EVMMultiOnRamp *EVM2EVMMultiOnRamp) ParseLog(log types.Log) (generate
}
}
-func (EVM2EVMMultiOnRampAdminSet) Topic() common.Hash {
- return common.HexToHash("0x8fe72c3e0020beb3234e76ae6676fa576fbfcae600af1c4fea44784cf0db329c")
-}
-
func (EVM2EVMMultiOnRampCCIPSendRequested) Topic() common.Hash {
return common.HexToHash("0x0f07cd31e53232da9125e517f09550fdde74bf43d6a0a76ebd41674dafe2ab29")
}
@@ -1441,12 +1318,6 @@ type EVM2EVMMultiOnRampInterface interface {
WithdrawFeeTokens(opts *bind.TransactOpts) (*types.Transaction, error)
- FilterAdminSet(opts *bind.FilterOpts) (*EVM2EVMMultiOnRampAdminSetIterator, error)
-
- WatchAdminSet(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampAdminSet) (event.Subscription, error)
-
- ParseAdminSet(log types.Log) (*EVM2EVMMultiOnRampAdminSet, error)
-
FilterCCIPSendRequested(opts *bind.FilterOpts, destChainSelector []uint64) (*EVM2EVMMultiOnRampCCIPSendRequestedIterator, error)
WatchCCIPSendRequested(opts *bind.WatchOpts, sink chan<- *EVM2EVMMultiOnRampCCIPSendRequested, destChainSelector []uint64) (event.Subscription, error)
diff --git a/core/gethwrappers/ccip/generated/price_registry/price_registry.go b/core/gethwrappers/ccip/generated/price_registry/price_registry.go
index a93faaf82c..6f04601fcb 100644
--- a/core/gethwrappers/ccip/generated/price_registry/price_registry.go
+++ b/core/gethwrappers/ccip/generated/price_registry/price_registry.go
@@ -146,8 +146,8 @@ type PriceRegistryTokenTransferFeeConfigSingleTokenArgs struct {
}
var PriceRegistryMetaData = &bind.MetaData{
- ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structPriceRegistry.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structPriceRegistry.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chain\",\"type\":\"uint64\"}],\"name\":\"ChainNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"priceUpdater\",\"type\":\"address\"}],\"name\":\"PriceUpdaterRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"priceUpdater\",\"type\":\"address\"}],\"name\":\"PriceUpdaterSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structPriceRegistry.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structPriceRegistry.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"rampTokenAmounts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"validatePoolReturnData\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]",
- Bin: "0x60e06040523480156200001157600080fd5b506040516200695038038062006950833981016040819052620000349162001816565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a9f565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b6b565b5050505050505062001ad4565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001935565b60209081029190910101519050620002f560028262000ea4565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001935565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000ec4565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001935565b6020026020010151600c62000ec460201b90919060201c565b1562000499578281815181106200045b576200045b62001935565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001935565b6020026020010151600c62000ea460201b90919060201c565b156200053b57818181518110620004fd57620004fd62001935565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001935565b6020908102919091018101518051818301516001600160a01b0380831660008181526006875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001935565b6020026020010151905060008383815181106200065f576200065f62001935565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061018081015163ffffffff16155b80620006ba57506102008101516001600160e01b031916630a04b54b60e21b14155b80620006d75750602063ffffffff1681610160015163ffffffff16105b80620006f75750806060015163ffffffff1681610180015163ffffffff16115b15620007225760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260086020526040812060010154600160a81b900460e01b6001600160e01b0319169003620007a257816001600160401b03167fa937382a486d993de71c220bc8b559242deb4e286a353fa732330b4aa7d13577826040516200079491906200194b565b60405180910390a2620007e6565b816001600160401b03167fa7b607fc10d28a1caf39ab7d27f4c94945db708a576d572781a455c5894fad9382604051620007dd91906200194b565b60405180910390a25b8060086000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101a08201518160010160086101000a8154816001600160401b0302191690836001600160401b031602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000ac35762000ac362001935565b6020026020010151600001519050600083838151811062000ae85762000ae862001935565b6020908102919091018101518101516001600160a01b03841660008181526007845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000aa2565b60005b825181101562000dde57600083828151811062000b8f5762000b8f62001935565b6020026020010151905060008160000151905060005b82602001515181101562000dcf5760008360200151828151811062000bce5762000bce62001935565b602002602001015160200151905060008460200151838151811062000bf75762000bf762001935565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c565760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b03841660008181526009602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000dbc908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000ba5565b50505080600101905062000b6e565b5060005b81518110156200054457600082828151811062000e035762000e0362001935565b6020026020010151600001519050600083838151811062000e285762000e2862001935565b6020908102919091018101518101516001600160401b03841660008181526009845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000de2565b600062000ebb836001600160a01b03841662000edb565b90505b92915050565b600062000ebb836001600160a01b03841662000fdf565b6000818152600183016020526040812054801562000fd457600062000f0260018362001a9c565b855490915060009062000f189060019062001a9c565b905081811462000f8457600086600001828154811062000f3c5762000f3c62001935565b906000526020600020015490508087600001848154811062000f625762000f6262001935565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f985762000f9862001abe565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000ebe565b600091505062000ebe565b6000818152600183016020526040812054620010285750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000ebe565b50600062000ebe565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200106c576200106c62001031565b60405290565b60405160c081016001600160401b03811182821017156200106c576200106c62001031565b60405161022081016001600160401b03811182821017156200106c576200106c62001031565b604051601f8201601f191681016001600160401b0381118282101715620010e857620010e862001031565b604052919050565b80516001600160a01b03811681146200110857600080fd5b919050565b805163ffffffff811681146200110857600080fd5b6000606082840312156200113557600080fd5b604051606081016001600160401b03811182821017156200115a576200115a62001031565b604052825190915081906001600160601b03811681146200117a57600080fd5b81526200118a60208401620010f0565b60208201526200119d604084016200110d565b60408201525092915050565b60006001600160401b03821115620011c557620011c562001031565b5060051b60200190565b600082601f830112620011e157600080fd5b81516020620011fa620011f483620011a9565b620010bd565b8083825260208201915060208460051b8701019350868411156200121d57600080fd5b602086015b8481101562001244576200123681620010f0565b835291830191830162001222565b509695505050505050565b600082601f8301126200126157600080fd5b8151602062001274620011f483620011a9565b828152606092830285018201928282019190878511156200129457600080fd5b8387015b85811015620013275780890382811215620012b35760008081fd5b620012bd62001047565b620012c883620010f0565b8152604080601f1984011215620012df5760008081fd5b620012e962001047565b9250620012f8888501620010f0565b835283015160ff811681146200130e5760008081fd5b8288015280870191909152845292840192810162001298565b5090979650505050505050565b80516001600160401b03811681146200110857600080fd5b805161ffff811681146200110857600080fd5b805180151581146200110857600080fd5b600082601f8301126200138257600080fd5b8151602062001395620011f483620011a9565b82815260059290921b84018101918181019086841115620013b557600080fd5b8286015b84811015620012445780516001600160401b0380821115620013da57600080fd5b908801906040601f19838c038101821315620013f557600080fd5b620013ff62001047565b6200140c89860162001334565b815282850151848111156200142057600080fd5b8086019550508c603f8601126200143657600080fd5b8885015193506200144b620011f485620011a9565b84815260e09094028501830193898101908e8611156200146a57600080fd5b958401955b858710156200154357868f0360e08112156200148a57600080fd5b6200149462001047565b6200149f89620010f0565b815260c08683011215620014b257600080fd5b620014bc62001072565b9150620014cb8d8a016200110d565b8252620014da878a016200110d565b8d830152620014ec60608a016200134c565b87830152620014fe60808a016200110d565b60608301526200151160a08a016200110d565b60808301526200152460c08a016200135f565b60a0830152808d0191909152825260e09690960195908a01906200146f565b828b015250875250505092840192508301620013b9565b600082601f8301126200156c57600080fd5b815160206200157f620011f483620011a9565b82815260069290921b840181019181810190868411156200159f57600080fd5b8286015b84811015620012445760408189031215620015be5760008081fd5b620015c862001047565b620015d382620010f0565b8152620015e285830162001334565b81860152835291830191604001620015a3565b80516001600160e01b0319811681146200110857600080fd5b600082601f8301126200162057600080fd5b8151602062001633620011f483620011a9565b82815261024092830285018201928282019190878511156200165457600080fd5b8387015b85811015620013275780890382811215620016735760008081fd5b6200167d62001047565b620016888362001334565b815261022080601f1984011215620016a05760008081fd5b620016aa62001097565b9250620016b98885016200135f565b83526040620016ca8186016200134c565b898501526060620016dd8187016200110d565b8286015260809150620016f28287016200110d565b9085015260a0620017058682016200110d565b8286015260c091506200171a8287016200134c565b9085015260e06200172d8682016200110d565b828601526101009150620017438287016200134c565b90850152610120620017578682016200134c565b8286015261014091506200176d8287016200134c565b90850152610160620017818682016200110d565b828601526101809150620017978287016200110d565b908501526101a0620017ab8682016200110d565b828601526101c09150620017c182870162001334565b908501526101e0620017d58682016200110d565b828601526102009150620017eb8287016200135f565b90850152620017fc858301620015f5565b908401525080870191909152845292840192810162001658565b6000806000806000806000610120888a0312156200183357600080fd5b6200183f898962001122565b60608901519097506001600160401b03808211156200185d57600080fd5b6200186b8b838c01620011cf565b975060808a01519150808211156200188257600080fd5b620018908b838c01620011cf565b965060a08a0151915080821115620018a757600080fd5b620018b58b838c016200124f565b955060c08a0151915080821115620018cc57600080fd5b620018da8b838c0162001370565b945060e08a0151915080821115620018f157600080fd5b620018ff8b838c016200155a565b93506101008a01519150808211156200191757600080fd5b50620019268a828b016200160e565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815115158152610220810160208301516200196c602084018261ffff169052565b50604083015162001985604084018263ffffffff169052565b5060608301516200199e606084018263ffffffff169052565b506080830151620019b7608084018263ffffffff169052565b5060a0830151620019ce60a084018261ffff169052565b5060c0830151620019e760c084018263ffffffff169052565b5060e0830151620019fe60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501518216908401526101a0808501516001600160401b0316908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000ebe57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051614e2262001b2e600039600081816102d901528181611ad30152611b3c01526000818161029d0152818161104e01526110ae015260008181610269015281816110d701526111470152614e226000f3fe608060405234801561001057600080fd5b50600436106101b85760003560e01c80637afac322116100f9578063cc88924c11610097578063d8694ccd11610071578063d8694ccd14610a5c578063f2fde38b14610a6f578063f700042a14610a82578063ffdb4b3714610a9557600080fd5b8063cc88924c14610a2e578063cdc73d5114610a41578063d02641a014610a4957600080fd5b806391a2749a116100d357806391a2749a14610939578063a69c64c01461094c578063bf78e03f1461095f578063c4276bfc14610a0c57600080fd5b80637afac3221461078e57806382b49eb0146107a15780638da5cb5b1461091157600080fd5b8063407e108611610166578063514e8cff11610140578063514e8cff146104385780636def4ce7146104db578063770e2dc41461077357806379ba50971461078657600080fd5b8063407e1086146103c557806345ac924d146103d85780634ab35b0b146103f857600080fd5b8063181f5a7711610197578063181f5a77146103525780632451a6271461039b5780633937306f146103b057600080fd5b806241e5be146101bd578063061877e3146101e357806306285c691461023c575b600080fd5b6101d06101cb36600461380f565b610add565b6040519081526020015b60405180910390f35b6102236101f136600461384b565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101da565b610306604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101da565b61038e6040518060400160405280601781526020017f5072696365526567697374727920312e362e302d64657600000000000000000081525081565b6040516101da91906138ca565b6103a3610b4b565b6040516101da91906138dd565b6103c36103be366004613937565b610b5c565b005b6103c36103d3366004613a93565b610e11565b6103eb6103e6366004613bf1565b610e25565b6040516101da9190613c33565b61040b61040636600461384b565b610ef0565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101da565b6104ce610446366004613cc6565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600460209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101da9190613ce1565b6107666104e9366004613cc6565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260086020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b010000000000000000000000000000000000000000000000000000009092048616610140840152600190930154808616610160840152640100000000810486166101808401526801000000000000000081049096166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101da9190613d1c565b6103c3610781366004613f59565b610efb565b6103c3610f11565b6103c361079c366004614273565b611013565b6108b16107af3660046142d7565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff91909116600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101da9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101da565b6103c3610947366004614301565b611025565b6103c361095a366004614392565b611036565b6109d861096d36600461384b565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526006825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101da565b610a1f610a1a366004614457565b611047565b6040516101da939291906144f2565b6103c3610a3c36600461451c565b611245565b6103a361141b565b6104ce610a5736600461384b565b611427565b6101d0610a6a3660046145b7565b611523565b6103c3610a7d36600461384b565b6119dd565b6103c3610a9036600461463c565b6119ee565b610aa8610aa336600461485c565b6119ff565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101da565b6000610ae882611b8a565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b0f85611b8a565b610b37907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856148b5565b610b4191906148cc565b90505b9392505050565b6060610b576002611c24565b905090565b610b64611c31565b6000610b708280614907565b9050905060005b81811015610cba576000610b8b8480614907565b83818110610b9b57610b9b61496f565b905060400201803603810190610bb191906149ca565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610ca99290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610b77565b506000610cca6020840184614907565b9050905060005b81811015610e0b576000610ce86020860186614907565b83818110610cf857610cf861496f565b905060400201803603810190610d0e9190614a07565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600490975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610dfa9290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610cd1565b50505050565b610e19611c76565b610e2281611cf7565b50565b60608160008167ffffffffffffffff811115610e4357610e43613972565b604051908082528060200260200182016040528015610e8857816020015b6040805180820190915260008082526020820152815260200190600190039081610e615790505b50905060005b82811015610ee557610ec0868683818110610eab57610eab61496f565b9050602002016020810190610a57919061384b565b828281518110610ed257610ed261496f565b6020908102919091010152600101610e8e565b509150505b92915050565b6000610eea82611b8a565b610f03611c76565b610f0d8282611df5565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61101b611c76565b610f0d8282612207565b61102d611c76565b610e228161234e565b61103e611c76565b610e22816124da565b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036110a7578592506110d5565b6110d287877f0000000000000000000000000000000000000000000000000000000000000000610add565b92505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16831115611174576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018490526bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610f8e565b67ffffffffffffffff8816600090815260086020526040812060010154640100000000900463ffffffff16906111ab8787846125c4565b9050806020015193508484611232836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b9450945094505050955095509592505050565b67ffffffffffffffff85166000908152600860205260408120600101547501000000000000000000000000000000000000000000900460e01b905b8481101561141257600084848381811061129c5761129c61496f565b6112b2926020604090920201908101915061384b565b905060008787848181106112c8576112c861496f565b90506020028101906112da9190614a2a565b6112e8906040810190614a68565b91505060208111156113985767ffffffffffffffff8916600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115611398576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610f8e565b611408848989868181106113ae576113ae61496f565b90506020028101906113c09190614a2a565b6113ce906020810190614a68565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061276d92505050565b5050600101611280565b50505050505050565b6060610b57600c611c24565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8281166000908152600660209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff16908201529061151a57505073ffffffffffffffffffffffffffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b610b44816127bf565b67ffffffffffffffff8083166000908152600860209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b010000000000000000000000000000000000000000000000000000009093048616610140850152600190940154808616610160850152640100000000810486166101808501526801000000000000000081049098166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611759576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610f8e565b60006117686040850185614907565b91506117c490508261177d6020870187614a68565b90508361178a8880614a68565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a0292505050565b60006007816117d9608088016060890161384b565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081205467ffffffffffffffff169150806118286118226080890160608a0161384b565b896119ff565b909250905060008080861561186e57611862888c61184c60808e0160608f0161384b565b888e806040019061185d9190614907565b612aac565b9194509250905061188e565b6101c088015161188b9063ffffffff16662386f26fc100006148b5565b92505b61010088015160009061ffff16156118d2576118cf896dffffffffffffffffffffffffffff607088901c166118c660208f018f614a68565b90508b86612d8a565b90505b6101a089015160009067ffffffffffffffff166118fb6118f560808f018f614a68565b8d612e3a565b600001518563ffffffff168c60a0015161ffff168f806020019061191f9190614a68565b61192a9291506148b5565b8d6080015163ffffffff1661193f9190614acd565b6119499190614acd565b6119539190614acd565b61196d906dffffffffffffffffffffffffffff89166148b5565b61197791906148b5565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff871682826119ae67ffffffffffffffff8c16896148b5565b6119b89190614acd565b6119c29190614acd565b6119cc91906148cc565b9d9c50505050505050505050505050565b6119e5611c76565b610e2281612efb565b6119f6611c76565b610e2281612ff0565b67ffffffffffffffff811660009081526004602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff1691810182905282918203611ab7576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610f8e565b6000816020015163ffffffff1642611acf9190614ae0565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16811115611b70576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610f8e565b611b7986611b8a565b9151919350909150505b9250929050565b600080611b9683611427565b9050806020015163ffffffff1660001480611bce575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15611c1d576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610f8e565b5192915050565b60606000610b44836134de565b611c3c60023361353a565b611c74576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610f8e565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f8e565b60005b8151811015610f0d576000828281518110611d1757611d1761496f565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526006875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a2505050806001019050611cfa565b60005b825181101561211e576000838281518110611e1557611e1561496f565b6020026020010151905060008160000151905060005b82602001515181101561211057600083602001518281518110611e5057611e5061496f565b6020026020010151602001519050600084602001518381518110611e7657611e7661496f565b6020026020010151600001519050602063ffffffff16826080015163ffffffff161015611ef95760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610f8e565b67ffffffffffffffff8416600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b5906120fe908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101611e2b565b505050806001019050611df8565b5060005b815181101561220257600082828151811061213f5761213f61496f565b602002602001015160000151905060008383815181106121615761216161496f565b60209081029190910181015181015167ffffffffffffffff8416600081815260098452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101612122565b505050565b60005b82518110156122aa576122408382815181106122285761222861496f565b6020026020010151600c61356990919063ffffffff16565b156122a2578281815181106122575761225761496f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010161220a565b5060005b8151811015612202576122e48282815181106122cc576122cc61496f565b6020026020010151600c61358b90919063ffffffff16565b15612346578181815181106122fb576122fb61496f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b6001016122ae565b602081015160005b81518110156123e95760008282815181106123735761237361496f565b6020026020010151905061239181600261358b90919063ffffffff16565b156123e05760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101612356565b50815160005b8151811015610e0b57600082828151811061240c5761240c61496f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361247c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612487600282613569565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016123ef565b60005b8151811015610f0d5760008282815181106124fa576124fa61496f565b6020026020010151600001519050600083838151811061251c5761251c61496f565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526007845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a250506001016124dd565b6040805180820190915260008082526020820152600083900361260557506040805180820190915267ffffffffffffffff8216815260006020820152610b44565b60006126118486614af3565b905060006126228560048189614b39565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016126bf57808060200190518101906126b69190614b63565b92505050610b44565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161273b576040518060400160405280828060200190518101906127279190614b8f565b815260006020909101529250610b44915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610f0d57612202816135ad565b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284d9190614bc2565b505050915050600081121561288e576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000819050600085602001518473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129099190614c12565b6129139190614c2f565b905060248160ff1611156129485761292c602482614c48565b61293790600a614d81565b61294190836148cc565b915061296b565b612953816024614c48565b61295e90600a614d81565b61296890836148b5565b91505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156129c1576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff42166020820152949350505050565b836040015163ffffffff16831115612a5b5760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610f8e565b836020015161ffff16821115612a9d576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0b8461020001518261276d565b6000808083815b81811015612d7c576000878783818110612acf57612acf61496f565b905060400201803603810190612ae59190614d90565b67ffffffffffffffff8c166000908152600960209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090612c0b576101208d0151612bd29061ffff16662386f26fc100006148b5565b612bdc9088614acd565b96508c610140015186612bef9190614dc9565b95508c610160015185612c029190614dc9565b94505050612d74565b604081015160009061ffff1615612cc45760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614612c67578351612c6090611b8a565b9050612c6a565b508a5b620186a0836040015161ffff16612cac8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661366090919063ffffffff16565b612cb691906148b5565b612cc091906148cc565b9150505b6060820151612cd39088614dc9565b9650816080015186612ce59190614dc9565b8251909650600090612d049063ffffffff16662386f26fc100006148b5565b905080821015612d2357612d18818a614acd565b985050505050612d74565b6000836020015163ffffffff16662386f26fc10000612d4291906148b5565b905080831115612d6257612d56818b614acd565b99505050505050612d74565b612d6c838b614acd565b995050505050505b600101612ab3565b505096509650969350505050565b60008063ffffffff8316612da0610140866148b5565b612dac876101c0614acd565b612db69190614acd565b612dc09190614acd565b905060008760c0015163ffffffff168860e0015161ffff1683612de391906148b5565b612ded9190614acd565b61010089015190915061ffff16612e146dffffffffffffffffffffffffffff8916836148b5565b612e1e91906148b5565b612e2e90655af3107a40006148b5565b98975050505050505050565b60408051808201909152600080825260208201526000612e66858585610180015163ffffffff166125c4565b9050826060015163ffffffff1681600001511115612eb0576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015612ec457508060200151155b15610b41576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f8e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015610f0d5760008282815181106130105761301061496f565b60200260200101519050600083838151811061302e5761302e61496f565b60200260200101516000015190506000826020015190508167ffffffffffffffff1660001480613067575061018081015163ffffffff16155b806130b957506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806130d55750602063ffffffff1681610160015163ffffffff16105b806130f45750806060015163ffffffff1681610180015163ffffffff16115b15613137576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f8e565b67ffffffffffffffff82166000908152600860205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff000000000000000000000000000000000000000000000000000000001690036131df578167ffffffffffffffff167fa937382a486d993de71c220bc8b559242deb4e286a353fa732330b4aa7d13577826040516131d29190613d1c565b60405180910390a2613222565b8167ffffffffffffffff167fa7b607fc10d28a1caf39ab7d27f4c94945db708a576d572781a455c5894fad93826040516132199190613d1c565b60405180910390a25b80600860008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101a08201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050612ff3565b60608160000180548060200260200160405190810160405280929190818152602001828054801561352e57602002820191906000526020600020905b81548152602001906001019080831161351a575b50505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b44565b6000610b448373ffffffffffffffffffffffffffffffffffffffff841661369d565b6000610b448373ffffffffffffffffffffffffffffffffffffffff84166136ec565b600081516020146135ec57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610f8e91906138ca565b6000828060200190518101906136029190614b8f565b905073ffffffffffffffffffffffffffffffffffffffff811180613627575061040081105b15610eea57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610f8e91906138ca565b6000670de0b6b3a7640000613693837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166148b5565b610b4491906148cc565b60008181526001830160205260408120546136e457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eea565b506000610eea565b600081815260018301602052604081205480156137d5576000613710600183614ae0565b855490915060009061372490600190614ae0565b90508181146137895760008660000182815481106137445761374461496f565b90600052602060002001549050808760000184815481106137675761376761496f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061379a5761379a614de6565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610eea565b6000915050610eea565b5092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461380a57600080fd5b919050565b60008060006060848603121561382457600080fd5b61382d846137e6565b925060208401359150613842604085016137e6565b90509250925092565b60006020828403121561385d57600080fd5b610b44826137e6565b6000815180845260005b8181101561388c57602081850181015186830182015201613870565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b446020830184613866565b6020808252825182820181905260009190848201906040850190845b8181101561392b57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016138f9565b50909695505050505050565b60006020828403121561394957600080fd5b813567ffffffffffffffff81111561396057600080fd5b820160408185031215610b4457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156139c4576139c4613972565b60405290565b60405160c0810167ffffffffffffffff811182821017156139c4576139c4613972565b604051610220810167ffffffffffffffff811182821017156139c4576139c4613972565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5857613a58613972565b604052919050565b600067ffffffffffffffff821115613a7a57613a7a613972565b5060051b60200190565b60ff81168114610e2257600080fd5b60006020808385031215613aa657600080fd5b823567ffffffffffffffff811115613abd57600080fd5b8301601f81018513613ace57600080fd5b8035613ae1613adc82613a60565b613a11565b81815260609182028301840191848201919088841115613b0057600080fd5b938501935b83851015613ba05784890381811215613b1e5760008081fd5b613b266139a1565b613b2f876137e6565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215613b635760008081fd5b613b6b6139a1565b9250613b788989016137e6565b8352870135613b8681613a84565b828901528088019190915283529384019391850191613b05565b50979650505050505050565b60008083601f840112613bbe57600080fd5b50813567ffffffffffffffff811115613bd657600080fd5b6020830191508360208260051b8501011115611b8357600080fd5b60008060208385031215613c0457600080fd5b823567ffffffffffffffff811115613c1b57600080fd5b613c2785828601613bac565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015613ca157613c9184835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101613c50565b5091979650505050505050565b803567ffffffffffffffff8116811461380a57600080fd5b600060208284031215613cd857600080fd5b610b4482613cae565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff169082015260408101610eea565b81511515815261022081016020830151613d3c602084018261ffff169052565b506040830151613d54604084018263ffffffff169052565b506060830151613d6c606084018263ffffffff169052565b506080830151613d84608084018263ffffffff169052565b5060a0830151613d9a60a084018261ffff169052565b5060c0830151613db260c084018263ffffffff169052565b5060e0830151613dc860e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501518216908401526101a08085015167ffffffffffffffff16908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff8116811461380a57600080fd5b803561ffff8116811461380a57600080fd5b8015158114610e2257600080fd5b803561380a81613ea8565b600082601f830112613ed257600080fd5b81356020613ee2613adc83613a60565b82815260069290921b84018101918181019086841115613f0157600080fd5b8286015b84811015613f4e5760408189031215613f1e5760008081fd5b613f266139a1565b613f2f82613cae565b8152613f3c8583016137e6565b81860152835291830191604001613f05565b509695505050505050565b60008060408385031215613f6c57600080fd5b67ffffffffffffffff83351115613f8257600080fd5b83601f843585010112613f9457600080fd5b613fa4613adc8435850135613a60565b8335840180358083526020808401939260059290921b90910101861015613fca57600080fd5b602085358601015b85358601803560051b016020018110156141d75767ffffffffffffffff81351115613ffc57600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a0301121561403557600080fd5b61403d6139a1565b61404960208301613cae565b815267ffffffffffffffff6040830135111561406457600080fd5b88603f60408401358401011261407957600080fd5b61408f613adc6020604085013585010135613a60565b6020604084810135850182810135808552928401939260e00201018b10156140b657600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156141b85760e0818d0312156140e957600080fd5b6140f16139a1565b6140fa826137e6565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f0301121561412e57600080fd5b6141366139ca565b61414260208401613e82565b815261415060408401613e82565b602082015261416160608401613e96565b604082015261417260808401613e82565b606082015261418360a08401613e82565b608082015261419560c0840135613ea8565b60c083013560a0820152602082810191909152908452929092019160e0016140c0565b5080602084015250508085525050602083019250602081019050613fd2565b5092505067ffffffffffffffff602084013511156141f457600080fd5b6142048460208501358501613ec1565b90509250929050565b600082601f83011261421e57600080fd5b8135602061422e613adc83613a60565b8083825260208201915060208460051b87010193508684111561425057600080fd5b602086015b84811015613f4e57614266816137e6565b8352918301918301614255565b6000806040838503121561428657600080fd5b823567ffffffffffffffff8082111561429e57600080fd5b6142aa8683870161420d565b935060208501359150808211156142c057600080fd5b506142cd8582860161420d565b9150509250929050565b600080604083850312156142ea57600080fd5b6142f383613cae565b9150614204602084016137e6565b60006020828403121561431357600080fd5b813567ffffffffffffffff8082111561432b57600080fd5b908301906040828603121561433f57600080fd5b6143476139a1565b82358281111561435657600080fd5b6143628782860161420d565b82525060208301358281111561437757600080fd5b6143838782860161420d565b60208301525095945050505050565b600060208083850312156143a557600080fd5b823567ffffffffffffffff8111156143bc57600080fd5b8301601f810185136143cd57600080fd5b80356143db613adc82613a60565b81815260069190911b820183019083810190878311156143fa57600080fd5b928401925b8284101561444c57604084890312156144185760008081fd5b6144206139a1565b614429856137e6565b8152614436868601613cae565b81870152825260409390930192908401906143ff565b979650505050505050565b60008060008060006080868803121561446f57600080fd5b61447886613cae565b9450614486602087016137e6565b935060408601359250606086013567ffffffffffffffff808211156144aa57600080fd5b818801915088601f8301126144be57600080fd5b8135818111156144cd57600080fd5b8960208285010111156144df57600080fd5b9699959850939650602001949392505050565b83815282151560208201526060604082015260006145136060830184613866565b95945050505050565b60008060008060006060868803121561453457600080fd5b61453d86613cae565b9450602086013567ffffffffffffffff8082111561455a57600080fd5b61456689838a01613bac565b9096509450604088013591508082111561457f57600080fd5b818801915088601f83011261459357600080fd5b8135818111156145a257600080fd5b8960208260061b85010111156144df57600080fd5b600080604083850312156145ca57600080fd5b6145d383613cae565b9150602083013567ffffffffffffffff8111156145ef57600080fd5b830160a0818603121561460157600080fd5b809150509250929050565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461380a57600080fd5b6000602080838503121561464f57600080fd5b823567ffffffffffffffff81111561466657600080fd5b8301601f8101851361467757600080fd5b8035614685613adc82613a60565b81815261024091820283018401918482019190888411156146a557600080fd5b938501935b83851015613ba057848903818112156146c35760008081fd5b6146cb6139a1565b6146d487613cae565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156147095760008081fd5b6147116139ed565b925061471e898901613eb6565b8352604061472d818a01613e96565b8a850152606061473e818b01613e82565b8286015260809150614751828b01613e82565b9085015260a06147628a8201613e82565b8286015260c09150614775828b01613e96565b9085015260e06147868a8201613e82565b82860152610100915061479a828b01613e96565b908501526101206147ac8a8201613e96565b8286015261014091506147c0828b01613e96565b908501526101606147d28a8201613e82565b8286015261018091506147e6828b01613e82565b908501526101a06147f88a8201613e82565b828601526101c0915061480c828b01613cae565b908501526101e061481e8a8201613e82565b828601526102009150614832828b01613eb6565b9085015261484189830161460c565b908401525080880191909152835293840193918501916146aa565b6000806040838503121561486f57600080fd5b614878836137e6565b915061420460208401613cae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610eea57610eea614886565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261493c57600080fd5b83018035915067ffffffffffffffff82111561495757600080fd5b6020019150600681901b3603821315611b8357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461380a57600080fd5b6000604082840312156149dc57600080fd5b6149e46139a1565b6149ed836137e6565b81526149fb6020840161499e565b60208201529392505050565b600060408284031215614a1957600080fd5b614a216139a1565b6149ed83613cae565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614a5e57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614a9d57600080fd5b83018035915067ffffffffffffffff821115614ab857600080fd5b602001915036819003821315611b8357600080fd5b80820180821115610eea57610eea614886565b81810381811115610eea57610eea614886565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015613e7a5760049490940360031b84901b1690921692915050565b60008085851115614b4957600080fd5b83861115614b5657600080fd5b5050820193919092039150565b600060408284031215614b7557600080fd5b614b7d6139a1565b8251815260208301516149fb81613ea8565b600060208284031215614ba157600080fd5b5051919050565b805169ffffffffffffffffffff8116811461380a57600080fd5b600080600080600060a08688031215614bda57600080fd5b614be386614ba8565b9450602086015193506040860151925060608601519150614c0660808701614ba8565b90509295509295909350565b600060208284031215614c2457600080fd5b8151610b4481613a84565b60ff8181168382160190811115610eea57610eea614886565b60ff8281168282160390811115610eea57610eea614886565b600181815b80851115614cba57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ca057614ca0614886565b80851615614cad57918102915b93841c9390800290614c66565b509250929050565b600082614cd157506001610eea565b81614cde57506000610eea565b8160018114614cf45760028114614cfe57614d1a565b6001915050610eea565b60ff841115614d0f57614d0f614886565b50506001821b610eea565b5060208310610133831016604e8410600b8410161715614d3d575081810a610eea565b614d478383614c61565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d7957614d79614886565b029392505050565b6000610b4460ff841683614cc2565b600060408284031215614da257600080fd5b614daa6139a1565b614db3836137e6565b8152602083013560208201528091505092915050565b63ffffffff8181168382160190808211156137df576137df614886565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
+ ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structPriceRegistry.StaticConfig\",\"name\":\"staticConfig\",\"type\":\"tuple\"},{\"internalType\":\"address[]\",\"name\":\"priceUpdaters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokens\",\"type\":\"address[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeeds\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structPriceRegistry.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"chain\",\"type\":\"uint64\"}],\"name\":\"ChainNotSupported\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DataFeedValueOutOfUint224Range\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"DestinationChainNotEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ExtraArgOutOfOrderExecutionMustBeTrue\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"}],\"name\":\"InvalidDestBytesOverhead\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"InvalidDestChainConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"encodedAddress\",\"type\":\"bytes\"}],\"name\":\"InvalidEVMAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidExtraArgsTag\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidStaticConfig\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint256\"}],\"name\":\"MessageFeeTooHigh\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MessageGasLimitTooHigh\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"maxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"actualSize\",\"type\":\"uint256\"}],\"name\":\"MessageTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SourceTokenDataTooLarge\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"timePassed\",\"type\":\"uint256\"}],\"name\":\"StaleGasPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenNotSupported\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"UnauthorizedCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UnsupportedNumberOfTokens\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"AuthorizedCallerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"name\":\"DestChainConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"}],\"name\":\"FeeTokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"name\":\"PremiumMultiplierWeiPerEthUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"indexed\":false,\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"priceFeedConfig\",\"type\":\"tuple\"}],\"name\":\"PriceFeedPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"TokenTransferFeeConfigDeleted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"indexed\":false,\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"name\":\"TokenTransferFeeConfigUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerTokenUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"destChain\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"name\":\"UsdPerUnitGasUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address[]\",\"name\":\"addedCallers\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"removedCallers\",\"type\":\"address[]\"}],\"internalType\":\"structAuthorizedCallers.AuthorizedCallerArgs\",\"name\":\"authorizedCallerArgs\",\"type\":\"tuple\"}],\"name\":\"applyAuthorizedCallerUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"destChainConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.DestChainConfigArgs[]\",\"name\":\"destChainConfigArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyDestChainConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"feeTokensToAdd\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"feeTokensToRemove\",\"type\":\"address[]\"}],\"name\":\"applyFeeTokensUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"internalType\":\"structPriceRegistry.PremiumMultiplierWeiPerEthArgs[]\",\"name\":\"premiumMultiplierWeiPerEthArgs\",\"type\":\"tuple[]\"}],\"name\":\"applyPremiumMultiplierWeiPerEthUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigSingleTokenArgs[]\",\"name\":\"tokenTransferFeeConfigs\",\"type\":\"tuple[]\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigArgs[]\",\"name\":\"tokenTransferFeeConfigArgs\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfigRemoveArgs[]\",\"name\":\"tokensToUseDefaultFeeConfigs\",\"type\":\"tuple[]\"}],\"name\":\"applyTokenTransferFeeConfigUpdates\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"fromToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"fromTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"toToken\",\"type\":\"address\"}],\"name\":\"convertTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllAuthorizedCallers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestChainConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint16\",\"name\":\"maxNumberOfTokensPerMsg\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"maxDataBytes\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxPerMsgGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerPayloadByte\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destDataAvailabilityOverheadGas\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"destGasPerDataAvailabilityByte\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"destDataAvailabilityMultiplierBps\",\"type\":\"uint16\"},{\"internalType\":\"uint16\",\"name\":\"defaultTokenFeeUSDCents\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTokenDestBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"defaultTxGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"gasMultiplierWeiPerEth\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"networkFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"enforceOutOfOrder\",\"type\":\"bool\"},{\"internalType\":\"bytes4\",\"name\":\"chainFamilySelector\",\"type\":\"bytes4\"}],\"internalType\":\"structPriceRegistry.DestChainConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getDestinationChainGasPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getFeeTokens\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getPremiumMultiplierWeiPerEth\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"premiumMultiplierWeiPerEth\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStaticConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint96\",\"name\":\"maxFeeJuelsPerMsg\",\"type\":\"uint96\"},{\"internalType\":\"address\",\"name\":\"linkToken\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"stalenessThreshold\",\"type\":\"uint32\"}],\"internalType\":\"structPriceRegistry.StaticConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"}],\"name\":\"getTokenAndGasPrices\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"tokenPrice\",\"type\":\"uint224\"},{\"internalType\":\"uint224\",\"name\":\"gasPriceValue\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenPriceFeedConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"tokens\",\"type\":\"address[]\"}],\"name\":\"getTokenPrices\",\"outputs\":[{\"components\":[{\"internalType\":\"uint224\",\"name\":\"value\",\"type\":\"uint224\"},{\"internalType\":\"uint32\",\"name\":\"timestamp\",\"type\":\"uint32\"}],\"internalType\":\"structInternal.TimestampedPackedUint224[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getTokenTransferFeeConfig\",\"outputs\":[{\"components\":[{\"internalType\":\"uint32\",\"name\":\"minFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"maxFeeUSDCents\",\"type\":\"uint32\"},{\"internalType\":\"uint16\",\"name\":\"deciBps\",\"type\":\"uint16\"},{\"internalType\":\"uint32\",\"name\":\"destGasOverhead\",\"type\":\"uint32\"},{\"internalType\":\"uint32\",\"name\":\"destBytesOverhead\",\"type\":\"uint32\"},{\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"internalType\":\"structPriceRegistry.TokenTransferFeeConfig\",\"name\":\"tokenTransferFeeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"receiver\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"tokenAmounts\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"internalType\":\"structClient.EVM2AnyMessage\",\"name\":\"message\",\"type\":\"tuple\"}],\"name\":\"getValidatedFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"getValidatedTokenPrice\",\"outputs\":[{\"internalType\":\"uint224\",\"name\":\"\",\"type\":\"uint224\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"feeToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"feeTokenAmount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"extraArgs\",\"type\":\"bytes\"}],\"name\":\"processMessageArgs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"msgFeeJuels\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isOutOfOrderExecution\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"convertedExtraArgs\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"internalType\":\"uint224\",\"name\":\"usdPerToken\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.TokenPriceUpdate[]\",\"name\":\"tokenPriceUpdates\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"internalType\":\"uint224\",\"name\":\"usdPerUnitGas\",\"type\":\"uint224\"}],\"internalType\":\"structInternal.GasPriceUpdate[]\",\"name\":\"gasPriceUpdates\",\"type\":\"tuple[]\"}],\"internalType\":\"structInternal.PriceUpdates\",\"name\":\"priceUpdates\",\"type\":\"tuple\"}],\"name\":\"updatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"sourceToken\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"dataFeedAddress\",\"type\":\"address\"},{\"internalType\":\"uint8\",\"name\":\"tokenDecimals\",\"type\":\"uint8\"}],\"internalType\":\"structIPriceRegistry.TokenPriceFeedConfig\",\"name\":\"feedConfig\",\"type\":\"tuple\"}],\"internalType\":\"structPriceRegistry.TokenPriceFeedUpdate[]\",\"name\":\"tokenPriceFeedUpdates\",\"type\":\"tuple[]\"}],\"name\":\"updateTokenPriceFeeds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"destChainSelector\",\"type\":\"uint64\"},{\"components\":[{\"internalType\":\"bytes\",\"name\":\"sourcePoolAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"destTokenAddress\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structInternal.RampTokenAmount[]\",\"name\":\"rampTokenAmounts\",\"type\":\"tuple[]\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structClient.EVMTokenAmount[]\",\"name\":\"sourceTokenAmounts\",\"type\":\"tuple[]\"}],\"name\":\"validatePoolReturnData\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]",
+ Bin: "0x60e06040523480156200001157600080fd5b506040516200695038038062006950833981016040819052620000349162001816565b8533806000816200008c5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000bf57620000bf8162000207565b5050604080518082018252838152815160008152602080820190935291810191909152620000ee9150620002b2565b5060208701516001600160a01b0316158062000112575086516001600160601b0316155b80620001265750604087015163ffffffff16155b15620001455760405163d794ef9560e01b815260040160405180910390fd5b6020878101516001600160a01b031660a05287516001600160601b031660805260408089015163ffffffff1660c05280516000815291820190526200018c90869062000401565b620001978462000549565b620001a2816200061a565b620001ad8262000a9f565b60408051600080825260208201909252620001fa91859190620001f3565b6040805180820190915260008082526020820152815260200190600190039081620001cb5790505b5062000b6b565b5050505050505062001ad4565b336001600160a01b03821603620002615760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000083565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b602081015160005b815181101562000342576000828281518110620002db57620002db62001935565b60209081029190910101519050620002f560028262000ea4565b1562000338576040516001600160a01b03821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101620002ba565b50815160005b8151811015620003fb57600082828151811062000369576200036962001935565b6020026020010151905060006001600160a01b0316816001600160a01b031603620003a7576040516342bcdf7f60e11b815260040160405180910390fd5b620003b460028262000ec4565b506040516001600160a01b03821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a15060010162000348565b50505050565b60005b8251811015620004a2576200044083828151811062000427576200042762001935565b6020026020010151600a62000ec460201b90919060201c565b1562000499578281815181106200045b576200045b62001935565b60200260200101516001600160a01b03167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010162000404565b5060005b81518110156200054457620004e2828281518110620004c957620004c962001935565b6020026020010151600a62000ea460201b90919060201c565b156200053b57818181518110620004fd57620004fd62001935565b60200260200101516001600160a01b03167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b600101620004a6565b505050565b60005b8151811015620006165760008282815181106200056d576200056d62001935565b6020908102919091018101518051818301516001600160a01b0380831660008181526006875260409081902084518154868a018051929096166001600160a81b03199091168117600160a01b60ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a25050508060010190506200054c565b5050565b60005b8151811015620006165760008282815181106200063e576200063e62001935565b6020026020010151905060008383815181106200065f576200065f62001935565b6020026020010151600001519050600082602001519050816001600160401b03166000148062000698575061018081015163ffffffff16155b80620006ba57506102008101516001600160e01b031916630a04b54b60e21b14155b80620006d75750602063ffffffff1681610160015163ffffffff16105b80620006f75750806060015163ffffffff1681610180015163ffffffff16115b15620007225760405163c35aa79d60e01b81526001600160401b038316600482015260240162000083565b6001600160401b038216600090815260086020526040812060010154600160a81b900460e01b6001600160e01b0319169003620007a257816001600160401b03167fa937382a486d993de71c220bc8b559242deb4e286a353fa732330b4aa7d13577826040516200079491906200194b565b60405180910390a2620007e6565b816001600160401b03167fa7b607fc10d28a1caf39ab7d27f4c94945db708a576d572781a455c5894fad9382604051620007dd91906200194b565b60405180910390a25b8060086000846001600160401b03166001600160401b0316815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101a08201518160010160086101000a8154816001600160401b0302191690836001600160401b031602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c02179055509050505050508060010190506200061d565b60005b81518110156200061657600082828151811062000ac35762000ac362001935565b6020026020010151600001519050600083838151811062000ae85762000ae862001935565b6020908102919091018101518101516001600160a01b03841660008181526007845260409081902080546001600160401b0319166001600160401b0385169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a2505060010162000aa2565b60005b825181101562000dde57600083828151811062000b8f5762000b8f62001935565b6020026020010151905060008160000151905060005b82602001515181101562000dcf5760008360200151828151811062000bce5762000bce62001935565b602002602001015160200151905060008460200151838151811062000bf75762000bf762001935565b6020026020010151600001519050602063ffffffff16826080015163ffffffff16101562000c565760808201516040516312766e0160e11b81526001600160a01b038316600482015263ffffffff909116602482015260440162000083565b6001600160401b03841660008181526009602090815260408083206001600160a01b0386168085529083529281902086518154938801518389015160608a015160808b015160a08c01511515600160901b0260ff60901b1963ffffffff928316600160701b021664ffffffffff60701b199383166a01000000000000000000000263ffffffff60501b1961ffff90961668010000000000000000029590951665ffffffffffff60401b19968416640100000000026001600160401b0319909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b59062000dbc908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a3505060010162000ba5565b50505080600101905062000b6e565b5060005b81518110156200054457600082828151811062000e035762000e0362001935565b6020026020010151600001519050600083838151811062000e285762000e2862001935565b6020908102919091018101518101516001600160401b03841660008181526009845260408082206001600160a01b038516808452955280822080546001600160981b03191690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a3505060010162000de2565b600062000ebb836001600160a01b03841662000edb565b90505b92915050565b600062000ebb836001600160a01b03841662000fdf565b6000818152600183016020526040812054801562000fd457600062000f0260018362001a9c565b855490915060009062000f189060019062001a9c565b905081811462000f8457600086600001828154811062000f3c5762000f3c62001935565b906000526020600020015490508087600001848154811062000f625762000f6262001935565b6000918252602080832090910192909255918252600188019052604090208390555b855486908062000f985762000f9862001abe565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505062000ebe565b600091505062000ebe565b6000818152600183016020526040812054620010285750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000ebe565b50600062000ebe565b634e487b7160e01b600052604160045260246000fd5b604080519081016001600160401b03811182821017156200106c576200106c62001031565b60405290565b60405160c081016001600160401b03811182821017156200106c576200106c62001031565b60405161022081016001600160401b03811182821017156200106c576200106c62001031565b604051601f8201601f191681016001600160401b0381118282101715620010e857620010e862001031565b604052919050565b80516001600160a01b03811681146200110857600080fd5b919050565b805163ffffffff811681146200110857600080fd5b6000606082840312156200113557600080fd5b604051606081016001600160401b03811182821017156200115a576200115a62001031565b604052825190915081906001600160601b03811681146200117a57600080fd5b81526200118a60208401620010f0565b60208201526200119d604084016200110d565b60408201525092915050565b60006001600160401b03821115620011c557620011c562001031565b5060051b60200190565b600082601f830112620011e157600080fd5b81516020620011fa620011f483620011a9565b620010bd565b8083825260208201915060208460051b8701019350868411156200121d57600080fd5b602086015b8481101562001244576200123681620010f0565b835291830191830162001222565b509695505050505050565b600082601f8301126200126157600080fd5b8151602062001274620011f483620011a9565b828152606092830285018201928282019190878511156200129457600080fd5b8387015b85811015620013275780890382811215620012b35760008081fd5b620012bd62001047565b620012c883620010f0565b8152604080601f1984011215620012df5760008081fd5b620012e962001047565b9250620012f8888501620010f0565b835283015160ff811681146200130e5760008081fd5b8288015280870191909152845292840192810162001298565b5090979650505050505050565b80516001600160401b03811681146200110857600080fd5b805161ffff811681146200110857600080fd5b805180151581146200110857600080fd5b600082601f8301126200138257600080fd5b8151602062001395620011f483620011a9565b82815260059290921b84018101918181019086841115620013b557600080fd5b8286015b84811015620012445780516001600160401b0380821115620013da57600080fd5b908801906040601f19838c038101821315620013f557600080fd5b620013ff62001047565b6200140c89860162001334565b815282850151848111156200142057600080fd5b8086019550508c603f8601126200143657600080fd5b8885015193506200144b620011f485620011a9565b84815260e09094028501830193898101908e8611156200146a57600080fd5b958401955b858710156200154357868f0360e08112156200148a57600080fd5b6200149462001047565b6200149f89620010f0565b815260c08683011215620014b257600080fd5b620014bc62001072565b9150620014cb8d8a016200110d565b8252620014da878a016200110d565b8d830152620014ec60608a016200134c565b87830152620014fe60808a016200110d565b60608301526200151160a08a016200110d565b60808301526200152460c08a016200135f565b60a0830152808d0191909152825260e09690960195908a01906200146f565b828b015250875250505092840192508301620013b9565b600082601f8301126200156c57600080fd5b815160206200157f620011f483620011a9565b82815260069290921b840181019181810190868411156200159f57600080fd5b8286015b84811015620012445760408189031215620015be5760008081fd5b620015c862001047565b620015d382620010f0565b8152620015e285830162001334565b81860152835291830191604001620015a3565b80516001600160e01b0319811681146200110857600080fd5b600082601f8301126200162057600080fd5b8151602062001633620011f483620011a9565b82815261024092830285018201928282019190878511156200165457600080fd5b8387015b85811015620013275780890382811215620016735760008081fd5b6200167d62001047565b620016888362001334565b815261022080601f1984011215620016a05760008081fd5b620016aa62001097565b9250620016b98885016200135f565b83526040620016ca8186016200134c565b898501526060620016dd8187016200110d565b8286015260809150620016f28287016200110d565b9085015260a0620017058682016200110d565b8286015260c091506200171a8287016200134c565b9085015260e06200172d8682016200110d565b828601526101009150620017438287016200134c565b90850152610120620017578682016200134c565b8286015261014091506200176d8287016200134c565b90850152610160620017818682016200110d565b828601526101809150620017978287016200110d565b908501526101a0620017ab8682016200110d565b828601526101c09150620017c182870162001334565b908501526101e0620017d58682016200110d565b828601526102009150620017eb8287016200135f565b90850152620017fc858301620015f5565b908401525080870191909152845292840192810162001658565b6000806000806000806000610120888a0312156200183357600080fd5b6200183f898962001122565b60608901519097506001600160401b03808211156200185d57600080fd5b6200186b8b838c01620011cf565b975060808a01519150808211156200188257600080fd5b620018908b838c01620011cf565b965060a08a0151915080821115620018a757600080fd5b620018b58b838c016200124f565b955060c08a0151915080821115620018cc57600080fd5b620018da8b838c0162001370565b945060e08a0151915080821115620018f157600080fd5b620018ff8b838c016200155a565b93506101008a01519150808211156200191757600080fd5b50620019268a828b016200160e565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b815115158152610220810160208301516200196c602084018261ffff169052565b50604083015162001985604084018263ffffffff169052565b5060608301516200199e606084018263ffffffff169052565b506080830151620019b7608084018263ffffffff169052565b5060a0830151620019ce60a084018261ffff169052565b5060c0830151620019e760c084018263ffffffff169052565b5060e0830151620019fe60e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501518216908401526101a0808501516001600160401b0316908401526101c080850151909116908301526101e080840151151590830152610200928301516001600160e01b031916929091019190915290565b8181038181111562000ebe57634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b60805160a05160c051614e2262001b2e600039600081816102d901528181611ad30152611b3c01526000818161029d0152818161104e01526110ae015260008181610269015281816110d701526111470152614e226000f3fe608060405234801561001057600080fd5b50600436106101b85760003560e01c80637afac322116100f9578063cc88924c11610097578063d8694ccd11610071578063d8694ccd14610a5c578063f2fde38b14610a6f578063f700042a14610a82578063ffdb4b3714610a9557600080fd5b8063cc88924c14610a2e578063cdc73d5114610a41578063d02641a014610a4957600080fd5b806391a2749a116100d357806391a2749a14610939578063a69c64c01461094c578063bf78e03f1461095f578063c4276bfc14610a0c57600080fd5b80637afac3221461078e57806382b49eb0146107a15780638da5cb5b1461091157600080fd5b8063407e108611610166578063514e8cff11610140578063514e8cff146104385780636def4ce7146104db578063770e2dc41461077357806379ba50971461078657600080fd5b8063407e1086146103c557806345ac924d146103d85780634ab35b0b146103f857600080fd5b8063181f5a7711610197578063181f5a77146103525780632451a6271461039b5780633937306f146103b057600080fd5b806241e5be146101bd578063061877e3146101e357806306285c691461023c575b600080fd5b6101d06101cb36600461380f565b610add565b6040519081526020015b60405180910390f35b6102236101f136600461384b565b73ffffffffffffffffffffffffffffffffffffffff1660009081526007602052604090205467ffffffffffffffff1690565b60405167ffffffffffffffff90911681526020016101da565b610306604080516060810182526000808252602082018190529181019190915260405180606001604052807f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1681526020017f000000000000000000000000000000000000000000000000000000000000000063ffffffff16815250905090565b6040805182516bffffffffffffffffffffffff16815260208084015173ffffffffffffffffffffffffffffffffffffffff16908201529181015163ffffffff16908201526060016101da565b61038e6040518060400160405280601781526020017f5072696365526567697374727920312e362e302d64657600000000000000000081525081565b6040516101da91906138ca565b6103a3610b4b565b6040516101da91906138dd565b6103c36103be366004613937565b610b5c565b005b6103c36103d3366004613a93565b610e11565b6103eb6103e6366004613bf1565b610e25565b6040516101da9190613c33565b61040b61040636600461384b565b610ef0565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff90911681526020016101da565b6104ce610446366004613cc6565b60408051808201909152600080825260208201525067ffffffffffffffff166000908152600460209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b6040516101da9190613ce1565b6107666104e9366004613cc6565b6040805161022081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081018290526102008101919091525067ffffffffffffffff908116600090815260086020908152604091829020825161022081018452815460ff8082161515835261ffff61010080840482169685019690965263ffffffff630100000084048116978501979097526701000000000000008304871660608501526b0100000000000000000000008304871660808501526f010000000000000000000000000000008304811660a0850152710100000000000000000000000000000000008304871660c08501527501000000000000000000000000000000000000000000808404821660e08087019190915277010000000000000000000000000000000000000000000000850483169786019790975279010000000000000000000000000000000000000000000000000084049091166101208501527b010000000000000000000000000000000000000000000000000000009092048616610140840152600190930154808616610160840152640100000000810486166101808401526801000000000000000081049096166101a083015270010000000000000000000000000000000086049094166101c082015274010000000000000000000000000000000000000000850490911615156101e08201527fffffffff0000000000000000000000000000000000000000000000000000000092909304901b1661020082015290565b6040516101da9190613d1c565b6103c3610781366004613f59565b610efb565b6103c3610f11565b6103c361079c366004614273565b611013565b6108b16107af3660046142d7565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a08101919091525067ffffffffffffffff91909116600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff94909416835292815290829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a082015290565b6040516101da9190600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60005460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101da565b6103c3610947366004614301565b611025565b6103c361095a366004614392565b611036565b6109d861096d36600461384b565b6040805180820182526000808252602091820181905273ffffffffffffffffffffffffffffffffffffffff93841681526006825282902082518084019093525492831682527401000000000000000000000000000000000000000090920460ff169181019190915290565b60408051825173ffffffffffffffffffffffffffffffffffffffff16815260209283015160ff1692810192909252016101da565b610a1f610a1a366004614457565b611047565b6040516101da939291906144f2565b6103c3610a3c36600461451c565b611245565b6103a361141b565b6104ce610a5736600461384b565b611427565b6101d0610a6a3660046145b7565b611523565b6103c3610a7d36600461384b565b6119dd565b6103c3610a9036600461463c565b6119ee565b610aa8610aa336600461485c565b6119ff565b604080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9384168152929091166020830152016101da565b6000610ae882611b8a565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16610b0f85611b8a565b610b37907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16856148b5565b610b4191906148cc565b90505b9392505050565b6060610b576002611c24565b905090565b610b64611c31565b6000610b708280614907565b9050905060005b81811015610cba576000610b8b8480614907565b83818110610b9b57610b9b61496f565b905060400201803603810190610bb191906149ca565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885173ffffffffffffffffffffffffffffffffffffffff9081166000908152600590975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927f52f50aa6d1a95a4595361ecf953d095f125d442e4673716dede699e049de148a92610ca99290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610b77565b506000610cca6020840184614907565b9050905060005b81811015610e0b576000610ce86020860186614907565b83818110610cf857610cf861496f565b905060400201803603810190610d0e9190614a07565b604080518082018252602080840180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff908116845263ffffffff42818116858701908152885167ffffffffffffffff9081166000908152600490975295889020965190519092167c010000000000000000000000000000000000000000000000000000000002919092161790935584519051935194955016927fdd84a3fa9ef9409f550d54d6affec7e9c480c878c6ab27b78912a03e1b371c6e92610dfa9290917bffffffffffffffffffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b60405180910390a250600101610cd1565b50505050565b610e19611c76565b610e2281611cf7565b50565b60608160008167ffffffffffffffff811115610e4357610e43613972565b604051908082528060200260200182016040528015610e8857816020015b6040805180820190915260008082526020820152815260200190600190039081610e615790505b50905060005b82811015610ee557610ec0868683818110610eab57610eab61496f565b9050602002016020810190610a57919061384b565b828281518110610ed257610ed261496f565b6020908102919091010152600101610e8e565b509150505b92915050565b6000610eea82611b8a565b610f03611c76565b610f0d8282611df5565b5050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b61101b611c76565b610f0d8282612207565b61102d611c76565b610e228161234e565b61103e611c76565b610e22816124da565b60008060607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16036110a7578592506110d5565b6110d287877f0000000000000000000000000000000000000000000000000000000000000000610add565b92505b7f00000000000000000000000000000000000000000000000000000000000000006bffffffffffffffffffffffff16831115611174576040517f6a92a483000000000000000000000000000000000000000000000000000000008152600481018490526bffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166024820152604401610f8e565b67ffffffffffffffff8816600090815260086020526040812060010154640100000000900463ffffffff16906111ab8787846125c4565b9050806020015193508484611232836040805182516024820152602092830151151560448083019190915282518083039091018152606490910190915290810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f181dcf100000000000000000000000000000000000000000000000000000000017905290565b9450945094505050955095509592505050565b67ffffffffffffffff85166000908152600860205260408120600101547501000000000000000000000000000000000000000000900460e01b905b8481101561141257600084848381811061129c5761129c61496f565b6112b2926020604090920201908101915061384b565b905060008787848181106112c8576112c861496f565b90506020028101906112da9190614a2a565b6112e8906040810190614a68565b91505060208111156113985767ffffffffffffffff8916600090815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546e010000000000000000000000000000900463ffffffff16811115611398576040517f36f536ca00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610f8e565b611408848989868181106113ae576113ae61496f565b90506020028101906113c09190614a2a565b6113ce906020810190614a68565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061276d92505050565b5050600101611280565b50505050505050565b6060610b57600a611c24565b604080518082019091526000808252602082015273ffffffffffffffffffffffffffffffffffffffff8281166000908152600660209081526040918290208251808401909352549283168083527401000000000000000000000000000000000000000090930460ff16908201529061151a57505073ffffffffffffffffffffffffffffffffffffffff166000908152600560209081526040918290208251808401909352547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811683527c0100000000000000000000000000000000000000000000000000000000900463ffffffff169082015290565b610b44816127bf565b67ffffffffffffffff8083166000908152600860209081526040808320815161022081018352815460ff808216151580845261ffff61010080850482169886019890985263ffffffff630100000085048116978601979097526701000000000000008404871660608601526b0100000000000000000000008404871660808601526f010000000000000000000000000000008404811660a0860152710100000000000000000000000000000000008404871660c08601527501000000000000000000000000000000000000000000808504821660e08088019190915277010000000000000000000000000000000000000000000000860483169987019990995279010000000000000000000000000000000000000000000000000085049091166101208601527b010000000000000000000000000000000000000000000000000000009093048616610140850152600190940154808616610160850152640100000000810486166101808501526801000000000000000081049098166101a084015270010000000000000000000000000000000088049094166101c083015274010000000000000000000000000000000000000000870490931615156101e08201527fffffffff000000000000000000000000000000000000000000000000000000009290950490921b16610200840152909190611759576040517f99ac52f200000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610f8e565b60006117686040850185614907565b91506117c490508261177d6020870187614a68565b90508361178a8880614a68565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612a0292505050565b60006007816117d9608088016060890161384b565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160009081205467ffffffffffffffff169150806118286118226080890160608a0161384b565b896119ff565b909250905060008080861561186e57611862888c61184c60808e0160608f0161384b565b888e806040019061185d9190614907565b612aac565b9194509250905061188e565b6101c088015161188b9063ffffffff16662386f26fc100006148b5565b92505b61010088015160009061ffff16156118d2576118cf896dffffffffffffffffffffffffffff607088901c166118c660208f018f614a68565b90508b86612d8a565b90505b6101a089015160009067ffffffffffffffff166118fb6118f560808f018f614a68565b8d612e3a565b600001518563ffffffff168c60a0015161ffff168f806020019061191f9190614a68565b61192a9291506148b5565b8d6080015163ffffffff1661193f9190614acd565b6119499190614acd565b6119539190614acd565b61196d906dffffffffffffffffffffffffffff89166148b5565b61197791906148b5565b90507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff871682826119ae67ffffffffffffffff8c16896148b5565b6119b89190614acd565b6119c29190614acd565b6119cc91906148cc565b9d9c50505050505050505050505050565b6119e5611c76565b610e2281612efb565b6119f6611c76565b610e2281612ff0565b67ffffffffffffffff811660009081526004602090815260408083208151808301909252547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff811682527c0100000000000000000000000000000000000000000000000000000000900463ffffffff1691810182905282918203611ab7576040517f2e59db3a00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff85166004820152602401610f8e565b6000816020015163ffffffff1642611acf9190614ae0565b90507f000000000000000000000000000000000000000000000000000000000000000063ffffffff16811115611b70576040517ff08bcb3e00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff8616600482015263ffffffff7f000000000000000000000000000000000000000000000000000000000000000016602482015260448101829052606401610f8e565b611b7986611b8a565b9151919350909150505b9250929050565b600080611b9683611427565b9050806020015163ffffffff1660001480611bce575080517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16155b15611c1d576040517f06439c6b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610f8e565b5192915050565b60606000610b44836134de565b611c3c60023361353a565b611c74576040517fd86ad9cf000000000000000000000000000000000000000000000000000000008152336004820152602401610f8e565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610f8e565b60005b8151811015610f0d576000828281518110611d1757611d1761496f565b60209081029190910181015180518183015173ffffffffffffffffffffffffffffffffffffffff80831660008181526006875260409081902084518154868a018051929096167fffffffffffffffffffffff00000000000000000000000000000000000000000090911681177401000000000000000000000000000000000000000060ff9384160217909255825191825293519093169683019690965293955091939092917f08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464910160405180910390a2505050806001019050611cfa565b60005b825181101561211e576000838281518110611e1557611e1561496f565b6020026020010151905060008160000151905060005b82602001515181101561211057600083602001518281518110611e5057611e5061496f565b6020026020010151602001519050600084602001518381518110611e7657611e7661496f565b6020026020010151600001519050602063ffffffff16826080015163ffffffff161015611ef95760808201516040517f24ecdc0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015263ffffffff9091166024820152604401610f8e565b67ffffffffffffffff8416600081815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168085529083529281902086518154938801518389015160608a015160808b015160a08c015115157201000000000000000000000000000000000000027fffffffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffff63ffffffff9283166e01000000000000000000000000000002167fffffffffffffffffffffffffff0000000000ffffffffffffffffffffffffffff9383166a0100000000000000000000027fffffffffffffffffffffffffffffffffffff00000000ffffffffffffffffffff61ffff9096166801000000000000000002959095167fffffffffffffffffffffffffffffffffffff000000000000ffffffffffffffff968416640100000000027fffffffffffffffffffffffffffffffffffffffffffffffff0000000000000000909b16939097169290921798909817939093169390931717919091161792909217909155519091907f94967ae9ea7729ad4f54021c1981765d2b1d954f7c92fbec340aa0a54f46b8b5906120fe908690600060c08201905063ffffffff80845116835280602085015116602084015261ffff60408501511660408401528060608501511660608401528060808501511660808401525060a0830151151560a083015292915050565b60405180910390a35050600101611e2b565b505050806001019050611df8565b5060005b815181101561220257600082828151811061213f5761213f61496f565b602002602001015160000151905060008383815181106121615761216161496f565b60209081029190910181015181015167ffffffffffffffff8416600081815260098452604080822073ffffffffffffffffffffffffffffffffffffffff8516808452955280822080547fffffffffffffffffffffffffff000000000000000000000000000000000000001690555192945090917f4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b9190a35050600101612122565b505050565b60005b82518110156122aa576122408382815181106122285761222861496f565b6020026020010151600a61356990919063ffffffff16565b156122a2578281815181106122575761225761496f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167fdf1b1bd32a69711488d71554706bb130b1fc63a5fa1a2cd85e8440f84065ba2360405160405180910390a25b60010161220a565b5060005b8151811015612202576122e48282815181106122cc576122cc61496f565b6020026020010151600a61358b90919063ffffffff16565b15612346578181815181106122fb576122fb61496f565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f1795838dc8ab2ffc5f431a1729a6afa0b587f982f7b2be0b9d7187a1ef547f9160405160405180910390a25b6001016122ae565b602081015160005b81518110156123e95760008282815181106123735761237361496f565b6020026020010151905061239181600261358b90919063ffffffff16565b156123e05760405173ffffffffffffffffffffffffffffffffffffffff821681527fc3803387881faad271c47728894e3e36fac830ffc8602ca6fc07733cbda775809060200160405180910390a15b50600101612356565b50815160005b8151811015610e0b57600082828151811061240c5761240c61496f565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361247c576040517f8579befe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612487600282613569565b5060405173ffffffffffffffffffffffffffffffffffffffff821681527feb1b9b92e50b7f88f9ff25d56765095ac6e91540eee214906f4036a908ffbdef9060200160405180910390a1506001016123ef565b60005b8151811015610f0d5760008282815181106124fa576124fa61496f565b6020026020010151600001519050600083838151811061251c5761251c61496f565b60209081029190910181015181015173ffffffffffffffffffffffffffffffffffffffff841660008181526007845260409081902080547fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000001667ffffffffffffffff85169081179091559051908152919350917fbb77da6f7210cdd16904228a9360133d1d7dfff99b1bc75f128da5b53e28f97d910160405180910390a250506001016124dd565b6040805180820190915260008082526020820152600083900361260557506040805180820190915267ffffffffffffffff8216815260006020820152610b44565b60006126118486614af3565b905060006126228560048189614b39565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509293505050507fffffffff0000000000000000000000000000000000000000000000000000000082167fe7e230f000000000000000000000000000000000000000000000000000000000016126bf57808060200190518101906126b69190614b63565b92505050610b44565b7f6859a837000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083160161273b576040518060400160405280828060200190518101906127279190614b8f565b815260006020909101529250610b44915050565b6040517f5247fdce00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd7ed2ad4000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831601610f0d57612202816135ad565b604080518082019091526000808252602082015260008260000151905060008173ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015612829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061284d9190614bc2565b505050915050600081121561288e576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000819050600085602001518473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156128e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129099190614c12565b6129139190614c2f565b905060248160ff1611156129485761292c602482614c48565b61293790600a614d81565b61294190836148cc565b915061296b565b612953816024614c48565b61295e90600a614d81565b61296890836148b5565b91505b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8211156129c1576040517f10cb51d100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50604080518082019091527bffffffffffffffffffffffffffffffffffffffffffffffffffffffff909116815263ffffffff42166020820152949350505050565b836040015163ffffffff16831115612a5b5760408085015190517f8693378900000000000000000000000000000000000000000000000000000000815263ffffffff909116600482015260248101849052604401610f8e565b836020015161ffff16821115612a9d576040517f4c056b6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e0b8461020001518261276d565b6000808083815b81811015612d7c576000878783818110612acf57612acf61496f565b905060400201803603810190612ae59190614d90565b67ffffffffffffffff8c166000908152600960209081526040808320845173ffffffffffffffffffffffffffffffffffffffff168452825291829020825160c081018452905463ffffffff8082168352640100000000820481169383019390935268010000000000000000810461ffff16938201939093526a01000000000000000000008304821660608201526e01000000000000000000000000000083049091166080820152720100000000000000000000000000000000000090910460ff16151560a0820181905291925090612c0b576101208d0151612bd29061ffff16662386f26fc100006148b5565b612bdc9088614acd565b96508c610140015186612bef9190614dc9565b95508c610160015185612c029190614dc9565b94505050612d74565b604081015160009061ffff1615612cc45760008c73ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1614612c67578351612c6090611b8a565b9050612c6a565b508a5b620186a0836040015161ffff16612cac8660200151847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661366090919063ffffffff16565b612cb691906148b5565b612cc091906148cc565b9150505b6060820151612cd39088614dc9565b9650816080015186612ce59190614dc9565b8251909650600090612d049063ffffffff16662386f26fc100006148b5565b905080821015612d2357612d18818a614acd565b985050505050612d74565b6000836020015163ffffffff16662386f26fc10000612d4291906148b5565b905080831115612d6257612d56818b614acd565b99505050505050612d74565b612d6c838b614acd565b995050505050505b600101612ab3565b505096509650969350505050565b60008063ffffffff8316612da0610140866148b5565b612dac876101c0614acd565b612db69190614acd565b612dc09190614acd565b905060008760c0015163ffffffff168860e0015161ffff1683612de391906148b5565b612ded9190614acd565b61010089015190915061ffff16612e146dffffffffffffffffffffffffffff8916836148b5565b612e1e91906148b5565b612e2e90655af3107a40006148b5565b98975050505050505050565b60408051808201909152600080825260208201526000612e66858585610180015163ffffffff166125c4565b9050826060015163ffffffff1681600001511115612eb0576040517f4c4fc93a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826101e001518015612ec457508060200151155b15610b41576040517fee433e9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff821603612f7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610f8e565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60005b8151811015610f0d5760008282815181106130105761301061496f565b60200260200101519050600083838151811061302e5761302e61496f565b60200260200101516000015190506000826020015190508167ffffffffffffffff1660001480613067575061018081015163ffffffff16155b806130b957506102008101517fffffffff00000000000000000000000000000000000000000000000000000000167f2812d52c0000000000000000000000000000000000000000000000000000000014155b806130d55750602063ffffffff1681610160015163ffffffff16105b806130f45750806060015163ffffffff1681610180015163ffffffff16115b15613137576040517fc35aa79d00000000000000000000000000000000000000000000000000000000815267ffffffffffffffff83166004820152602401610f8e565b67ffffffffffffffff82166000908152600860205260408120600101547501000000000000000000000000000000000000000000900460e01b7fffffffff000000000000000000000000000000000000000000000000000000001690036131df578167ffffffffffffffff167fa937382a486d993de71c220bc8b559242deb4e286a353fa732330b4aa7d13577826040516131d29190613d1c565b60405180910390a2613222565b8167ffffffffffffffff167fa7b607fc10d28a1caf39ab7d27f4c94945db708a576d572781a455c5894fad93826040516132199190613d1c565b60405180910390a25b80600860008467ffffffffffffffff1667ffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548160ff02191690831515021790555060208201518160000160016101000a81548161ffff021916908361ffff16021790555060408201518160000160036101000a81548163ffffffff021916908363ffffffff16021790555060608201518160000160076101000a81548163ffffffff021916908363ffffffff160217905550608082015181600001600b6101000a81548163ffffffff021916908363ffffffff16021790555060a082015181600001600f6101000a81548161ffff021916908361ffff16021790555060c08201518160000160116101000a81548163ffffffff021916908363ffffffff16021790555060e08201518160000160156101000a81548161ffff021916908361ffff1602179055506101008201518160000160176101000a81548161ffff021916908361ffff1602179055506101208201518160000160196101000a81548161ffff021916908361ffff16021790555061014082015181600001601b6101000a81548163ffffffff021916908363ffffffff1602179055506101608201518160010160006101000a81548163ffffffff021916908363ffffffff1602179055506101808201518160010160046101000a81548163ffffffff021916908363ffffffff1602179055506101a08201518160010160086101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506101c08201518160010160106101000a81548163ffffffff021916908363ffffffff1602179055506101e08201518160010160146101000a81548160ff0219169083151502179055506102008201518160010160156101000a81548163ffffffff021916908360e01c0217905550905050505050806001019050612ff3565b60608160000180548060200260200160405190810160405280929190818152602001828054801561352e57602002820191906000526020600020905b81548152602001906001019080831161351a575b50505050509050919050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001830160205260408120541515610b44565b6000610b448373ffffffffffffffffffffffffffffffffffffffff841661369d565b6000610b448373ffffffffffffffffffffffffffffffffffffffff84166136ec565b600081516020146135ec57816040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610f8e91906138ca565b6000828060200190518101906136029190614b8f565b905073ffffffffffffffffffffffffffffffffffffffff811180613627575061040081105b15610eea57826040517f8d666f60000000000000000000000000000000000000000000000000000000008152600401610f8e91906138ca565b6000670de0b6b3a7640000613693837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff86166148b5565b610b4491906148cc565b60008181526001830160205260408120546136e457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610eea565b506000610eea565b600081815260018301602052604081205480156137d5576000613710600183614ae0565b855490915060009061372490600190614ae0565b90508181146137895760008660000182815481106137445761374461496f565b90600052602060002001549050808760000184815481106137675761376761496f565b6000918252602080832090910192909255918252600188019052604090208390555b855486908061379a5761379a614de6565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610eea565b6000915050610eea565b5092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461380a57600080fd5b919050565b60008060006060848603121561382457600080fd5b61382d846137e6565b925060208401359150613842604085016137e6565b90509250925092565b60006020828403121561385d57600080fd5b610b44826137e6565b6000815180845260005b8181101561388c57602081850181015186830182015201613870565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081526000610b446020830184613866565b6020808252825182820181905260009190848201906040850190845b8181101561392b57835173ffffffffffffffffffffffffffffffffffffffff16835292840192918401916001016138f9565b50909695505050505050565b60006020828403121561394957600080fd5b813567ffffffffffffffff81111561396057600080fd5b820160408185031215610b4457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156139c4576139c4613972565b60405290565b60405160c0810167ffffffffffffffff811182821017156139c4576139c4613972565b604051610220810167ffffffffffffffff811182821017156139c4576139c4613972565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613a5857613a58613972565b604052919050565b600067ffffffffffffffff821115613a7a57613a7a613972565b5060051b60200190565b60ff81168114610e2257600080fd5b60006020808385031215613aa657600080fd5b823567ffffffffffffffff811115613abd57600080fd5b8301601f81018513613ace57600080fd5b8035613ae1613adc82613a60565b613a11565b81815260609182028301840191848201919088841115613b0057600080fd5b938501935b83851015613ba05784890381811215613b1e5760008081fd5b613b266139a1565b613b2f876137e6565b81526040807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe084011215613b635760008081fd5b613b6b6139a1565b9250613b788989016137e6565b8352870135613b8681613a84565b828901528088019190915283529384019391850191613b05565b50979650505050505050565b60008083601f840112613bbe57600080fd5b50813567ffffffffffffffff811115613bd657600080fd5b6020830191508360208260051b8501011115611b8357600080fd5b60008060208385031215613c0457600080fd5b823567ffffffffffffffff811115613c1b57600080fd5b613c2785828601613bac565b90969095509350505050565b602080825282518282018190526000919060409081850190868401855b82811015613ca157613c9184835180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16825260209081015163ffffffff16910152565b9284019290850190600101613c50565b5091979650505050505050565b803567ffffffffffffffff8116811461380a57600080fd5b600060208284031215613cd857600080fd5b610b4482613cae565b81517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815260208083015163ffffffff169082015260408101610eea565b81511515815261022081016020830151613d3c602084018261ffff169052565b506040830151613d54604084018263ffffffff169052565b506060830151613d6c606084018263ffffffff169052565b506080830151613d84608084018263ffffffff169052565b5060a0830151613d9a60a084018261ffff169052565b5060c0830151613db260c084018263ffffffff169052565b5060e0830151613dc860e084018261ffff169052565b506101008381015161ffff9081169184019190915261012080850151909116908301526101408084015163ffffffff9081169184019190915261016080850151821690840152610180808501518216908401526101a08085015167ffffffffffffffff16908401526101c080850151909116908301526101e080840151151590830152610200808401517fffffffff000000000000000000000000000000000000000000000000000000008116828501525b505092915050565b803563ffffffff8116811461380a57600080fd5b803561ffff8116811461380a57600080fd5b8015158114610e2257600080fd5b803561380a81613ea8565b600082601f830112613ed257600080fd5b81356020613ee2613adc83613a60565b82815260069290921b84018101918181019086841115613f0157600080fd5b8286015b84811015613f4e5760408189031215613f1e5760008081fd5b613f266139a1565b613f2f82613cae565b8152613f3c8583016137e6565b81860152835291830191604001613f05565b509695505050505050565b60008060408385031215613f6c57600080fd5b67ffffffffffffffff83351115613f8257600080fd5b83601f843585010112613f9457600080fd5b613fa4613adc8435850135613a60565b8335840180358083526020808401939260059290921b90910101861015613fca57600080fd5b602085358601015b85358601803560051b016020018110156141d75767ffffffffffffffff81351115613ffc57600080fd5b8035863587010160407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0828a0301121561403557600080fd5b61403d6139a1565b61404960208301613cae565b815267ffffffffffffffff6040830135111561406457600080fd5b88603f60408401358401011261407957600080fd5b61408f613adc6020604085013585010135613a60565b6020604084810135850182810135808552928401939260e00201018b10156140b657600080fd5b6040808501358501015b6040858101358601602081013560e00201018110156141b85760e0818d0312156140e957600080fd5b6140f16139a1565b6140fa826137e6565b815260c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0838f0301121561412e57600080fd5b6141366139ca565b61414260208401613e82565b815261415060408401613e82565b602082015261416160608401613e96565b604082015261417260808401613e82565b606082015261418360a08401613e82565b608082015261419560c0840135613ea8565b60c083013560a0820152602082810191909152908452929092019160e0016140c0565b5080602084015250508085525050602083019250602081019050613fd2565b5092505067ffffffffffffffff602084013511156141f457600080fd5b6142048460208501358501613ec1565b90509250929050565b600082601f83011261421e57600080fd5b8135602061422e613adc83613a60565b8083825260208201915060208460051b87010193508684111561425057600080fd5b602086015b84811015613f4e57614266816137e6565b8352918301918301614255565b6000806040838503121561428657600080fd5b823567ffffffffffffffff8082111561429e57600080fd5b6142aa8683870161420d565b935060208501359150808211156142c057600080fd5b506142cd8582860161420d565b9150509250929050565b600080604083850312156142ea57600080fd5b6142f383613cae565b9150614204602084016137e6565b60006020828403121561431357600080fd5b813567ffffffffffffffff8082111561432b57600080fd5b908301906040828603121561433f57600080fd5b6143476139a1565b82358281111561435657600080fd5b6143628782860161420d565b82525060208301358281111561437757600080fd5b6143838782860161420d565b60208301525095945050505050565b600060208083850312156143a557600080fd5b823567ffffffffffffffff8111156143bc57600080fd5b8301601f810185136143cd57600080fd5b80356143db613adc82613a60565b81815260069190911b820183019083810190878311156143fa57600080fd5b928401925b8284101561444c57604084890312156144185760008081fd5b6144206139a1565b614429856137e6565b8152614436868601613cae565b81870152825260409390930192908401906143ff565b979650505050505050565b60008060008060006080868803121561446f57600080fd5b61447886613cae565b9450614486602087016137e6565b935060408601359250606086013567ffffffffffffffff808211156144aa57600080fd5b818801915088601f8301126144be57600080fd5b8135818111156144cd57600080fd5b8960208285010111156144df57600080fd5b9699959850939650602001949392505050565b83815282151560208201526060604082015260006145136060830184613866565b95945050505050565b60008060008060006060868803121561453457600080fd5b61453d86613cae565b9450602086013567ffffffffffffffff8082111561455a57600080fd5b61456689838a01613bac565b9096509450604088013591508082111561457f57600080fd5b818801915088601f83011261459357600080fd5b8135818111156145a257600080fd5b8960208260061b85010111156144df57600080fd5b600080604083850312156145ca57600080fd5b6145d383613cae565b9150602083013567ffffffffffffffff8111156145ef57600080fd5b830160a0818603121561460157600080fd5b809150509250929050565b80357fffffffff000000000000000000000000000000000000000000000000000000008116811461380a57600080fd5b6000602080838503121561464f57600080fd5b823567ffffffffffffffff81111561466657600080fd5b8301601f8101851361467757600080fd5b8035614685613adc82613a60565b81815261024091820283018401918482019190888411156146a557600080fd5b938501935b83851015613ba057848903818112156146c35760008081fd5b6146cb6139a1565b6146d487613cae565b8152610220807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0840112156147095760008081fd5b6147116139ed565b925061471e898901613eb6565b8352604061472d818a01613e96565b8a850152606061473e818b01613e82565b8286015260809150614751828b01613e82565b9085015260a06147628a8201613e82565b8286015260c09150614775828b01613e96565b9085015260e06147868a8201613e82565b82860152610100915061479a828b01613e96565b908501526101206147ac8a8201613e96565b8286015261014091506147c0828b01613e96565b908501526101606147d28a8201613e82565b8286015261018091506147e6828b01613e82565b908501526101a06147f88a8201613e82565b828601526101c0915061480c828b01613cae565b908501526101e061481e8a8201613e82565b828601526102009150614832828b01613eb6565b9085015261484189830161460c565b908401525080880191909152835293840193918501916146aa565b6000806040838503121561486f57600080fd5b614878836137e6565b915061420460208401613cae565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082028115828204841417610eea57610eea614886565b600082614902577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261493c57600080fd5b83018035915067ffffffffffffffff82111561495757600080fd5b6020019150600681901b3603821315611b8357600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461380a57600080fd5b6000604082840312156149dc57600080fd5b6149e46139a1565b6149ed836137e6565b81526149fb6020840161499e565b60208201529392505050565b600060408284031215614a1957600080fd5b614a216139a1565b6149ed83613cae565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81833603018112614a5e57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614a9d57600080fd5b83018035915067ffffffffffffffff821115614ab857600080fd5b602001915036819003821315611b8357600080fd5b80820180821115610eea57610eea614886565b81810381811115610eea57610eea614886565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015613e7a5760049490940360031b84901b1690921692915050565b60008085851115614b4957600080fd5b83861115614b5657600080fd5b5050820193919092039150565b600060408284031215614b7557600080fd5b614b7d6139a1565b8251815260208301516149fb81613ea8565b600060208284031215614ba157600080fd5b5051919050565b805169ffffffffffffffffffff8116811461380a57600080fd5b600080600080600060a08688031215614bda57600080fd5b614be386614ba8565b9450602086015193506040860151925060608601519150614c0660808701614ba8565b90509295509295909350565b600060208284031215614c2457600080fd5b8151610b4481613a84565b60ff8181168382160190811115610eea57610eea614886565b60ff8281168282160390811115610eea57610eea614886565b600181815b80851115614cba57817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614ca057614ca0614886565b80851615614cad57918102915b93841c9390800290614c66565b509250929050565b600082614cd157506001610eea565b81614cde57506000610eea565b8160018114614cf45760028114614cfe57614d1a565b6001915050610eea565b60ff841115614d0f57614d0f614886565b50506001821b610eea565b5060208310610133831016604e8410600b8410161715614d3d575081810a610eea565b614d478383614c61565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115614d7957614d79614886565b029392505050565b6000610b4460ff841683614cc2565b600060408284031215614da257600080fd5b614daa6139a1565b614db3836137e6565b8152602083013560208201528091505092915050565b63ffffffff8181168382160190808211156137df576137df614886565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea164736f6c6343000818000a",
}
var PriceRegistryABI = PriceRegistryMetaData.ABI
@@ -2077,260 +2077,6 @@ func (_PriceRegistry *PriceRegistryFilterer) ParsePriceFeedPerTokenUpdated(log t
return event, nil
}
-type PriceRegistryPriceUpdaterRemovedIterator struct {
- Event *PriceRegistryPriceUpdaterRemoved
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *PriceRegistryPriceUpdaterRemovedIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(PriceRegistryPriceUpdaterRemoved)
- if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
- it.fail = err
- return false
- }
- it.Event.Raw = log
- return true
-
- default:
- return false
- }
- }
-
- select {
- case log := <-it.logs:
- it.Event = new(PriceRegistryPriceUpdaterRemoved)
- if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
- it.fail = err
- return false
- }
- it.Event.Raw = log
- return true
-
- case err := <-it.sub.Err():
- it.done = true
- it.fail = err
- return it.Next()
- }
-}
-
-func (it *PriceRegistryPriceUpdaterRemovedIterator) Error() error {
- return it.fail
-}
-
-func (it *PriceRegistryPriceUpdaterRemovedIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type PriceRegistryPriceUpdaterRemoved struct {
- PriceUpdater common.Address
- Raw types.Log
-}
-
-func (_PriceRegistry *PriceRegistryFilterer) FilterPriceUpdaterRemoved(opts *bind.FilterOpts, priceUpdater []common.Address) (*PriceRegistryPriceUpdaterRemovedIterator, error) {
-
- var priceUpdaterRule []interface{}
- for _, priceUpdaterItem := range priceUpdater {
- priceUpdaterRule = append(priceUpdaterRule, priceUpdaterItem)
- }
-
- logs, sub, err := _PriceRegistry.contract.FilterLogs(opts, "PriceUpdaterRemoved", priceUpdaterRule)
- if err != nil {
- return nil, err
- }
- return &PriceRegistryPriceUpdaterRemovedIterator{contract: _PriceRegistry.contract, event: "PriceUpdaterRemoved", logs: logs, sub: sub}, nil
-}
-
-func (_PriceRegistry *PriceRegistryFilterer) WatchPriceUpdaterRemoved(opts *bind.WatchOpts, sink chan<- *PriceRegistryPriceUpdaterRemoved, priceUpdater []common.Address) (event.Subscription, error) {
-
- var priceUpdaterRule []interface{}
- for _, priceUpdaterItem := range priceUpdater {
- priceUpdaterRule = append(priceUpdaterRule, priceUpdaterItem)
- }
-
- logs, sub, err := _PriceRegistry.contract.WatchLogs(opts, "PriceUpdaterRemoved", priceUpdaterRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(PriceRegistryPriceUpdaterRemoved)
- if err := _PriceRegistry.contract.UnpackLog(event, "PriceUpdaterRemoved", log); err != nil {
- return err
- }
- event.Raw = log
-
- select {
- case sink <- event:
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- }
- }), nil
-}
-
-func (_PriceRegistry *PriceRegistryFilterer) ParsePriceUpdaterRemoved(log types.Log) (*PriceRegistryPriceUpdaterRemoved, error) {
- event := new(PriceRegistryPriceUpdaterRemoved)
- if err := _PriceRegistry.contract.UnpackLog(event, "PriceUpdaterRemoved", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
-type PriceRegistryPriceUpdaterSetIterator struct {
- Event *PriceRegistryPriceUpdaterSet
-
- contract *bind.BoundContract
- event string
-
- logs chan types.Log
- sub ethereum.Subscription
- done bool
- fail error
-}
-
-func (it *PriceRegistryPriceUpdaterSetIterator) Next() bool {
-
- if it.fail != nil {
- return false
- }
-
- if it.done {
- select {
- case log := <-it.logs:
- it.Event = new(PriceRegistryPriceUpdaterSet)
- if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
- it.fail = err
- return false
- }
- it.Event.Raw = log
- return true
-
- default:
- return false
- }
- }
-
- select {
- case log := <-it.logs:
- it.Event = new(PriceRegistryPriceUpdaterSet)
- if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
- it.fail = err
- return false
- }
- it.Event.Raw = log
- return true
-
- case err := <-it.sub.Err():
- it.done = true
- it.fail = err
- return it.Next()
- }
-}
-
-func (it *PriceRegistryPriceUpdaterSetIterator) Error() error {
- return it.fail
-}
-
-func (it *PriceRegistryPriceUpdaterSetIterator) Close() error {
- it.sub.Unsubscribe()
- return nil
-}
-
-type PriceRegistryPriceUpdaterSet struct {
- PriceUpdater common.Address
- Raw types.Log
-}
-
-func (_PriceRegistry *PriceRegistryFilterer) FilterPriceUpdaterSet(opts *bind.FilterOpts, priceUpdater []common.Address) (*PriceRegistryPriceUpdaterSetIterator, error) {
-
- var priceUpdaterRule []interface{}
- for _, priceUpdaterItem := range priceUpdater {
- priceUpdaterRule = append(priceUpdaterRule, priceUpdaterItem)
- }
-
- logs, sub, err := _PriceRegistry.contract.FilterLogs(opts, "PriceUpdaterSet", priceUpdaterRule)
- if err != nil {
- return nil, err
- }
- return &PriceRegistryPriceUpdaterSetIterator{contract: _PriceRegistry.contract, event: "PriceUpdaterSet", logs: logs, sub: sub}, nil
-}
-
-func (_PriceRegistry *PriceRegistryFilterer) WatchPriceUpdaterSet(opts *bind.WatchOpts, sink chan<- *PriceRegistryPriceUpdaterSet, priceUpdater []common.Address) (event.Subscription, error) {
-
- var priceUpdaterRule []interface{}
- for _, priceUpdaterItem := range priceUpdater {
- priceUpdaterRule = append(priceUpdaterRule, priceUpdaterItem)
- }
-
- logs, sub, err := _PriceRegistry.contract.WatchLogs(opts, "PriceUpdaterSet", priceUpdaterRule)
- if err != nil {
- return nil, err
- }
- return event.NewSubscription(func(quit <-chan struct{}) error {
- defer sub.Unsubscribe()
- for {
- select {
- case log := <-logs:
-
- event := new(PriceRegistryPriceUpdaterSet)
- if err := _PriceRegistry.contract.UnpackLog(event, "PriceUpdaterSet", log); err != nil {
- return err
- }
- event.Raw = log
-
- select {
- case sink <- event:
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- case err := <-sub.Err():
- return err
- case <-quit:
- return nil
- }
- }
- }), nil
-}
-
-func (_PriceRegistry *PriceRegistryFilterer) ParsePriceUpdaterSet(log types.Log) (*PriceRegistryPriceUpdaterSet, error) {
- event := new(PriceRegistryPriceUpdaterSet)
- if err := _PriceRegistry.contract.UnpackLog(event, "PriceUpdaterSet", log); err != nil {
- return nil, err
- }
- event.Raw = log
- return event, nil
-}
-
type PriceRegistryTokenTransferFeeConfigDeletedIterator struct {
Event *PriceRegistryTokenTransferFeeConfigDeleted
@@ -2894,10 +2640,6 @@ func (_PriceRegistry *PriceRegistry) ParseLog(log types.Log) (generated.AbigenLo
return _PriceRegistry.ParsePremiumMultiplierWeiPerEthUpdated(log)
case _PriceRegistry.abi.Events["PriceFeedPerTokenUpdated"].ID:
return _PriceRegistry.ParsePriceFeedPerTokenUpdated(log)
- case _PriceRegistry.abi.Events["PriceUpdaterRemoved"].ID:
- return _PriceRegistry.ParsePriceUpdaterRemoved(log)
- case _PriceRegistry.abi.Events["PriceUpdaterSet"].ID:
- return _PriceRegistry.ParsePriceUpdaterSet(log)
case _PriceRegistry.abi.Events["TokenTransferFeeConfigDeleted"].ID:
return _PriceRegistry.ParseTokenTransferFeeConfigDeleted(log)
case _PriceRegistry.abi.Events["TokenTransferFeeConfigUpdated"].ID:
@@ -2952,14 +2694,6 @@ func (PriceRegistryPriceFeedPerTokenUpdated) Topic() common.Hash {
return common.HexToHash("0x08a5f7f5bb38a81d8e43aca13ecd76431dbf8816ae4699affff7b00b2fc1c464")
}
-func (PriceRegistryPriceUpdaterRemoved) Topic() common.Hash {
- return common.HexToHash("0xff7dbb85c77ca68ca1f894d6498570e3d5095cd19466f07ee8d222b337e4068c")
-}
-
-func (PriceRegistryPriceUpdaterSet) Topic() common.Hash {
- return common.HexToHash("0x34a02290b7920078c19f58e94b78c77eb9cc10195b20676e19bd3b82085893b8")
-}
-
func (PriceRegistryTokenTransferFeeConfigDeleted) Topic() common.Hash {
return common.HexToHash("0x4de5b1bcbca6018c11303a2c3f4a4b4f22a1c741d8c4ba430d246ac06c5ddf8b")
}
@@ -3099,18 +2833,6 @@ type PriceRegistryInterface interface {
ParsePriceFeedPerTokenUpdated(log types.Log) (*PriceRegistryPriceFeedPerTokenUpdated, error)
- FilterPriceUpdaterRemoved(opts *bind.FilterOpts, priceUpdater []common.Address) (*PriceRegistryPriceUpdaterRemovedIterator, error)
-
- WatchPriceUpdaterRemoved(opts *bind.WatchOpts, sink chan<- *PriceRegistryPriceUpdaterRemoved, priceUpdater []common.Address) (event.Subscription, error)
-
- ParsePriceUpdaterRemoved(log types.Log) (*PriceRegistryPriceUpdaterRemoved, error)
-
- FilterPriceUpdaterSet(opts *bind.FilterOpts, priceUpdater []common.Address) (*PriceRegistryPriceUpdaterSetIterator, error)
-
- WatchPriceUpdaterSet(opts *bind.WatchOpts, sink chan<- *PriceRegistryPriceUpdaterSet, priceUpdater []common.Address) (event.Subscription, error)
-
- ParsePriceUpdaterSet(log types.Log) (*PriceRegistryPriceUpdaterSet, error)
-
FilterTokenTransferFeeConfigDeleted(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address) (*PriceRegistryTokenTransferFeeConfigDeletedIterator, error)
WatchTokenTransferFeeConfigDeleted(opts *bind.WatchOpts, sink chan<- *PriceRegistryTokenTransferFeeConfigDeleted, destChainSelector []uint64, token []common.Address) (event.Subscription, error)
diff --git a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
index 71552045c6..e23a89fb9c 100644
--- a/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
+++ b/core/gethwrappers/ccip/generation/generated-wrapper-dependency-versions-do-not-edit.txt
@@ -5,13 +5,13 @@ burn_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnFromMintTokenPool
burn_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPool/BurnMintTokenPool.bin 1bbffb552c3256097fbe61a430de408073816f40e17b17b102b793527d44f046
burn_mint_token_pool_and_proxy: ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.abi ../../../contracts/solc/v0.8.24/BurnMintTokenPoolAndProxy/BurnMintTokenPoolAndProxy.bin 5be8832498c8aab49957bfff94fbb1d22373833d1d56f5d8ace259343b27fc24
burn_with_from_mint_token_pool: ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.abi ../../../contracts/solc/v0.8.24/BurnWithFromMintTokenPool/BurnWithFromMintTokenPool.bin 9215cb5efe441e9893f871de31b4a5d4171c479f276aac4084046514990f1bd6
-ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin c06c1cf1d004a803585a2c9d7a71ee5997b5fca86c2e111335cb8b930d9e3b5a
+ccip_config: ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.abi ../../../contracts/solc/v0.8.24/CCIPConfig/CCIPConfig.bin 970bf6a2a817813eb3302c92ec3ad0bc0fc6c2e693f33c13f57733d003f44d0d
ccip_reader_tester: ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.abi ../../../contracts/solc/v0.8.24/CCIPReaderTester/CCIPReaderTester.bin 02be3227883ca4b69383892d27ba7a9af747151a06f4815d18ccd8aaf89b4fb9
commit_store: ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.abi ../../../contracts/solc/v0.8.24/CommitStore/CommitStore.bin ddc26c10c2a52b59624faae9005827b09b98db4566887a736005e8cc37cf8a51
commit_store_helper: ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.abi ../../../contracts/solc/v0.8.24/CommitStoreHelper/CommitStoreHelper.bin ebd8aac686fa28a71d4212bcd25a28f8f640d50dce5e50498b2f6b8534890b69
ether_sender_receiver: ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.abi ../../../contracts/solc/v0.8.24/EtherSenderReceiver/EtherSenderReceiver.bin 09510a3f773f108a3c231e8d202835c845ded862d071ec54c4f89c12d868b8de
evm_2_evm_multi_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOffRamp/EVM2EVMMultiOffRamp.bin 3ea3974c9848e0df0dbe1fc7192134589e7735017c2ea8d4755084b3c95035d1
-evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin 9478aedc9f0072fbdafb54a6f82248de1efbcd7bdff18a90d8556b9aaff67455
+evm_2_evm_multi_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMMultiOnRamp/EVM2EVMMultiOnRamp.bin a9aaf33667cab483adab20358d2c04b0694f4ecb26cf90c8e489f78e7f5f407a
evm_2_evm_offramp: ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOffRamp/EVM2EVMOffRamp.bin bdafc343d33f1eb753871ea6d215339cd8e087c1a8c7297257791dd1e453be8f
evm_2_evm_onramp: ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.abi ../../../contracts/solc/v0.8.24/EVM2EVMOnRamp/EVM2EVMOnRamp.bin bf1a3090a2f8d1632b82a6d45200cf6f3833a1e27303745405c1ed13ffc0cf83
lock_release_token_pool: ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.abi ../../../contracts/solc/v0.8.24/LockReleaseTokenPool/LockReleaseTokenPool.bin f049909cfef0aa3b8158c85e7b64516b9d7b32f4930705574090e5b9cab534b1
@@ -27,7 +27,7 @@ multi_ocr3_helper: ../../../contracts/solc/v0.8.24/MultiOCR3Helper/MultiOCR3Help
nonce_manager: ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.abi ../../../contracts/solc/v0.8.24/NonceManager/NonceManager.bin 6f64e1083b356c06ee66b9138e398b9c97a4cd3e8c9ec38cf3010cebc79af536
ocr3_config_encoder: ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.abi ../../../contracts/solc/v0.8.24/IOCR3ConfigEncoder/IOCR3ConfigEncoder.bin e21180898e1ad54a045ee20add85a2793c681425ea06f66d1a9e5cab128b6487
ping_pong_demo: ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.abi ../../../contracts/solc/v0.8.24/PingPongDemo/PingPongDemo.bin 1588313bb5e781d181a825247d30828f59007700f36b4b9b00391592b06ff4b4
-price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 955eeb1da5f001fa01dc9914bf8a02b7e3b58e080ee775424261dcd97f88d70d
+price_registry: ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.abi ../../../contracts/solc/v0.8.24/PriceRegistry/PriceRegistry.bin 7320907b45fe2bdc3a06f5891dd34b8ab270823a652fec15676ec8a898764273
registry_module_owner_custom: ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.abi ../../../contracts/solc/v0.8.24/RegistryModuleOwnerCustom/RegistryModuleOwnerCustom.bin 7b2a47349d3fdb8d8b4e206d68577219deca7fabd1e893686fa8f118ad980d2d
report_codec: ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.abi ../../../contracts/solc/v0.8.24/ReportCodec/ReportCodec.bin c07af8433bf8dbc7981725b18922a9c4e2dea068dd204bc62adc0e926cb499c3
router: ../../../contracts/solc/v0.8.24/Router/Router.abi ../../../contracts/solc/v0.8.24/Router/Router.bin 42576577e81beea9a069bd9229caaa9a71227fbaef3871a1a2e69fd218216290
diff --git a/core/gethwrappers/ccip/mocks/price_registry_interface.go b/core/gethwrappers/ccip/mocks/price_registry_interface.go
index 8c2834acce..b8b90b1293 100644
--- a/core/gethwrappers/ccip/mocks/price_registry_interface.go
+++ b/core/gethwrappers/ccip/mocks/price_registry_interface.go
@@ -1085,124 +1085,6 @@ func (_c *PriceRegistryInterface_FilterPriceFeedPerTokenUpdated_Call) RunAndRetu
return _c
}
-// FilterPriceUpdaterRemoved provides a mock function with given fields: opts, priceUpdater
-func (_m *PriceRegistryInterface) FilterPriceUpdaterRemoved(opts *bind.FilterOpts, priceUpdater []common.Address) (*price_registry.PriceRegistryPriceUpdaterRemovedIterator, error) {
- ret := _m.Called(opts, priceUpdater)
-
- if len(ret) == 0 {
- panic("no return value specified for FilterPriceUpdaterRemoved")
- }
-
- var r0 *price_registry.PriceRegistryPriceUpdaterRemovedIterator
- var r1 error
- if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) (*price_registry.PriceRegistryPriceUpdaterRemovedIterator, error)); ok {
- return rf(opts, priceUpdater)
- }
- if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) *price_registry.PriceRegistryPriceUpdaterRemovedIterator); ok {
- r0 = rf(opts, priceUpdater)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(*price_registry.PriceRegistryPriceUpdaterRemovedIterator)
- }
- }
-
- if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address) error); ok {
- r1 = rf(opts, priceUpdater)
- } else {
- r1 = ret.Error(1)
- }
-
- return r0, r1
-}
-
-// PriceRegistryInterface_FilterPriceUpdaterRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterPriceUpdaterRemoved'
-type PriceRegistryInterface_FilterPriceUpdaterRemoved_Call struct {
- *mock.Call
-}
-
-// FilterPriceUpdaterRemoved is a helper method to define mock.On call
-// - opts *bind.FilterOpts
-// - priceUpdater []common.Address
-func (_e *PriceRegistryInterface_Expecter) FilterPriceUpdaterRemoved(opts interface{}, priceUpdater interface{}) *PriceRegistryInterface_FilterPriceUpdaterRemoved_Call {
- return &PriceRegistryInterface_FilterPriceUpdaterRemoved_Call{Call: _e.mock.On("FilterPriceUpdaterRemoved", opts, priceUpdater)}
-}
-
-func (_c *PriceRegistryInterface_FilterPriceUpdaterRemoved_Call) Run(run func(opts *bind.FilterOpts, priceUpdater []common.Address)) *PriceRegistryInterface_FilterPriceUpdaterRemoved_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(*bind.FilterOpts), args[1].([]common.Address))
- })
- return _c
-}
-
-func (_c *PriceRegistryInterface_FilterPriceUpdaterRemoved_Call) Return(_a0 *price_registry.PriceRegistryPriceUpdaterRemovedIterator, _a1 error) *PriceRegistryInterface_FilterPriceUpdaterRemoved_Call {
- _c.Call.Return(_a0, _a1)
- return _c
-}
-
-func (_c *PriceRegistryInterface_FilterPriceUpdaterRemoved_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address) (*price_registry.PriceRegistryPriceUpdaterRemovedIterator, error)) *PriceRegistryInterface_FilterPriceUpdaterRemoved_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// FilterPriceUpdaterSet provides a mock function with given fields: opts, priceUpdater
-func (_m *PriceRegistryInterface) FilterPriceUpdaterSet(opts *bind.FilterOpts, priceUpdater []common.Address) (*price_registry.PriceRegistryPriceUpdaterSetIterator, error) {
- ret := _m.Called(opts, priceUpdater)
-
- if len(ret) == 0 {
- panic("no return value specified for FilterPriceUpdaterSet")
- }
-
- var r0 *price_registry.PriceRegistryPriceUpdaterSetIterator
- var r1 error
- if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) (*price_registry.PriceRegistryPriceUpdaterSetIterator, error)); ok {
- return rf(opts, priceUpdater)
- }
- if rf, ok := ret.Get(0).(func(*bind.FilterOpts, []common.Address) *price_registry.PriceRegistryPriceUpdaterSetIterator); ok {
- r0 = rf(opts, priceUpdater)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(*price_registry.PriceRegistryPriceUpdaterSetIterator)
- }
- }
-
- if rf, ok := ret.Get(1).(func(*bind.FilterOpts, []common.Address) error); ok {
- r1 = rf(opts, priceUpdater)
- } else {
- r1 = ret.Error(1)
- }
-
- return r0, r1
-}
-
-// PriceRegistryInterface_FilterPriceUpdaterSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'FilterPriceUpdaterSet'
-type PriceRegistryInterface_FilterPriceUpdaterSet_Call struct {
- *mock.Call
-}
-
-// FilterPriceUpdaterSet is a helper method to define mock.On call
-// - opts *bind.FilterOpts
-// - priceUpdater []common.Address
-func (_e *PriceRegistryInterface_Expecter) FilterPriceUpdaterSet(opts interface{}, priceUpdater interface{}) *PriceRegistryInterface_FilterPriceUpdaterSet_Call {
- return &PriceRegistryInterface_FilterPriceUpdaterSet_Call{Call: _e.mock.On("FilterPriceUpdaterSet", opts, priceUpdater)}
-}
-
-func (_c *PriceRegistryInterface_FilterPriceUpdaterSet_Call) Run(run func(opts *bind.FilterOpts, priceUpdater []common.Address)) *PriceRegistryInterface_FilterPriceUpdaterSet_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(*bind.FilterOpts), args[1].([]common.Address))
- })
- return _c
-}
-
-func (_c *PriceRegistryInterface_FilterPriceUpdaterSet_Call) Return(_a0 *price_registry.PriceRegistryPriceUpdaterSetIterator, _a1 error) *PriceRegistryInterface_FilterPriceUpdaterSet_Call {
- _c.Call.Return(_a0, _a1)
- return _c
-}
-
-func (_c *PriceRegistryInterface_FilterPriceUpdaterSet_Call) RunAndReturn(run func(*bind.FilterOpts, []common.Address) (*price_registry.PriceRegistryPriceUpdaterSetIterator, error)) *PriceRegistryInterface_FilterPriceUpdaterSet_Call {
- _c.Call.Return(run)
- return _c
-}
-
// FilterTokenTransferFeeConfigDeleted provides a mock function with given fields: opts, destChainSelector, token
func (_m *PriceRegistryInterface) FilterTokenTransferFeeConfigDeleted(opts *bind.FilterOpts, destChainSelector []uint64, token []common.Address) (*price_registry.PriceRegistryTokenTransferFeeConfigDeletedIterator, error) {
ret := _m.Called(opts, destChainSelector, token)
@@ -2888,122 +2770,6 @@ func (_c *PriceRegistryInterface_ParsePriceFeedPerTokenUpdated_Call) RunAndRetur
return _c
}
-// ParsePriceUpdaterRemoved provides a mock function with given fields: log
-func (_m *PriceRegistryInterface) ParsePriceUpdaterRemoved(log types.Log) (*price_registry.PriceRegistryPriceUpdaterRemoved, error) {
- ret := _m.Called(log)
-
- if len(ret) == 0 {
- panic("no return value specified for ParsePriceUpdaterRemoved")
- }
-
- var r0 *price_registry.PriceRegistryPriceUpdaterRemoved
- var r1 error
- if rf, ok := ret.Get(0).(func(types.Log) (*price_registry.PriceRegistryPriceUpdaterRemoved, error)); ok {
- return rf(log)
- }
- if rf, ok := ret.Get(0).(func(types.Log) *price_registry.PriceRegistryPriceUpdaterRemoved); ok {
- r0 = rf(log)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(*price_registry.PriceRegistryPriceUpdaterRemoved)
- }
- }
-
- if rf, ok := ret.Get(1).(func(types.Log) error); ok {
- r1 = rf(log)
- } else {
- r1 = ret.Error(1)
- }
-
- return r0, r1
-}
-
-// PriceRegistryInterface_ParsePriceUpdaterRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParsePriceUpdaterRemoved'
-type PriceRegistryInterface_ParsePriceUpdaterRemoved_Call struct {
- *mock.Call
-}
-
-// ParsePriceUpdaterRemoved is a helper method to define mock.On call
-// - log types.Log
-func (_e *PriceRegistryInterface_Expecter) ParsePriceUpdaterRemoved(log interface{}) *PriceRegistryInterface_ParsePriceUpdaterRemoved_Call {
- return &PriceRegistryInterface_ParsePriceUpdaterRemoved_Call{Call: _e.mock.On("ParsePriceUpdaterRemoved", log)}
-}
-
-func (_c *PriceRegistryInterface_ParsePriceUpdaterRemoved_Call) Run(run func(log types.Log)) *PriceRegistryInterface_ParsePriceUpdaterRemoved_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(types.Log))
- })
- return _c
-}
-
-func (_c *PriceRegistryInterface_ParsePriceUpdaterRemoved_Call) Return(_a0 *price_registry.PriceRegistryPriceUpdaterRemoved, _a1 error) *PriceRegistryInterface_ParsePriceUpdaterRemoved_Call {
- _c.Call.Return(_a0, _a1)
- return _c
-}
-
-func (_c *PriceRegistryInterface_ParsePriceUpdaterRemoved_Call) RunAndReturn(run func(types.Log) (*price_registry.PriceRegistryPriceUpdaterRemoved, error)) *PriceRegistryInterface_ParsePriceUpdaterRemoved_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// ParsePriceUpdaterSet provides a mock function with given fields: log
-func (_m *PriceRegistryInterface) ParsePriceUpdaterSet(log types.Log) (*price_registry.PriceRegistryPriceUpdaterSet, error) {
- ret := _m.Called(log)
-
- if len(ret) == 0 {
- panic("no return value specified for ParsePriceUpdaterSet")
- }
-
- var r0 *price_registry.PriceRegistryPriceUpdaterSet
- var r1 error
- if rf, ok := ret.Get(0).(func(types.Log) (*price_registry.PriceRegistryPriceUpdaterSet, error)); ok {
- return rf(log)
- }
- if rf, ok := ret.Get(0).(func(types.Log) *price_registry.PriceRegistryPriceUpdaterSet); ok {
- r0 = rf(log)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(*price_registry.PriceRegistryPriceUpdaterSet)
- }
- }
-
- if rf, ok := ret.Get(1).(func(types.Log) error); ok {
- r1 = rf(log)
- } else {
- r1 = ret.Error(1)
- }
-
- return r0, r1
-}
-
-// PriceRegistryInterface_ParsePriceUpdaterSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'ParsePriceUpdaterSet'
-type PriceRegistryInterface_ParsePriceUpdaterSet_Call struct {
- *mock.Call
-}
-
-// ParsePriceUpdaterSet is a helper method to define mock.On call
-// - log types.Log
-func (_e *PriceRegistryInterface_Expecter) ParsePriceUpdaterSet(log interface{}) *PriceRegistryInterface_ParsePriceUpdaterSet_Call {
- return &PriceRegistryInterface_ParsePriceUpdaterSet_Call{Call: _e.mock.On("ParsePriceUpdaterSet", log)}
-}
-
-func (_c *PriceRegistryInterface_ParsePriceUpdaterSet_Call) Run(run func(log types.Log)) *PriceRegistryInterface_ParsePriceUpdaterSet_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(types.Log))
- })
- return _c
-}
-
-func (_c *PriceRegistryInterface_ParsePriceUpdaterSet_Call) Return(_a0 *price_registry.PriceRegistryPriceUpdaterSet, _a1 error) *PriceRegistryInterface_ParsePriceUpdaterSet_Call {
- _c.Call.Return(_a0, _a1)
- return _c
-}
-
-func (_c *PriceRegistryInterface_ParsePriceUpdaterSet_Call) RunAndReturn(run func(types.Log) (*price_registry.PriceRegistryPriceUpdaterSet, error)) *PriceRegistryInterface_ParsePriceUpdaterSet_Call {
- _c.Call.Return(run)
- return _c
-}
-
// ParseTokenTransferFeeConfigDeleted provides a mock function with given fields: log
func (_m *PriceRegistryInterface) ParseTokenTransferFeeConfigDeleted(log types.Log) (*price_registry.PriceRegistryTokenTransferFeeConfigDeleted, error) {
ret := _m.Called(log)
@@ -4178,126 +3944,6 @@ func (_c *PriceRegistryInterface_WatchPriceFeedPerTokenUpdated_Call) RunAndRetur
return _c
}
-// WatchPriceUpdaterRemoved provides a mock function with given fields: opts, sink, priceUpdater
-func (_m *PriceRegistryInterface) WatchPriceUpdaterRemoved(opts *bind.WatchOpts, sink chan<- *price_registry.PriceRegistryPriceUpdaterRemoved, priceUpdater []common.Address) (event.Subscription, error) {
- ret := _m.Called(opts, sink, priceUpdater)
-
- if len(ret) == 0 {
- panic("no return value specified for WatchPriceUpdaterRemoved")
- }
-
- var r0 event.Subscription
- var r1 error
- if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *price_registry.PriceRegistryPriceUpdaterRemoved, []common.Address) (event.Subscription, error)); ok {
- return rf(opts, sink, priceUpdater)
- }
- if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *price_registry.PriceRegistryPriceUpdaterRemoved, []common.Address) event.Subscription); ok {
- r0 = rf(opts, sink, priceUpdater)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(event.Subscription)
- }
- }
-
- if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *price_registry.PriceRegistryPriceUpdaterRemoved, []common.Address) error); ok {
- r1 = rf(opts, sink, priceUpdater)
- } else {
- r1 = ret.Error(1)
- }
-
- return r0, r1
-}
-
-// PriceRegistryInterface_WatchPriceUpdaterRemoved_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchPriceUpdaterRemoved'
-type PriceRegistryInterface_WatchPriceUpdaterRemoved_Call struct {
- *mock.Call
-}
-
-// WatchPriceUpdaterRemoved is a helper method to define mock.On call
-// - opts *bind.WatchOpts
-// - sink chan<- *price_registry.PriceRegistryPriceUpdaterRemoved
-// - priceUpdater []common.Address
-func (_e *PriceRegistryInterface_Expecter) WatchPriceUpdaterRemoved(opts interface{}, sink interface{}, priceUpdater interface{}) *PriceRegistryInterface_WatchPriceUpdaterRemoved_Call {
- return &PriceRegistryInterface_WatchPriceUpdaterRemoved_Call{Call: _e.mock.On("WatchPriceUpdaterRemoved", opts, sink, priceUpdater)}
-}
-
-func (_c *PriceRegistryInterface_WatchPriceUpdaterRemoved_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *price_registry.PriceRegistryPriceUpdaterRemoved, priceUpdater []common.Address)) *PriceRegistryInterface_WatchPriceUpdaterRemoved_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(*bind.WatchOpts), args[1].(chan<- *price_registry.PriceRegistryPriceUpdaterRemoved), args[2].([]common.Address))
- })
- return _c
-}
-
-func (_c *PriceRegistryInterface_WatchPriceUpdaterRemoved_Call) Return(_a0 event.Subscription, _a1 error) *PriceRegistryInterface_WatchPriceUpdaterRemoved_Call {
- _c.Call.Return(_a0, _a1)
- return _c
-}
-
-func (_c *PriceRegistryInterface_WatchPriceUpdaterRemoved_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *price_registry.PriceRegistryPriceUpdaterRemoved, []common.Address) (event.Subscription, error)) *PriceRegistryInterface_WatchPriceUpdaterRemoved_Call {
- _c.Call.Return(run)
- return _c
-}
-
-// WatchPriceUpdaterSet provides a mock function with given fields: opts, sink, priceUpdater
-func (_m *PriceRegistryInterface) WatchPriceUpdaterSet(opts *bind.WatchOpts, sink chan<- *price_registry.PriceRegistryPriceUpdaterSet, priceUpdater []common.Address) (event.Subscription, error) {
- ret := _m.Called(opts, sink, priceUpdater)
-
- if len(ret) == 0 {
- panic("no return value specified for WatchPriceUpdaterSet")
- }
-
- var r0 event.Subscription
- var r1 error
- if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *price_registry.PriceRegistryPriceUpdaterSet, []common.Address) (event.Subscription, error)); ok {
- return rf(opts, sink, priceUpdater)
- }
- if rf, ok := ret.Get(0).(func(*bind.WatchOpts, chan<- *price_registry.PriceRegistryPriceUpdaterSet, []common.Address) event.Subscription); ok {
- r0 = rf(opts, sink, priceUpdater)
- } else {
- if ret.Get(0) != nil {
- r0 = ret.Get(0).(event.Subscription)
- }
- }
-
- if rf, ok := ret.Get(1).(func(*bind.WatchOpts, chan<- *price_registry.PriceRegistryPriceUpdaterSet, []common.Address) error); ok {
- r1 = rf(opts, sink, priceUpdater)
- } else {
- r1 = ret.Error(1)
- }
-
- return r0, r1
-}
-
-// PriceRegistryInterface_WatchPriceUpdaterSet_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'WatchPriceUpdaterSet'
-type PriceRegistryInterface_WatchPriceUpdaterSet_Call struct {
- *mock.Call
-}
-
-// WatchPriceUpdaterSet is a helper method to define mock.On call
-// - opts *bind.WatchOpts
-// - sink chan<- *price_registry.PriceRegistryPriceUpdaterSet
-// - priceUpdater []common.Address
-func (_e *PriceRegistryInterface_Expecter) WatchPriceUpdaterSet(opts interface{}, sink interface{}, priceUpdater interface{}) *PriceRegistryInterface_WatchPriceUpdaterSet_Call {
- return &PriceRegistryInterface_WatchPriceUpdaterSet_Call{Call: _e.mock.On("WatchPriceUpdaterSet", opts, sink, priceUpdater)}
-}
-
-func (_c *PriceRegistryInterface_WatchPriceUpdaterSet_Call) Run(run func(opts *bind.WatchOpts, sink chan<- *price_registry.PriceRegistryPriceUpdaterSet, priceUpdater []common.Address)) *PriceRegistryInterface_WatchPriceUpdaterSet_Call {
- _c.Call.Run(func(args mock.Arguments) {
- run(args[0].(*bind.WatchOpts), args[1].(chan<- *price_registry.PriceRegistryPriceUpdaterSet), args[2].([]common.Address))
- })
- return _c
-}
-
-func (_c *PriceRegistryInterface_WatchPriceUpdaterSet_Call) Return(_a0 event.Subscription, _a1 error) *PriceRegistryInterface_WatchPriceUpdaterSet_Call {
- _c.Call.Return(_a0, _a1)
- return _c
-}
-
-func (_c *PriceRegistryInterface_WatchPriceUpdaterSet_Call) RunAndReturn(run func(*bind.WatchOpts, chan<- *price_registry.PriceRegistryPriceUpdaterSet, []common.Address) (event.Subscription, error)) *PriceRegistryInterface_WatchPriceUpdaterSet_Call {
- _c.Call.Return(run)
- return _c
-}
-
// WatchTokenTransferFeeConfigDeleted provides a mock function with given fields: opts, sink, destChainSelector, token
func (_m *PriceRegistryInterface) WatchTokenTransferFeeConfigDeleted(opts *bind.WatchOpts, sink chan<- *price_registry.PriceRegistryTokenTransferFeeConfigDeleted, destChainSelector []uint64, token []common.Address) (event.Subscription, error) {
ret := _m.Called(opts, sink, destChainSelector, token)
From 5603006b2ac948eff1b0f8c00db73fe100ec551f Mon Sep 17 00:00:00 2001
From: Kodey Kilday-Thomas
Date: Mon, 5 Aug 2024 16:40:11 +0100
Subject: [PATCH 27/28] Bump Chain Selectors
---
core/scripts/go.mod | 2 +-
core/scripts/go.sum | 4 ++--
go.mod | 2 +-
go.sum | 4 ++--
integration-tests/go.mod | 2 +-
integration-tests/go.sum | 4 ++--
integration-tests/load/go.mod | 2 +-
integration-tests/load/go.sum | 4 ++--
8 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/core/scripts/go.mod b/core/scripts/go.mod
index 8d4cdd2cf3..5d89b228d3 100644
--- a/core/scripts/go.mod
+++ b/core/scripts/go.mod
@@ -22,7 +22,7 @@ require (
github.com/pkg/errors v0.9.1
github.com/prometheus/client_golang v1.17.0
github.com/shopspring/decimal v1.4.0
- github.com/smartcontractkit/chain-selectors v1.0.19
+ github.com/smartcontractkit/chain-selectors v1.0.21
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834
github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000
diff --git a/core/scripts/go.sum b/core/scripts/go.sum
index e882613371..211c586637 100644
--- a/core/scripts/go.sum
+++ b/core/scripts/go.sum
@@ -1066,8 +1066,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/chain-selectors v1.0.19 h1:y82TyWaOA6gSvi26bbyDYgfZvK7YtOUWWHbfnvRT+WM=
-github.com/smartcontractkit/chain-selectors v1.0.19/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.21 h1:KCR9SA7PhOexaBzFieHoLv1WonwhVOPtOStpqTmLC4E=
+github.com/smartcontractkit/chain-selectors v1.0.21/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 h1:2PmmxcZY1/7Zp65BG0X5uXoxo1l+F5u8OdtulPHJjyA=
diff --git a/go.mod b/go.mod
index c8bf31f166..169a2a5920 100644
--- a/go.mod
+++ b/go.mod
@@ -72,7 +72,7 @@ require (
github.com/scylladb/go-reflectx v1.0.1
github.com/shirou/gopsutil/v3 v3.24.3
github.com/shopspring/decimal v1.4.0
- github.com/smartcontractkit/chain-selectors v1.0.19
+ github.com/smartcontractkit/chain-selectors v1.0.21
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834
diff --git a/go.sum b/go.sum
index 936cc6c5ad..f55a55bc3f 100644
--- a/go.sum
+++ b/go.sum
@@ -1023,8 +1023,8 @@ github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMB
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/smartcontractkit/chain-selectors v1.0.19 h1:y82TyWaOA6gSvi26bbyDYgfZvK7YtOUWWHbfnvRT+WM=
-github.com/smartcontractkit/chain-selectors v1.0.19/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.21 h1:KCR9SA7PhOexaBzFieHoLv1WonwhVOPtOStpqTmLC4E=
+github.com/smartcontractkit/chain-selectors v1.0.21/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 h1:2PmmxcZY1/7Zp65BG0X5uXoxo1l+F5u8OdtulPHJjyA=
diff --git a/integration-tests/go.mod b/integration-tests/go.mod
index c0ef987bdb..c6a2da836e 100644
--- a/integration-tests/go.mod
+++ b/integration-tests/go.mod
@@ -31,7 +31,7 @@ require (
github.com/segmentio/ksuid v1.0.4
github.com/shopspring/decimal v1.4.0
github.com/slack-go/slack v0.12.2
- github.com/smartcontractkit/chain-selectors v1.0.19
+ github.com/smartcontractkit/chain-selectors v1.0.21
github.com/smartcontractkit/chainlink-automation v1.0.4
github.com/smartcontractkit/chainlink-common v0.2.1-0.20240717132349-ee5af9b79834
github.com/smartcontractkit/chainlink-testing-framework v1.32.7
diff --git a/integration-tests/go.sum b/integration-tests/go.sum
index dcc2c5d5ab..6345977173 100644
--- a/integration-tests/go.sum
+++ b/integration-tests/go.sum
@@ -1388,8 +1388,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/chain-selectors v1.0.19 h1:y82TyWaOA6gSvi26bbyDYgfZvK7YtOUWWHbfnvRT+WM=
-github.com/smartcontractkit/chain-selectors v1.0.19/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.21 h1:KCR9SA7PhOexaBzFieHoLv1WonwhVOPtOStpqTmLC4E=
+github.com/smartcontractkit/chain-selectors v1.0.21/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 h1:2PmmxcZY1/7Zp65BG0X5uXoxo1l+F5u8OdtulPHJjyA=
diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod
index 8df4ab0444..4e7b4ed60c 100644
--- a/integration-tests/load/go.mod
+++ b/integration-tests/load/go.mod
@@ -372,7 +372,7 @@ require (
github.com/shoenig/go-m1cpu v0.1.6 // indirect
github.com/shopspring/decimal v1.4.0 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
- github.com/smartcontractkit/chain-selectors v1.0.19 // indirect
+ github.com/smartcontractkit/chain-selectors v1.0.21 // indirect
github.com/smartcontractkit/chainlink-data-streams v0.0.0-20240718160222-2dc0c8136bfa // indirect
github.com/smartcontractkit/chainlink-feeds v0.0.0-20240710170203-5b41615da827 // indirect
github.com/smartcontractkit/chainlink-solana v1.0.3-0.20240712132946-267a37c5ac6e // indirect
diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum
index 1b37a565d2..4e63896b4e 100644
--- a/integration-tests/load/go.sum
+++ b/integration-tests/load/go.sum
@@ -1370,8 +1370,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
github.com/slack-go/slack v0.12.2 h1:x3OppyMyGIbbiyFhsBmpf9pwkUzMhthJMRNmNlA4LaQ=
github.com/slack-go/slack v0.12.2/go.mod h1:hlGi5oXA+Gt+yWTPP0plCdRKmjsDxecdHxYQdlMQKOw=
-github.com/smartcontractkit/chain-selectors v1.0.19 h1:y82TyWaOA6gSvi26bbyDYgfZvK7YtOUWWHbfnvRT+WM=
-github.com/smartcontractkit/chain-selectors v1.0.19/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
+github.com/smartcontractkit/chain-selectors v1.0.21 h1:KCR9SA7PhOexaBzFieHoLv1WonwhVOPtOStpqTmLC4E=
+github.com/smartcontractkit/chain-selectors v1.0.21/go.mod h1:d4Hi+E1zqjy9HqMkjBE5q1vcG9VGgxf5VxiRHfzi2kE=
github.com/smartcontractkit/chainlink-automation v1.0.4 h1:iyW181JjKHLNMnDleI8umfIfVVlwC7+n5izbLSFgjw8=
github.com/smartcontractkit/chainlink-automation v1.0.4/go.mod h1:u4NbPZKJ5XiayfKHD/v3z3iflQWqvtdhj13jVZXj/cM=
github.com/smartcontractkit/chainlink-ccip v0.0.0-20240801174805-480934b67956 h1:2PmmxcZY1/7Zp65BG0X5uXoxo1l+F5u8OdtulPHJjyA=
From a9ba0a923e280ea05ec9e8788b7d854297342c24 Mon Sep 17 00:00:00 2001
From: Balamurali Gopalswami <167726375+b-gopalswami@users.noreply.github.com>
Date: Mon, 5 Aug 2024 15:30:02 -0400
Subject: [PATCH 28/28] CCIP-2645: Introducing leader lane and setting
PriceReportingDisabled in Test (#1120)
## Motivation
This [PR](https://github.com/smartcontractkit/ccip/pull/1071) introduces
leader lane feature. Setting leader lane will avoid duplicate gas price
fetch for the same destination from different source chain. Here in this
PR, the expectation is to add a test where leader lane is setup and
verify every commitstore report transaction hash emitted two
`UsdPerUnitGasUpdated` events.
## Solution
Introduce config variable to enable leader lane setup and based on
network pair, automatically define set of lanes as leader and non-leader
lanes, track the tx hash from the event `UsdPerUnitGasUpdated` and
ensure transaction count matches to the number of sources chain selector
expected.
---
.github/workflows/integration-tests.yml | 7 +
.../ccip/testhelpers/ccip_contracts.go | 4 +-
.../ocr2/plugins/ccip/testhelpers/config.go | 1 +
.../testhelpers_1_4_0/ccip_contracts_1_4_0.go | 4 +-
.../testhelpers_1_4_0/config_1_4_0.go | 1 +
.../ccip-tests/actions/ccip_helpers.go | 61 +++++---
.../ccip-tests/contracts/contract_deployer.go | 5 +-
.../ccip-tests/contracts/contract_models.go | 9 ++
.../ccip-tests/testconfig/README.md | 3 +
.../testconfig/tomls/ccip-default.toml | 1 +
.../testconfig/tomls/leader-lane.toml | 4 +
.../ccip-tests/testsetups/ccip.go | 135 ++++++++++++++++++
12 files changed, 209 insertions(+), 26 deletions(-)
create mode 100644 integration-tests/ccip-tests/testconfig/tomls/leader-lane.toml
diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml
index 339bc98df4..a4d82ab67f 100644
--- a/.github/workflows/integration-tests.yml
+++ b/.github/workflows/integration-tests.yml
@@ -366,6 +366,13 @@ jobs:
os: ubuntu-latest
file: ccip
run: -run ^TestSmokeCCIPOffRampAggRateLimit$
+ - name: ccip-smoke-leader-lane
+ nodes: 15
+ dir: ccip-tests/smoke
+ os: ubuntu-latest
+ file: ccip
+ run: -run ^TestSmokeCCIPForBidirectionalLane$
+ config_path: ./integration-tests/ccip-tests/testconfig/tomls/leader-lane.toml
- name: runlog
id: runlog
nodes: 2
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
index 1f745df9d5..6f9e8f1525 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go
@@ -97,7 +97,8 @@ func NewCommitOffchainConfig(
ExecGasPriceDeviationPPB uint32,
TokenPriceHeartBeat config.Duration,
TokenPriceDeviationPPB uint32,
- InflightCacheExpiry config.Duration) CommitOffchainConfig {
+ InflightCacheExpiry config.Duration,
+ priceReportingDisabled bool) CommitOffchainConfig {
return CommitOffchainConfig{v1_2_0.JSONCommitOffchainConfig{
GasPriceHeartBeat: GasPriceHeartBeat,
DAGasPriceDeviationPPB: DAGasPriceDeviationPPB,
@@ -105,6 +106,7 @@ func NewCommitOffchainConfig(
TokenPriceHeartBeat: TokenPriceHeartBeat,
TokenPriceDeviationPPB: TokenPriceDeviationPPB,
InflightCacheExpiry: InflightCacheExpiry,
+ PriceReportingDisabled: priceReportingDisabled,
}}
}
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/config.go b/core/services/ocr2/plugins/ccip/testhelpers/config.go
index 4e2f358835..c9d1ca5a12 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/config.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/config.go
@@ -41,6 +41,7 @@ func (c *CCIPContracts) createCommitOffchainConfig(t *testing.T, feeUpdateHearBe
*config.MustNewDuration(feeUpdateHearBeat),
1,
*config.MustNewDuration(inflightCacheExpiry),
+ false,
).Encode()
require.NoError(t, err)
return config
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go
index 4ea5bb18d7..47eb8bc62c 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go
@@ -96,7 +96,8 @@ func NewCommitOffchainConfig(
ExecGasPriceDeviationPPB uint32,
TokenPriceHeartBeat config.Duration,
TokenPriceDeviationPPB uint32,
- InflightCacheExpiry config.Duration) CommitOffchainConfig {
+ InflightCacheExpiry config.Duration,
+ priceReportingDisabled bool) CommitOffchainConfig {
return CommitOffchainConfig{v1_2_0.JSONCommitOffchainConfig{
GasPriceHeartBeat: GasPriceHeartBeat,
DAGasPriceDeviationPPB: DAGasPriceDeviationPPB,
@@ -104,6 +105,7 @@ func NewCommitOffchainConfig(
TokenPriceHeartBeat: TokenPriceHeartBeat,
TokenPriceDeviationPPB: TokenPriceDeviationPPB,
InflightCacheExpiry: InflightCacheExpiry,
+ PriceReportingDisabled: priceReportingDisabled,
}}
}
diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/config_1_4_0.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/config_1_4_0.go
index 751ae5c1a9..666ad79e59 100644
--- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/config_1_4_0.go
+++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/config_1_4_0.go
@@ -38,6 +38,7 @@ func (c *CCIPContracts) createCommitOffchainConfig(t *testing.T, feeUpdateHearBe
*config.MustNewDuration(feeUpdateHearBeat),
1,
*config.MustNewDuration(inflightCacheExpiry),
+ false,
).Encode()
require.NoError(t, err)
return config
diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go
index 94b4de984c..384b240649 100644
--- a/integration-tests/ccip-tests/actions/ccip_helpers.go
+++ b/integration-tests/ccip-tests/actions/ccip_helpers.go
@@ -44,7 +44,6 @@ import (
"github.com/smartcontractkit/chainlink-testing-framework/k8s/pkg/helm/mockserver"
"github.com/smartcontractkit/chainlink-testing-framework/k8s/pkg/helm/reorg"
"github.com/smartcontractkit/chainlink-testing-framework/networks"
-
"github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/contracts"
"github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/contracts/laneconfig"
"github.com/smartcontractkit/chainlink/integration-tests/ccip-tests/testconfig"
@@ -185,6 +184,7 @@ type CCIPCommon struct {
tokenPriceUpdateWatcher map[common.Address]*big.Int // key - token; value - timestamp of update
gasUpdateWatcherMu *sync.Mutex
gasUpdateWatcher map[uint64]*big.Int // key - destchain id; value - timestamp of update
+ GasUpdateEvents []contracts.GasUpdateEvent
}
// FreeUpUnusedSpace sets nil to various elements of ccipModule which are only used
@@ -524,6 +524,9 @@ func (ccipModule *CCIPCommon) WaitForPriceUpdates(
}
}
+// WatchForPriceUpdates helps to ensure the price updates are happening in price registry by subscribing to a couple
+// of price update events and add the event details to watchers. It subscribes to 'UsdPerUnitGasUpdated'
+// and 'UsdPerTokenUpdated' event.
func (ccipModule *CCIPCommon) WatchForPriceUpdates(ctx context.Context, lggr *zerolog.Logger) error {
gasUpdateEventLatest := make(chan *price_registry.PriceRegistryUsdPerUnitGasUpdated)
tokenUpdateEvent := make(chan *price_registry.PriceRegistryUsdPerTokenUpdated)
@@ -549,20 +552,28 @@ func (ccipModule *CCIPCommon) WatchForPriceUpdates(ctx context.Context, lggr *ze
if tokenUpdateSub == nil {
return fmt.Errorf("no event subscription found")
}
- processEvent := func(timestamp *big.Int, destChainSelector uint64) error {
+ processEvent := func(value, timestamp *big.Int, destChainSelector uint64, raw types.Log) error {
destChain, err := chainselectors.ChainIdFromSelector(destChainSelector)
if err != nil {
return err
}
ccipModule.gasUpdateWatcherMu.Lock()
ccipModule.gasUpdateWatcher[destChain] = timestamp
+
+ ccipModule.GasUpdateEvents = append(ccipModule.GasUpdateEvents, contracts.GasUpdateEvent{
+ Sender: raw.Address.Hex(),
+ Tx: raw.TxHash.Hex(),
+ Value: value,
+ DestChain: destChain,
+ Source: ccipModule.ChainClient.GetNetworkName(),
+ })
ccipModule.gasUpdateWatcherMu.Unlock()
lggr.Info().
Uint64("chainSelector", destChainSelector).
- Str("source_chain", ccipModule.ChainClient.GetNetworkName()).
Uint64("dest_chain", destChain).
Str("price_registry", ccipModule.PriceRegistry.Address()).
- Msgf("UsdPerUnitGasUpdated event received for dest chain %d source chain %s",
+ Str("tx hash", raw.TxHash.Hex()).
+ Msgf("UsdPerUnitGasUpdated event received for dest chain: %d, source chain: %s",
destChain, ccipModule.ChainClient.GetNetworkName())
return nil
}
@@ -572,13 +583,14 @@ func (ccipModule *CCIPCommon) WatchForPriceUpdates(ctx context.Context, lggr *ze
tokenUpdateSub.Unsubscribe()
ccipModule.gasUpdateWatcher = nil
ccipModule.gasUpdateWatcherMu = nil
+ ccipModule.GasUpdateEvents = nil
ccipModule.tokenPriceUpdateWatcher = nil
ccipModule.tokenPriceUpdateWatcherMu = nil
}()
for {
select {
case e := <-gasUpdateEventLatest:
- err := processEvent(e.Timestamp, e.DestChain)
+ err := processEvent(e.Value, e.Timestamp, e.DestChain, e.Raw)
if err != nil {
continue
}
@@ -2623,23 +2635,24 @@ func CCIPRequestFromTxHash(txHash common.Hash, chainClient blockchain.EVMClient)
}
type CCIPLane struct {
- Test *testing.T
- Logger *zerolog.Logger
- SourceNetworkName string
- DestNetworkName string
- SourceChain blockchain.EVMClient
- DestChain blockchain.EVMClient
- Source *SourceCCIPModule
- Dest *DestCCIPModule
- NumberOfReq int
- Reports *testreporters.CCIPLaneStats
- Balance *BalanceSheet
- SentReqs map[common.Hash][]CCIPRequest
- TotalFee *big.Int // total fee for all the requests. Used for balance validation.
- ValidationTimeout time.Duration
- Context context.Context
- SrcNetworkLaneCfg *laneconfig.LaneConfig
- DstNetworkLaneCfg *laneconfig.LaneConfig
+ Test *testing.T
+ Logger *zerolog.Logger
+ SourceNetworkName string
+ DestNetworkName string
+ SourceChain blockchain.EVMClient
+ DestChain blockchain.EVMClient
+ Source *SourceCCIPModule
+ Dest *DestCCIPModule
+ NumberOfReq int
+ Reports *testreporters.CCIPLaneStats
+ Balance *BalanceSheet
+ SentReqs map[common.Hash][]CCIPRequest
+ TotalFee *big.Int // total fee for all the requests. Used for balance validation.
+ ValidationTimeout time.Duration
+ Context context.Context
+ SrcNetworkLaneCfg *laneconfig.LaneConfig
+ DstNetworkLaneCfg *laneconfig.LaneConfig
+ PriceReportingDisabled bool
}
func (lane *CCIPLane) TokenPricesConfig() (string, error) {
@@ -3645,7 +3658,7 @@ func (lane *CCIPLane) DeployNewCCIPLane(
jobParams.P2PV2Bootstrappers = []string{p2pBootstrappersCommit.P2PV2Bootstrapper()}
- err = SetOCR2Config(lane.Context, lane.Logger, *testConf, commitNodes, execNodes, *lane.Dest)
+ err = SetOCR2Config(lane.Context, lane.Logger, *testConf, commitNodes, execNodes, *lane.Dest, lane.PriceReportingDisabled)
if err != nil {
return fmt.Errorf("failed to set ocr2 config: %w", err)
}
@@ -3683,6 +3696,7 @@ func SetOCR2Config(
commitNodes,
execNodes []*client.CLNodesWithKeys,
destCCIP DestCCIPModule,
+ priceReportingDisabled bool,
) error {
inflightExpiryExec := commonconfig.MustNewDuration(InflightExpiryExec)
inflightExpiryCommit := commonconfig.MustNewDuration(InflightExpiryCommit)
@@ -3719,6 +3733,7 @@ func SetOCR2Config(
*commonconfig.MustNewDuration(5 * time.Second),
1e6,
*inflightExpiryCommit,
+ priceReportingDisabled,
)
if err != nil {
return fmt.Errorf("failed to create commit offchain config: %w", err)
diff --git a/integration-tests/ccip-tests/contracts/contract_deployer.go b/integration-tests/ccip-tests/contracts/contract_deployer.go
index 57d96e5cb6..043c1d4422 100644
--- a/integration-tests/ccip-tests/contracts/contract_deployer.go
+++ b/integration-tests/ccip-tests/contracts/contract_deployer.go
@@ -1399,7 +1399,8 @@ func NewCommitOffchainConfig(
ExecGasPriceDeviationPPB uint32,
TokenPriceHeartBeat config.Duration,
TokenPriceDeviationPPB uint32,
- InflightCacheExpiry config.Duration) (ccipconfig.OffchainConfig, error) {
+ InflightCacheExpiry config.Duration,
+ priceReportingDisabled bool) (ccipconfig.OffchainConfig, error) {
switch VersionMap[CommitStoreContract] {
case Latest:
return testhelpers.NewCommitOffchainConfig(
@@ -1409,6 +1410,7 @@ func NewCommitOffchainConfig(
TokenPriceHeartBeat,
TokenPriceDeviationPPB,
InflightCacheExpiry,
+ priceReportingDisabled,
), nil
case V1_2_0:
return testhelpers_1_4_0.NewCommitOffchainConfig(
@@ -1418,6 +1420,7 @@ func NewCommitOffchainConfig(
TokenPriceHeartBeat,
TokenPriceDeviationPPB,
InflightCacheExpiry,
+ priceReportingDisabled,
), nil
default:
return nil, fmt.Errorf("version not supported: %s", VersionMap[CommitStoreContract])
diff --git a/integration-tests/ccip-tests/contracts/contract_models.go b/integration-tests/ccip-tests/contracts/contract_models.go
index 0ec55a1e54..7008d51b62 100644
--- a/integration-tests/ccip-tests/contracts/contract_models.go
+++ b/integration-tests/ccip-tests/contracts/contract_models.go
@@ -61,6 +61,15 @@ type Version struct {
semver.Version
}
+// GasUpdateEvent holds the event details of Gas price update
+type GasUpdateEvent struct {
+ Sender string
+ Tx string
+ Value *big.Int
+ DestChain uint64
+ Source string
+}
+
// MustVersion creates a new Version object from a semver string and panics if it fails
func MustVersion(version string) Version {
v := semver.MustParse(version)
diff --git a/integration-tests/ccip-tests/testconfig/README.md b/integration-tests/ccip-tests/testconfig/README.md
index 3f069934c4..c32aee3d91 100644
--- a/integration-tests/ccip-tests/testconfig/README.md
+++ b/integration-tests/ccip-tests/testconfig/README.md
@@ -393,6 +393,9 @@ base_url = "https://grafana..../"
dashboard_url = "/d/6vjVx-1V8/ccip-long-running-tests"
```
+### CCIP.Env.Lane.LeaderLaneEnabled
+Specifies whether to enable the leader lane feature. This setting is only applicable for new deployments.
+
## CCIP.Groups
Specifies the test config specific to each test type. Available test types are:
- **CCIP.Groups.load**
diff --git a/integration-tests/ccip-tests/testconfig/tomls/ccip-default.toml b/integration-tests/ccip-tests/testconfig/tomls/ccip-default.toml
index f62612996c..77dc97f77f 100644
--- a/integration-tests/ccip-tests/testconfig/tomls/ccip-default.toml
+++ b/integration-tests/ccip-tests/testconfig/tomls/ccip-default.toml
@@ -284,6 +284,7 @@ CCIPOwnerTokens = false # if true, the test will use deploy the tokens by the CC
# ['SIMULATED_1', 'SIMULATED_2'], ['SIMULATED_1', 'SIMULATED_3'], ['SIMULATED_2', 'SIMULATED_3']
#MaxNoOfLanes = # maximum number of lanes to be added in the test; mainly used for scalability tests
+
[CCIP.Groups.load]
# uncomment the following with specific values of lane combinations to be tested, if you want to run your tests to run only on these specific network pairs
# if specific network pairs are not mentioned, then all the network pairs will be tested based on values in CCIP.Env.NetworkPairs and CCIP.Groups..NoOfNetworks
diff --git a/integration-tests/ccip-tests/testconfig/tomls/leader-lane.toml b/integration-tests/ccip-tests/testconfig/tomls/leader-lane.toml
new file mode 100644
index 0000000000..76b97ad97b
--- /dev/null
+++ b/integration-tests/ccip-tests/testconfig/tomls/leader-lane.toml
@@ -0,0 +1,4 @@
+[CCIP]
+[CCIP.Groups.smoke]
+NoOfNetworks = 4
+NoOfRoutersPerPair = 2
\ No newline at end of file
diff --git a/integration-tests/ccip-tests/testsetups/ccip.go b/integration-tests/ccip-tests/testsetups/ccip.go
index 27980517d8..3fb25bc675 100644
--- a/integration-tests/ccip-tests/testsetups/ccip.go
+++ b/integration-tests/ccip-tests/testsetups/ccip.go
@@ -71,6 +71,12 @@ type NetworkPair struct {
ChainClientB blockchain.EVMClient
}
+// LeaderLane is to hold the details of leader lane source and destination network
+type LeaderLane struct {
+ source string
+ dest string
+}
+
type CCIPTestConfig struct {
Test *testing.T
EnvInput *testconfig.Common
@@ -80,6 +86,7 @@ type CCIPTestConfig struct {
AllNetworks map[string]blockchain.EVMNetwork
SelectedNetworks []blockchain.EVMNetwork
NetworkPairs []NetworkPair
+ LeaderLanes []LeaderLane
GethResourceProfile map[string]interface{}
}
@@ -322,17 +329,78 @@ func (c *CCIPTestConfig) SetNetworkPairs(lggr zerolog.Logger) error {
c.NetworkPairs = newNetworkPairs
}
+ // setting leader lane details to network pairs if it is enabled and only in simulated environments
+ if !pointer.GetBool(c.TestGroupInput.ExistingDeployment) {
+ c.defineLeaderLanes(lggr)
+ }
for _, n := range c.NetworkPairs {
lggr.Info().
Str("NetworkA", fmt.Sprintf("%s-%d", n.NetworkA.Name, n.NetworkA.ChainID)).
Str("NetworkB", fmt.Sprintf("%s-%d", n.NetworkB.Name, n.NetworkB.ChainID)).
Msg("Network Pairs")
}
+ for _, lane := range c.LeaderLanes {
+ lggr.Info().
+ Str("Source", lane.source).
+ Str("Destination", lane.dest).
+ Msg("Leader Lane: ")
+ }
lggr.Info().Int("Pairs", len(c.NetworkPairs)).Msg("No Of Lanes")
return allError
}
+// defineLeaderLanes goes over the available network pairs and define one leader lane per destination
+func (c *CCIPTestConfig) defineLeaderLanes(lggr zerolog.Logger) {
+ if !isLeaderLaneFeatureEnabled(&lggr) {
+ return
+ }
+ // the way we are defining leader lane is simply by tagging the destination as key along with the first source network
+ // as value to the map.
+ leaderLanes := make(map[string]string)
+ for _, n := range c.NetworkPairs {
+ if _, ok := leaderLanes[n.NetworkB.Name]; !ok {
+ leaderLanes[n.NetworkB.Name] = n.NetworkA.Name
+ }
+ if pointer.GetBool(c.TestGroupInput.BiDirectionalLane) {
+ if _, ok := leaderLanes[n.NetworkA.Name]; !ok {
+ leaderLanes[n.NetworkA.Name] = n.NetworkB.Name
+ }
+ }
+ }
+ for k, v := range leaderLanes {
+ c.LeaderLanes = append(c.LeaderLanes, LeaderLane{
+ source: v,
+ dest: k,
+ })
+ }
+}
+
+// isPriceReportingDisabled checks the given lane is leader lane and return boolean accordingly
+func (c *CCIPTestConfig) isPriceReportingDisabled(lggr *zerolog.Logger, source, dest string) bool {
+ for _, leader := range c.LeaderLanes {
+ if leader.source == source && leader.dest == dest {
+ lggr.Debug().
+ Str("Source", source).
+ Str("Destination", dest).
+ Msg("Non-leader lane")
+ return true
+ }
+ }
+ return false
+}
+
+func isLeaderLaneFeatureEnabled(lggr *zerolog.Logger) bool {
+ if err := contracts.MatchContractVersionsOrAbove(map[contracts.Name]contracts.Version{
+ contracts.OffRampContract: contracts.V1_2_0,
+ contracts.OnRampContract: contracts.V1_2_0,
+ }); err != nil {
+ lggr.Info().Str("Required contract version", contracts.V1_2_0.String()).Msg("Leader lane feature is not enabled")
+ return false
+ }
+ return true
+}
+
func (c *CCIPTestConfig) FormNetworkPairCombinations() {
for i := 0; i < c.TestGroupInput.NoOfNetworks; i++ {
for j := i + 1; j < c.TestGroupInput.NoOfNetworks; j++ {
@@ -635,6 +703,10 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair(
Balance: o.Balance,
Context: testcontext.Get(t),
}
+ // if it non leader lane, disable the price reporting
+ ccipLaneA2B.PriceReportingDisabled = len(o.Cfg.LeaderLanes) > 0 &&
+ !o.Cfg.isPriceReportingDisabled(lggr, ccipLaneA2B.SourceNetworkName, ccipLaneA2B.DestNetworkName)
+
contractsA, ok := o.LaneContractsByNetwork.Load(networkA.Name)
if !ok {
return errors.WithStack(fmt.Errorf("failed to load lane contracts for %s", networkA.Name))
@@ -689,6 +761,9 @@ func (o *CCIPTestSetUpOutputs) AddLanesForNetworkPair(
SrcNetworkLaneCfg: ccipLaneA2B.DstNetworkLaneCfg,
DstNetworkLaneCfg: ccipLaneA2B.SrcNetworkLaneCfg,
}
+ // if it non leader lane, disable the price reporting
+ ccipLaneB2A.PriceReportingDisabled = len(o.Cfg.LeaderLanes) > 0 &&
+ !o.Cfg.isPriceReportingDisabled(lggr, ccipLaneB2A.SourceNetworkName, ccipLaneB2A.DestNetworkName)
b2aLogger := lggr.With().Str("env", namespace).Str("Lane",
fmt.Sprintf("%s-->%s", ccipLaneB2A.SourceNetworkName, ccipLaneB2A.DestNetworkName)).Logger()
ccipLaneB2A.Logger = &b2aLogger
@@ -855,6 +930,63 @@ func (o *CCIPTestSetUpOutputs) WaitForPriceUpdates() {
require.NoError(t, priceUpdateGrp.Wait())
}
+// CheckGasUpdateTransaction checks the gas update transactions count
+func (o *CCIPTestSetUpOutputs) CheckGasUpdateTransaction(lggr *zerolog.Logger) error {
+ transactionsBySource := make(map[string]string)
+ destToSourcesList := make(map[string][]string)
+ // create a map to hold the unique destination with list of sources
+ for _, n := range o.Cfg.NetworkPairs {
+ destToSourcesList[n.NetworkB.Name] = append(destToSourcesList[n.NetworkB.Name], n.NetworkA.Name)
+ if pointer.GetBool(o.Cfg.TestGroupInput.BiDirectionalLane) {
+ destToSourcesList[n.NetworkA.Name] = append(destToSourcesList[n.NetworkA.Name], n.NetworkB.Name)
+ }
+ }
+ lggr.Debug().Interface("list", destToSourcesList).Msg("Dest to Source")
+ // a function to read the gas update events and create a map with unique source and store the tx hash
+ filterGasUpdateEventTxBySource := func(lane *actions.CCIPLane) error {
+ for _, g := range lane.Source.Common.GasUpdateEvents {
+ if g.Value == nil {
+ return fmt.Errorf("gas update value should not be nil in tx %s", g.Tx)
+ }
+ if _, ok := transactionsBySource[g.Source]; !ok {
+ transactionsBySource[g.Source] = g.Tx
+ }
+ }
+ return nil
+ }
+
+ for _, lane := range o.ReadLanes() {
+ if err := filterGasUpdateEventTxBySource(lane.ForwardLane); err != nil {
+ return fmt.Errorf("error in filtering gas update transactions in the lane source: %s and destination: %s, error: %w",
+ lane.ForwardLane.SourceNetworkName, lane.ForwardLane.DestNetworkName, err)
+ }
+ if lane.ReverseLane != nil {
+ if err := filterGasUpdateEventTxBySource(lane.ReverseLane); err != nil {
+ return fmt.Errorf("error in filtering gas update transactions in the lane source: %s and destination: %s, error: %w",
+ lane.ReverseLane.SourceNetworkName, lane.ReverseLane.DestNetworkName, err)
+ }
+ }
+ }
+
+ lggr.Debug().Interface("Tx hashes by source", transactionsBySource).Msg("Checked Gas Update Transactions by Source")
+ // when leader lane setup is enabled, number of unique transaction from the source
+ // should match the number of leader lanes defined.
+ if len(transactionsBySource) != len(o.Cfg.LeaderLanes) {
+ lggr.Error().
+ Int("Tx hashes expected", len(o.Cfg.LeaderLanes)).
+ Int("Tx hashes received", len(transactionsBySource)).
+ Int("Leader lanes count", len(o.Cfg.LeaderLanes)).
+ Msg("Checked Gas Update transactions count doesn't match")
+ return fmt.Errorf("checked Gas Update transactions count doesn't match")
+ }
+ lggr.Debug().
+ Int("Tx hashes by source", len(transactionsBySource)).
+ Int("Leader lanes count", len(o.Cfg.LeaderLanes)).
+ Msg("Checked Gas Update transactions count matches")
+
+ return nil
+}
+
// CCIPDefaultTestSetUp sets up the environment for CCIP tests
// if configureCLNode is set as false, it assumes:
// 1. contracts are already deployed on live networks
@@ -1057,6 +1189,9 @@ func CCIPDefaultTestSetUp(
require.NoError(t, setUpArgs.JobAddGrp.Wait(), "Creating jobs shouldn't fail")
// wait for price updates to be available
setUpArgs.WaitForPriceUpdates()
+ if isLeaderLaneFeatureEnabled(lggr) && !pointer.GetBool(setUpArgs.Cfg.TestGroupInput.ExistingDeployment) {
+ require.NoError(t, setUpArgs.CheckGasUpdateTransaction(lggr), "gas update transaction check shouldn't fail")
+ }
// if dynamic price update is required
if setUpArgs.Cfg.TestGroupInput.TokenConfig.IsDynamicPriceUpdate() {
require.NoError(t, setUpArgs.SetupDynamicTokenPriceUpdates(), "setting up dynamic price update should not fail")